unipdf/model/optimize/optimize.go

99 lines
34 KiB
Go
Raw Normal View History

2020-08-27 21:45:09 +00:00
//
// Copyright 2020 FoxyUtils ehf. All rights reserved.
//
// This is a commercial product and requires a license to operate.
// A trial license can be obtained at https://unidoc.io
//
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
//
// Use of this source code is governed by the UniDoc End User License Agreement
// terms that can be accessed at https://unidoc.io/eula/
2020-11-23 22:15:56 +00:00
package optimize ;import (_cfd "bytes";_ac "crypto/md5";_gf "errors";_a "fmt";_ga "github.com/unidoc/unipdf/v3/common";_df "github.com/unidoc/unipdf/v3/contentstream";_d "github.com/unidoc/unipdf/v3/core";_g "github.com/unidoc/unipdf/v3/extractor";_cf "github.com/unidoc/unipdf/v3/internal/textencoding";_da "github.com/unidoc/unipdf/v3/model";_b "github.com/unidoc/unitype";_f "golang.org/x/image/draw";_ca "image";_cc "math";);
// ObjectStreams groups PDF objects to object streams.
// It implements interface model.Optimizer.
type ObjectStreams struct{};type imageInfo struct{ColorSpace _d .PdfObjectName ;BitsPerComponent int ;ColorComponents int ;Width int ;Height int ;Stream *_d .PdfObjectStream ;PPI float64 ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_ba *CleanFonts )Optimize (objects []_d .PdfObject )(_eaf []_d .PdfObject ,_aeg error ){var _de map[*_d .PdfObjectStream ]struct{};if _ba .Subset {var _ggb error ;_de ,_ggb =_gd (objects );if _ggb !=nil {return nil ,_ggb ;};};for _ ,_bebd :=range objects {_abef ,_afbd :=_d .GetStream (_bebd );if !_afbd {continue ;};if _ ,_feg :=_de [_abef ];_feg {continue ;};_dea ,_bcg :=_d .NewEncoderFromStream (_abef );if _bcg !=nil {_ga .Log .Debug ("\u0045\u0052RO\u0052\u0020\u0067e\u0074\u0074\u0069\u006eg e\u006eco\u0064\u0065\u0072\u003a\u0020\u0025\u0076 -\u0020\u0069\u0067\u006e\u006f\u0072\u0069n\u0067",_bcg );continue ;};_efe ,_bcg :=_dea .DecodeStream (_abef );if _bcg !=nil {_ga .Log .Debug ("\u0044\u0065\u0063\u006f\u0064\u0069\u006e\u0067\u0020\u0065r\u0072\u006f\u0072\u0020\u003a\u0020\u0025v\u0020\u002d\u0020\u0069\u0067\u006e\u006f\u0072\u0069\u006e\u0067",_bcg );continue ;};if len (_efe )< 4{continue ;};_bag :=string (_efe [:4]);if _bag =="\u004f\u0054\u0054\u004f"{continue ;};if _bag !="\u0000\u0001\u0000\u0000"&&_bag !="\u0074\u0072\u0075\u0065"{continue ;};_abff ,_bcg :=_b .Parse (_cfd .NewReader (_efe ));if _bcg !=nil {_ga .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u0020P\u0061\u0072\u0073\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076\u0020\u002d\u0020\u0069\u0067\u006eo\u0072\u0069\u006e\u0067",_bcg );continue ;};_bcg =_abff .Optimize ();if _bcg !=nil {continue ;};var _dcc _cfd .Buffer ;_bcg =_abff .Write (&_dcc );if _bcg !=nil {_ga .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u0020W\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076\u0020\u002d\u0020\u0069\u0067\u006eo\u0072\u0069\u006e\u0067",_bcg );continue ;};if _dcc .Len ()> len (_efe ){_ga .Log .Debug ("\u0052\u0065-\u0077\u0072\u0069\u0074\u0074\u0065\u006e\u0020\u0066\u006f\u006e\u0074\u0020\u0069\u0073\u0020\u006c\u0061\u0072\u0067\u0065\u0072\u0020\u0074\u0068\u0061\u006e\u0020\u006f\u0072\u0069\u0067\u0069\u006e\u0061\u006c\u0020\u002d\u0020\u0073\u006b\u0069\u0070");continue ;};_deaa ,_bcg :=_d .MakeStream (_dcc .Bytes (),_d .NewFlateEncoder ());if _bcg !=nil {continue ;};*_abef =*_deaa ;_abef .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_d .MakeInteger (int64 (_dcc .Len ())));};return objects ,nil ;};
2020-10-19 10:58:10 +00:00
2020-11-11 18:48:37 +00:00
// CleanContentstream cleans up redundant operands in content streams, including Page and XObject Form
// contents. This process includes:
// 1. Marked content operators are removed.
// 2. Some operands are simplified (shorter form).
// TODO: Add more reduction methods and improving the methods for identifying unnecessary operands.
2020-11-23 22:15:56 +00:00
type CleanContentstream struct{};func _adgd (_dae []_d .PdfObject )[]*imageInfo {_eaff :=_d .PdfObjectName ("\u0053u\u0062\u0074\u0079\u0070\u0065");_fab :=make (map[*_d .PdfObjectStream ]struct{});var _cfcd error ;var _agdf []*imageInfo ;for _ ,_gffd :=range _dae {_dcgf ,_adda :=_d .GetStream (_gffd );if !_adda {continue ;};if _ ,_ffd :=_fab [_dcgf ];_ffd {continue ;};_fab [_dcgf ]=struct{}{};_efg :=_dcgf .PdfObjectDictionary .Get (_eaff );_cge ,_adda :=_d .GetName (_efg );if !_adda ||string (*_cge )!="\u0049\u006d\u0061g\u0065"{continue ;};_egd :=&imageInfo {BitsPerComponent :8,Stream :_dcgf };if _egd .ColorSpace ,_cfcd =_da .DetermineColorspaceNameFromPdfObject (_dcgf .PdfObjectDictionary .Get ("\u0043\u006f\u006c\u006f\u0072\u0053\u0070\u0061\u0063\u0065"));_cfcd !=nil {_ga .Log .Error ("\u0045\u0072\u0072\u006f\u0072\u0020\u0064\u0065\u0074\u0065r\u006d\u0069\u006e\u0065\u0020\u0063\u006fl\u006f\u0072\u0020\u0073\u0070\u0061\u0063\u0065\u0020\u0025\u0073",_cfcd );continue ;};if _gaef ,_fbd :=_d .GetIntVal (_dcgf .PdfObjectDictionary .Get ("\u0042\u0069t\u0073\u0050\u0065r\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074"));_fbd {_egd .BitsPerComponent =_gaef ;};if _ceb ,_dgf :=_d .GetIntVal (_dcgf .PdfObjectDictionary .Get ("\u0057\u0069\u0064t\u0068"));_dgf {_egd .Width =_ceb ;};if _gfbe ,_ffdc :=_d .GetIntVal (_dcgf .PdfObjectDictionary .Get ("\u0048\u0065\u0069\u0067\u0068\u0074"));_ffdc {_egd .Height =_gfbe ;};switch _egd .ColorSpace {case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_egd .ColorComponents =3;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_egd .ColorComponents =1;default:_ga .Log .Warning ("\u004f\u0070\u0074\u0069\u006d\u0069\u007a\u0061t\u0069\u006f\u006e i\u0073\u0020\u006e\u006f\u0074\u0020s\u0075\u0070\u0070\u006f\u0072\u0074\u0065\u0064\u0020\u0066\u006f\u0072\u0020\u0063\u006fl\u006f\u0072\u0020\u0073\u0070\u0061\u0063\u0065 \u0025\u0073",_egd .ColorSpace );continue ;};_agdf =append (_agdf ,_egd );};return _agdf ;};func _fafc (_dagb []_d .PdfObject ){for _addc ,_dga :=range _dagb {switch _ddb :=_dga .(type ){case *_d .PdfIndirectObject :_ddb .ObjectNumber =int64 (_addc +1);_ddb .GenerationNumber =0;case *_d .PdfObjectStream :_ddb .ObjectNumber =int64 (_addc +1);_ddb .GenerationNumber =0;case *_d .PdfObjectStreams :_ddb .ObjectNumber =int64 (_addc +1);_ddb .GenerationNumber =0;};};};func _ee (_cfa *_df .ContentStreamOperations )*_df .ContentStreamOperations {if _cfa ==nil {return nil ;};_fa :=_df .ContentStreamOperations {};for _ ,_fd :=range *_cfa {switch _fd .Operand {case "\u0042\u0044\u0043","\u0042\u004d\u0043","\u0045\u004d\u0043":continue ;case "\u0054\u006d":if len (_fd .Params )==6{if _bg ,_gge :=_d .GetNumbersAsFloat (_fd .Params );_gge ==nil {if _bg [0]==1&&_bg [1]==0&&_bg [2]==0&&_bg [3]==1{_fd =&_df .ContentStreamOperation {Params :[]_d .PdfObject {_fd .Params [4],_fd .Params [5]},Operand :"\u0054\u0064"};};};};};_fa =append (_fa ,_fd );};return &_fa ;};func _bb (_ge *_d .PdfObjectStream )error {_acc ,_fc :=_d .DecodeStream (_ge );if _fc !=nil {return _fc ;};_ae :=_df .NewContentStreamParser (string (_acc ));_dd ,_fc :=_ae .Parse ();if _fc !=nil {return _fc ;};_dd =_ee (_dd );_bbe :=_dd .Bytes ();if len (_bbe )>=len (_acc ){return nil ;};_gff ,_fc :=_d .MakeStream (_dd .Bytes (),_d .NewFlateEncoder ());if _fc !=nil {return _fc ;};_ge .Stream =_gff .Stream ;_ge .Merge (_gff .PdfObjectDictionary );return nil ;};
2020-10-05 19:28:24 +00:00
// Optimize optimizes PDF objects to decrease PDF size.
2020-11-23 22:15:56 +00:00
func (_cgee *Image )Optimize (objects []_d .PdfObject )(_dbaa []_d .PdfObject ,_bbd error ){if _cgee .ImageQuality <=0{return objects ,nil ;};_bbg :=_adgd (objects );if len (_bbg )==0{return objects ,nil ;};_agdb :=make (map[_d .PdfObject ]_d .PdfObject );_fed :=make (map[_d .PdfObject ]struct{});for _ ,_cegc :=range _bbg {_gda :=_cegc .Stream .PdfObjectDictionary .Get (_d .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_fed [_gda ]=struct{}{};};for _bbec ,_deeb :=range _bbg {_dcf :=_deeb .Stream ;if _ ,_ecf :=_fed [_dcf ];_ecf {continue ;};_fec ,_dabb :=_d .NewEncoderFromStream (_dcf );if _dabb !=nil {_ga .Log .Warning ("\u0045\u0072\u0072\u006f\u0072 \u0067\u0065\u0074\u0020\u0065\u006e\u0063\u006f\u0064\u0065\u0072\u0020\u0066o\u0072\u0020\u0074\u0068\u0065\u0020\u0069\u006d\u0061\u0067\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006d\u0020\u0025\u0073");continue ;};_ggecb ,_dabb :=_fec .DecodeStream (_dcf );if _dabb !=nil {_ga .Log .Warning ("\u0045\u0072\u0072\u006f\u0072\u0020\u0064\u0065\u0063\u006f\u0064\u0065\u0020\u0074\u0068e\u0020i\u006d\u0061\u0067\u0065\u0020\u0073\u0074\u0072\u0065\u0061\u006d\u0020\u0025\u0073");continue ;};_fdc :=_d .NewDCTEncoder ();_fdc .ColorComponents =_deeb .ColorComponents ;_fdc .Quality =_cgee .ImageQuality ;_fdc .BitsPerComponent =_deeb .BitsPerComponent ;_fdc .Width =_deeb .Width ;_fdc .Height =_deeb .Height ;_dfg ,_dabb :=_fdc .EncodeBytes (_ggecb );if _dabb !=nil {_ga .Log .Debug ("\u0045R\u0052\u004f\u0052\u003a\u0020\u0025v",_dabb );return nil ,_dabb ;};var _egb _d .StreamEncoder ;_egb =_fdc ;{_egfg :=_d .NewFlateEncoder ();_daa :=_d .NewMultiEncoder ();_daa .AddEncoder (_egfg );_daa .AddEncoder (_fdc );_abeb ,_edf :=_daa .EncodeBytes (_ggecb );if _edf !=nil {return nil ,_edf ;};if len (_abeb )< len (_dfg ){_ga .Log .Debug ("\u004d\u0075\u006c\u0074\u0069\u0020\u0065\u006e\u0063\u0020\u0069\u006d\u0070\u0072\u006f\u0076\u0065\u0073\u003a\u0020\u0025\u0064\u0020\u0074o\u0020\u0025\u0064\u0020\u0028o\u0072\u0069g\u0020\u0025\u0064\u0029",len (_dfg ),len (_abeb ),len (_dcf .Stream ));_dfg =_abeb ;_egb =_daa ;};};_ebc :=len (_dcf .Stream );if _ebc < len (_dfg ){continue ;};_gfa :=&_d .PdfObjectStream {Stream :_dfg };_gfa .PdfObjectReference =_dcf .PdfObjectReference ;_gfa .PdfObjectDictionary =_d .MakeDict ();_gfa .Merge (_dcf .PdfObjectDictionary );_gfa .Merge (_egb .MakeStreamDict ());_gfa .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_d .MakeInteger (int64 (len (_dfg ))));_agdb [_dcf ]=_gfa ;_bbg [_bbec ].Stream =_gfa ;};_dbaa =make ([]_d .PdfObject ,len (objects ));copy (_dbaa ,objects );_ccdb (_dbaa ,_agdb );return _dbaa ,nil ;};
2020-10-05 19:28:24 +00:00
// Optimize optimizes PDF objects to decrease PDF size.
2020-11-23 22:15:56 +00:00
func (_acgd *CompressStreams )Optimize (objects []_d .PdfObject )(_bad []_d .PdfObject ,_fbb error ){_bad =make ([]_d .PdfObject ,len (objects ));copy (_bad ,objects );for _ ,_fgb :=range objects {_fef ,_badb :=_d .GetStream (_fgb );if !_badb {continue ;};if _eb :=_fef .Get ("\u0046\u0069\u006c\u0074\u0065\u0072");_eb !=nil {if _ ,_bdf :=_d .GetName (_eb );_bdf {continue ;};if _ded ,_dde :=_d .GetArray (_eb );_dde &&_ded .Len ()> 0{continue ;};};_gce :=_d .NewFlateEncoder ();var _bdg []byte ;_bdg ,_fbb =_gce .EncodeBytes (_fef .Stream );if _fbb !=nil {return _bad ,_fbb ;};_cbf :=_gce .MakeStreamDict ();if len (_bdg )+len (_cbf .WriteString ())< len (_fef .Stream ){_fef .Stream =_bdg ;_fef .PdfObjectDictionary .Merge (_cbf );_fef .PdfObjectDictionary .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_d .MakeInteger (int64 (len (_fef .Stream ))));};};return _bad ,nil ;};func _ccdb (_ceacd []_d .PdfObject ,_adc map[_d .PdfObject ]_d .PdfObject ){if len (_adc )==0{return ;};for _gcfg ,_bcgc :=range _ceacd {if _gfc ,_acab :=_adc [_bcgc ];_acab {_ceacd [_gcfg ]=_gfc ;continue ;};_adc [_bcgc ]=_bcgc ;switch _bcfe :=_bcgc .(type ){case *_d .PdfObjectArray :_aec :=make ([]_d .PdfObject ,_bcfe .Len ());copy (_aec ,_bcfe .Elements ());_ccdb (_aec ,_adc );for _gad ,_dcda :=range _aec {_bcfe .Set (_gad ,_dcda );};case *_d .PdfObjectStreams :_ccdb (_bcfe .Elements (),_adc );case *_d .PdfObjectStream :_baead :=[]_d .PdfObject {_bcfe .PdfObjectDictionary };_ccdb (_baead ,_adc );_bcfe .PdfObjectDictionary =_baead [0].(*_d .PdfObjectDictionary );case *_d .PdfObjectDictionary :_edb :=_bcfe .Keys ();_gdfd :=make ([]_d .PdfObject ,len (_edb ));for _bed ,_dca :=range _edb {_gdfd [_bed ]=_bcfe .Get (_dca );};_ccdb (_gdfd ,_adc );for _cdcb ,_bfdg :=range _edb {_bcfe .Set (_bfdg ,_gdfd [_cdcb ]);};case *_d .PdfIndirectObject :_bfgdc :=[]_d .PdfObject {_bcfe .PdfObject };_ccdb (_bfgdc ,_adc );_bcfe .PdfObject =_bfgdc [0];};};};func _acdd (_fb _d .PdfObject )[]content {if _fb ==nil {return nil ;};_gec ,_gagg :=_d .GetArray (_fb );if !_gagg {_ga .Log .Debug ("\u0041\u006e\u006e\u006fts\u0020\u006e\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");return nil ;};var _dcd []content ;for _ ,_aeff :=range _gec .Elements (){_cfc ,_eec :=_d .GetDict (_aeff );if !_eec {_ga .Log .Debug ("I\u0067\u006e\u006f\u0072\u0069\u006eg\u0020\u006e\u006f\u006e\u002d\u0064i\u0063\u0074\u0020\u0065\u006c\u0065\u006de\u006e\u0074\u0020\u0069\u006e\u0020\u0041\u006e\u006e\u006ft\u0073");continue ;};_ecc ,_eec :=_d .GetDict (_cfc .Get ("\u0041\u0050"));if !_eec {_ga .Log .Debug ("\u004e\u006f\u0020\u0041P \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_bbab :=_d .TraceToDirectObject (_ecc .Get ("\u004e"));if _bbab ==nil {_ga .Log .Debug ("N\u006f\u0020\u004e\u0020en\u0074r\u0079\u0020\u002d\u0020\u0073k\u0069\u0070\u0070\u0069\u006e\u0067");continue ;};var _gggabg *_d .PdfObjectStream ;switch _ffb :=_bbab .(type ){case *_d .PdfObjectDictionary :_dba ,_bbf :=_d .GetName (_cfc .Get ("\u0041\u0053"));if !_bbf {_ga .Log .Debug ("\u004e\u006f\u0020\u0041S \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_gggabg ,_bbf =_d .GetStream (_ffb .Get (*_dba ));if !_bbf {_ga .Log .Debug ("\u0046o\u0072\u006d\u0020\u006eo\u0074\u0020\u0066\u006f\u0075n\u0064 \u002d \u0073\u006b\u0069\u0070\u0070\u0069\u006eg");continue ;};case *_d .PdfObjectStream :_gggabg =_ffb ;};if _gggabg ==nil {_ga .Log .Debug ("\u0046\u006f\u0072m\u0020\u006e\u006f\u0074 \u0066\u006f\u0075\u006e\u0064\u0020\u0028n\u0069\u006c\u0029\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067");continue ;};_gcd ,_gagga :=_da .NewXObjectFormFromStream (_gggabg );if _gagga !=nil {_ga .Log .Debug ("\u0045\u0072\u0072\u006f\u0072\u0020l\u006f\u0061\u0064\u0069\u006e\u0067\u0020\u0066\u006f\u0072\u006d\u003a\u0020%\u0076\u0020\u002d\u0020\u0069\u0067\u006eo\u0072\u0069\u006e\u0067",_gagga );continue ;};_aeeg ,_gagga :=_gcd .GetContentStream ();if _gagga !=nil {_ga .Log .Debug ("E\u0072\u0
2020-10-05 19:28:24 +00:00
2020-11-23 22:15:56 +00:00
// Optimize optimizes PDF objects to decrease PDF size.
func (_gc *CleanContentstream )Optimize (objects []_d .PdfObject )(_fcf []_d .PdfObject ,_bba error ){_ggg :=map[*_d .PdfObjectStream ]struct{}{};var _cb []*_d .PdfObjectStream ;_dc :=func (_ace *_d .PdfObjectStream ){if _ ,_ef :=_ggg [_ace ];!_ef {_ggg [_ace ]=struct{}{};_cb =append (_cb ,_ace );};};for _ ,_bea :=range objects {switch _beb :=_bea .(type ){case *_d .PdfIndirectObject :switch _beba :=_beb .PdfObject .(type ){case *_d .PdfObjectDictionary :if _faa ,_ddd :=_d .GetName (_beba .Get ("\u0054\u0079\u0070\u0065"));!_ddd ||_faa .String ()!="\u0050\u0061\u0067\u0065"{continue ;};if _cg ,_ea :=_d .GetStream (_beba .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_ea {_dc (_cg );}else if _ag ,_fdb :=_d .GetArray (_beba .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_fdb {for _ ,_bd :=range _ag .Elements (){if _db ,_beg :=_d .GetStream (_bd );_beg {_dc (_db );};};};};case *_d .PdfObjectStream :if _ab ,_ggga :=_d .GetName (_beb .Get ("\u0054\u0079\u0070\u0065"));!_ggga ||_ab .String ()!="\u0058O\u0062\u006a\u0065\u0063\u0074"{continue ;};if _eeg ,_fdd :=_d .GetName (_beb .Get ("\u0053u\u0062\u0074\u0079\u0070\u0065"));!_fdd ||_eeg .String ()!="\u0046\u006f\u0072\u006d"{continue ;};_dc (_beb );};};for _ ,_begg :=range _cb {_bba =_bb (_begg );if _bba !=nil {return nil ,_bba ;};};return objects ,nil ;};
2020-08-27 21:45:09 +00:00
2020-11-11 18:48:37 +00:00
// Append appends optimizers to the chain.
2020-11-23 22:15:56 +00:00
func (_af *Chain )Append (optimizers ..._da .Optimizer ){_af ._bf =append (_af ._bf ,optimizers ...)};
2020-08-27 21:45:09 +00:00
2020-10-12 14:17:59 +00:00
// Optimize optimizes PDF objects to decrease PDF size.
2020-11-23 22:15:56 +00:00
func (_edgcg *ObjectStreams )Optimize (objects []_d .PdfObject )(_ecca []_d .PdfObject ,_acb error ){_fgc :=&_d .PdfObjectStreams {};_cff :=make ([]_d .PdfObject ,0,len (objects ));for _ ,_bfbc :=range objects {if _ffge ,_geda :=_bfbc .(*_d .PdfIndirectObject );_geda &&_ffge .GenerationNumber ==0{_fgc .Append (_bfbc );}else {_cff =append (_cff ,_bfbc );};};if _fgc .Len ()==0{return _cff ,nil ;};_ecca =make ([]_d .PdfObject ,0,len (_cff )+_fgc .Len ()+1);if _fgc .Len ()> 1{_ecca =append (_ecca ,_fgc );};_ecca =append (_ecca ,_fgc .Elements ()...);_ecca =append (_ecca ,_cff ...);return _ecca ,nil ;};
2020-08-27 21:45:09 +00:00
2020-09-28 23:18:17 +00:00
// Optimize optimizes PDF objects to decrease PDF size.
2020-11-23 22:15:56 +00:00
func (_e *Chain )Optimize (objects []_d .PdfObject )(_be []_d .PdfObject ,_gg error ){_be =objects ;for _ ,_dg :=range _e ._bf {_be ,_gg =_dg .Optimize (_be );if _gg !=nil {return _be ,_gg ;};};return _be ,nil ;};
2020-08-27 21:45:09 +00:00
2020-10-19 10:58:10 +00:00
// Optimize optimizes PDF objects to decrease PDF size.
2020-11-23 22:15:56 +00:00
func (_ega *CombineIdenticalIndirectObjects )Optimize (objects []_d .PdfObject )(_gfb []_d .PdfObject ,_fae error ){_fafc (objects );_ceg :=make (map[_d .PdfObject ]_d .PdfObject );_ccc :=make (map[_d .PdfObject ]struct{});_cfcc :=make (map[string ][]*_d .PdfIndirectObject );for _ ,_abdf :=range objects {_cbc ,_dff :=_abdf .(*_d .PdfIndirectObject );if !_dff {continue ;};if _ged ,_cfcf :=_cbc .PdfObject .(*_d .PdfObjectDictionary );_cfcf {if _fcdd ,_afdf :=_ged .Get ("\u0054\u0079\u0070\u0065").(*_d .PdfObjectName );_afdf &&*_fcdd =="\u0050\u0061\u0067\u0065"{continue ;};_egf :=_ac .New ();_egf .Write ([]byte (_ged .WriteString ()));_cede :=string (_egf .Sum (nil ));_cfcc [_cede ]=append (_cfcc [_cede ],_cbc );};};for _ ,_acg :=range _cfcc {if len (_acg )< 2{continue ;};_ccec :=_acg [0];for _fga :=1;_fga < len (_acg );_fga ++{_fgg :=_acg [_fga ];_ceg [_fgg ]=_ccec ;_ccc [_fgg ]=struct{}{};};};_gfb =make ([]_d .PdfObject ,0,len (objects )-len (_ccc ));for _ ,_fggf :=range objects {if _ ,_cfg :=_ccc [_fggf ];_cfg {continue ;};_gfb =append (_gfb ,_fggf );};_ccdb (_gfb ,_ceg );return _gfb ,nil ;};
2020-10-12 14:17:59 +00:00
2020-11-23 22:15:56 +00:00
// ImagePPI optimizes images by scaling images such that the PPI (pixels per inch) is never higher than ImageUpperPPI.
2020-10-19 10:58:10 +00:00
// TODO(a5i): Add support for inline images.
// It implements interface model.Optimizer.
2020-11-23 22:15:56 +00:00
type ImagePPI struct{ImageUpperPPI float64 ;};
2020-08-27 21:45:09 +00:00
2020-11-11 18:48:37 +00:00
// Optimize optimizes PDF objects to decrease PDF size.
2020-11-23 22:15:56 +00:00
func (_cfeg *ImagePPI )Optimize (objects []_d .PdfObject )(_fecb []_d .PdfObject ,_bfaa error ){if _cfeg .ImageUpperPPI <=0{return objects ,nil ;};_ecfg :=_adgd (objects );if len (_ecfg )==0{return objects ,nil ;};_cac :=make (map[_d .PdfObject ]struct{});for _ ,_gggf :=range _ecfg {_cgea :=_gggf .Stream .PdfObjectDictionary .Get (_d .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_cac [_cgea ]=struct{}{};};_dag :=make (map[*_d .PdfObjectStream ]*imageInfo );for _ ,_cca :=range _ecfg {_dag [_cca .Stream ]=_cca ;};var _fecbf *_d .PdfObjectDictionary ;for _ ,_ead :=range objects {if _fdf ,_dcff :=_d .GetDict (_ead );_fecbf ==nil &&_dcff {if _ggfc ,_bdfa :=_d .GetName (_fdf .Get (_d .PdfObjectName ("\u0054\u0079\u0070\u0065")));_bdfa &&*_ggfc =="\u0043a\u0074\u0061\u006c\u006f\u0067"{_fecbf =_fdf ;};};};if _fecbf ==nil {return objects ,nil ;};_abfge ,_gagf :=_d .GetDict (_fecbf .Get (_d .PdfObjectName ("\u0050\u0061\u0067e\u0073")));if !_gagf {return objects ,nil ;};_ccgc ,_dgd :=_d .GetArray (_abfge .Get (_d .PdfObjectName ("\u004b\u0069\u0064\u0073")));if !_dgd {return objects ,nil ;};_ggfe :=make (map[string ]*imageInfo );for _ ,_gcf :=range _ccgc .Elements (){_cbda ,_aeffe :=_d .GetDict (_gcf );if !_aeffe {continue ;};_ccef ,_dbc :=_d .GetArray (_cbda .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));if !_dbc {continue ;};_cdgb ,_fbdd :=_d .GetDict (_cbda .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_fbdd {continue ;};_dce ,_acge :=_d .GetDict (_cdgb .Get ("\u0058O\u0062\u006a\u0065\u0063\u0074"));if !_acge {continue ;};_geca :=_dce .Keys ();for _ ,_ebf :=range _geca {if _bfgd ,_gffg :=_d .GetStream (_dce .Get (_ebf ));_gffg {if _gcgc ,_ede :=_dag [_bfgd ];_ede {_ggfe [string (_ebf )]=_gcgc ;};};};for _ ,_gee :=range _ccef .Elements (){if _ece ,_acdc :=_d .GetStream (_gee );_acdc {_bab ,_dad :=_d .NewEncoderFromStream (_ece );if _dad !=nil {return nil ,_dad ;};_cfcg ,_dad :=_bab .DecodeStream (_ece );if _dad !=nil {return nil ,_dad ;};_eacg :=_df .NewContentStreamParser (string (_cfcg ));_gfe ,_dad :=_eacg .Parse ();if _dad !=nil {return nil ,_dad ;};_bcgf ,_faff :=1.0,1.0;for _ ,_eba :=range *_gfe {if _eba .Operand =="\u0051"{_bcgf ,_faff =1.0,1.0;};if _eba .Operand =="\u0063\u006d"&&len (_eba .Params )==6{if _fbdde ,_ffg :=_d .GetFloatVal (_eba .Params [0]);_ffg {_bcgf =_bcgf *_fbdde ;};if _fac ,_bece :=_d .GetFloatVal (_eba .Params [3]);_bece {_faff =_faff *_fac ;};if _baea ,_ebcb :=_d .GetIntVal (_eba .Params [0]);_ebcb {_bcgf =_bcgf *float64 (_baea );};if _fadf ,_cfbg :=_d .GetIntVal (_eba .Params [3]);_cfbg {_faff =_faff *float64 (_fadf );};};if _eba .Operand =="\u0044\u006f"&&len (_eba .Params )==1{_gacd ,_eed :=_d .GetName (_eba .Params [0]);if !_eed {continue ;};if _efc ,_age :=_ggfe [string (*_gacd )];_age {_baad ,_bdb :=_bcgf /72.0,_faff /72.0;_gfaf ,_gb :=float64 (_efc .Width )/_baad ,float64 (_efc .Height )/_bdb ;if _baad ==0||_bdb ==0{_gfaf =72.0;_gb =72.0;};_efc .PPI =_cc .Max (_efc .PPI ,_gfaf );_efc .PPI =_cc .Max (_efc .PPI ,_gb );};};};};};};for _ ,_afbc :=range _ecfg {if _ ,_ffbf :=_cac [_afbc .Stream ];_ffbf {continue ;};if _afbc .PPI <=_cfeg .ImageUpperPPI {continue ;};_cedf :=_cfeg .ImageUpperPPI /_afbc .PPI ;if _bbga :=_cfgd (_afbc .Stream ,_cedf );_bbga !=nil {_ga .Log .Debug ("\u0045\u0072\u0072\u006f\u0072 \u0073\u0063\u0061\u006c\u0065\u0020\u0069\u006d\u0061\u0067\u0065\u0020\u006be\u0065\u0070\u0020\u006f\u0072\u0069\u0067\u0069\u006e\u0061\u006c\u0020\u0069\u006d\u0061\u0067\u0065\u003a\u0020\u0025\u0073",_bbga );}else {if _ebe ,_ggba :=_d .GetStream (_afbc .Stream .PdfObjectDictionary .Get (_d .PdfObjectName ("\u0053\u004d\u0061s\u006b")));_ggba {if _eagb :=_cfgd (_ebe ,_cedf );_eagb !=nil {return nil ,_eagb ;};};};};return objects ,nil ;};
2020-09-28 23:18:17 +00:00
2020-11-23 22:15:56 +00:00
// Chain allows to use sequence of optimizers.
2020-10-05 19:28:24 +00:00
// It implements interface model.Optimizer.
2020-11-23 22:15:56 +00:00
type Chain struct{_bf []_da .Optimizer };
2020-09-28 23:18:17 +00:00
2020-11-23 22:15:56 +00:00
// New creates a optimizers chain from options.
func New (options Options )*Chain {_fcg :=new (Chain );if options .CleanFonts ||options .SubsetFonts {_fcg .Append (&CleanFonts {Subset :options .SubsetFonts });};if options .CleanContentstream {_fcg .Append (new (CleanContentstream ));};if options .ImageUpperPPI > 0{_fbf :=new (ImagePPI );_fbf .ImageUpperPPI =options .ImageUpperPPI ;_fcg .Append (_fbf );};if options .ImageQuality > 0{_bac :=new (Image );_bac .ImageQuality =options .ImageQuality ;_fcg .Append (_bac );};if options .CombineDuplicateDirectObjects {_fcg .Append (new (CombineDuplicateDirectObjects ));};if options .CombineDuplicateStreams {_fcg .Append (new (CombineDuplicateStreams ));};if options .CombineIdenticalIndirectObjects {_fcg .Append (new (CombineIdenticalIndirectObjects ));};if options .UseObjectStreams {_fcg .Append (new (ObjectStreams ));};if options .CompressStreams {_fcg .Append (new (CompressStreams ));};return _fcg ;};func _faag (_aad _d .PdfObject )(_ebb string ,_abebg []_d .PdfObject ){var _dgec _cfd .Buffer ;switch _dgb :=_aad .(type ){case *_d .PdfIndirectObject :_abebg =append (_abebg ,_dgb );_aad =_dgb .PdfObject ;};switch _gdab :=_aad .(type ){case *_d .PdfObjectStream :if _ecga ,_efcc :=_d .DecodeStream (_gdab );_efcc ==nil {_dgec .Write (_ecga );_abebg =append (_abebg ,_gdab );};case *_d .PdfObjectArray :for _ ,_cdcg :=range _gdab .Elements (){switch _eacgc :=_cdcg .(type ){case *_d .PdfObjectStream :if _eee ,_gbf :=_d .DecodeStream (_eacgc );_gbf ==nil {_dgec .Write (_eee );_abebg =append (_abebg ,_eacgc );};};};};return _dgec .String (),_abebg ;};
// CombineIdenticalIndirectObjects combines identical indirect objects.
// It implements interface model.Optimizer.
type CombineIdenticalIndirectObjects struct{};
2020-09-21 01:20:10 +00:00
2020-11-11 18:48:37 +00:00
// CombineDuplicateDirectObjects combines duplicated direct objects by its data hash.
2020-09-21 01:20:10 +00:00
// It implements interface model.Optimizer.
2020-11-11 18:48:37 +00:00
type CombineDuplicateDirectObjects struct{};
2020-09-14 09:32:45 +00:00
2020-11-23 22:15:56 +00:00
// Options describes PDF optimization parameters.
type Options struct{CombineDuplicateStreams bool ;CombineDuplicateDirectObjects bool ;ImageUpperPPI float64 ;ImageQuality int ;UseObjectStreams bool ;CombineIdenticalIndirectObjects bool ;CompressStreams bool ;CleanFonts bool ;SubsetFonts bool ;CleanContentstream bool ;};type content struct{_cce string ;_baa *_da .PdfPageResources ;};
// CombineDuplicateStreams combines duplicated streams by its data hash.
// It implements interface model.Optimizer.
type CombineDuplicateStreams struct{};
2020-10-12 14:17:59 +00:00
// CleanFonts cleans up embedded fonts, reducing font sizes.
type CleanFonts struct{
2020-10-05 19:28:24 +00:00
2020-10-12 14:17:59 +00:00
// Subset embedded fonts if encountered (if true).
// Otherwise attempts to reduce the font program.
2020-11-23 22:15:56 +00:00
Subset bool ;};func _def (_gafa []_d .PdfObject )objectStructure {_edcf :=objectStructure {};_abab :=false ;for _ ,_faab :=range _gafa {switch _bef :=_faab .(type ){case *_d .PdfIndirectObject :_bcfgd ,_bfec :=_d .GetDict (_bef );if !_bfec {continue ;};_eaed ,_bfec :=_d .GetName (_bcfgd .Get ("\u0054\u0079\u0070\u0065"));if !_bfec {continue ;};switch _eaed .String (){case "\u0043a\u0074\u0061\u006c\u006f\u0067":_edcf ._aff =_bcfgd ;_abab =true ;};};if _abab {break ;};};if !_abab {return _edcf ;};_dcb ,_eea :=_d .GetDict (_edcf ._aff .Get ("\u0050\u0061\u0067e\u0073"));if !_eea {return _edcf ;};_edcf ._ebaa =_dcb ;_bga ,_eea :=_d .GetArray (_dcb .Get ("\u004b\u0069\u0064\u0073"));if !_eea {return _edcf ;};for _ ,_gfad :=range _bga .Elements (){_gab ,_ffe :=_d .GetIndirect (_gfad );if !_ffe {break ;};_edcf ._bbda =append (_edcf ._bbda ,_gab );};return _edcf ;};func _gd (_agd []_d .PdfObject )(_cda map[*_d .PdfObjectStream ]struct{},_ad error ){_cda =map[*_d .PdfObjectStream ]struct{}{};_fg :=map[*_da .PdfFont ]struct{}{};_abf :=_def (_agd );for _ ,_dbg :=range _abf ._bbda {_bead ,_fe :=_d .GetDict (_dbg .PdfObject );if !_fe {continue ;};_bfb ,_fe :=_d .GetDict (_bead .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_fe {continue ;};_ggd ,_ :=_faag (_bead .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_gae ,_fee :=_da .NewPdfPageResourcesFromDict (_bfb );if _fee !=nil {return nil ,_fee ;};_add :=[]content {{_cce :_ggd ,_baa :_gae }};_ecg :=_acdd (_bead .Get ("\u0041\u006e\u006e\u006f\u0074\u0073"));if _ecg !=nil {_add =append (_add ,_ecg ...);};for _ ,_bebe :=range _add {_bfg ,_ff :=_g .NewFromContents (_bebe ._cce ,_bebe ._baa );if _ff !=nil {return nil ,_ff ;};_fcd ,_ ,_ ,_ff :=_bfg .ExtractPageText ();if _ff !=nil {return nil ,_ff ;};for _ ,_cgb :=range _fcd .Marks ().Elements (){if _cgb .Font ==nil {continue ;};if _ ,_dda :=_fg [_cgb .Font ];!_dda {_fg [_cgb .Font ]=struct{}{};};};};};_bbac :=map[*_d .PdfObjectStream ][]*_da .PdfFont {};for _acd :=range _fg {_fca :=_acd .FontDescriptor ();if _fca ==nil ||_fca .FontFile2 ==nil {continue ;};_gac ,_dbe :=_d .GetStream (_fca .FontFile2 );if !_dbe {continue ;};_bbac [_gac ]=append (_bbac [_gac ],_acd );};for _gggab :=range _bbac {var _cea []rune ;var _bc []_b .GlyphIndex ;for _ ,_abe :=range _bbac [_gggab ]{switch _ccg :=_abe .Encoder ().(type ){case *_cf .IdentityEncoder :_gea :=_ccg .RegisteredRunes ();_accf :=make ([]_b .GlyphIndex ,len (_gea ));for _cfb ,_agb :=range _gea {_accf [_cfb ]=_b .GlyphIndex (_agb );};_bc =append (_bc ,_accf ...);case *_cf .TrueTypeFontEncoder :_bee :=_ccg .RegisteredRunes ();_cea =append (_cea ,_bee ...);case _cf .SimpleEncoder :_cbd :=_ccg .Charcodes ();for _ ,_abd :=range _cbd {_gag ,_aef :=_ccg .CharcodeToRune (_abd );if !_aef {_ga .Log .Debug ("\u0043\u0068a\u0072\u0063\u006f\u0064\u0065\u003c\u002d\u003e\u0072\u0075\u006e\u0065\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064: \u0025\u0064",_abd );continue ;};_cea =append (_cea ,_gag );};};};_ad =_ffc (_gggab ,_cea ,_bc );if _ad !=nil {_ga .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u0020\u0073\u0075\u0062\u0073\u0065\u0074\u0074\u0069\u006eg\u0020f\u006f\u006e\u0074\u0020\u0073\u0074\u0072\u0065\u0061\u006d\u003a\u0020\u0025\u0076",_ad );return nil ,_ad ;};_cda [_gggab ]=struct{}{};};return _cda ,nil ;};type objectStructure struct{_aff *_d .PdfObjectDictionary ;_ebaa *_d .PdfObjectDictionary ;_bbda []*_d .PdfIndirectObject ;};
2020-10-05 19:28:24 +00:00
2020-11-11 18:48:37 +00:00
// Optimize optimizes PDF objects to decrease PDF size.
2020-11-23 22:15:56 +00:00
func (_bfe *CombineDuplicateStreams )Optimize (objects []_d .PdfObject )(_abfg []_d .PdfObject ,_acdf error ){_afe :=make (map[_d .PdfObject ]_d .PdfObject );_bcgb :=make (map[_d .PdfObject ]struct{});_gaf :=make (map[string ][]*_d .PdfObjectStream );for _ ,_ggf :=range objects {if _dcg ,_bec :=_ggf .(*_d .PdfObjectStream );_bec {_cfbf :=_ac .New ();_cfbf .Write (_dcg .Stream );_dab :=string (_cfbf .Sum (nil ));_gaf [_dab ]=append (_gaf [_dab ],_dcg );};};for _ ,_cdgc :=range _gaf {if len (_cdgc )< 2{continue ;};_egg :=_cdgc [0];for _ced :=1;_ced < len (_cdgc );_ced ++{_edc :=_cdgc [_ced ];_afe [_edc ]=_egg ;_bcgb [_edc ]=struct{}{};};};_abfg =make ([]_d .PdfObject ,0,len (objects )-len (_bcgb ));for _ ,_gfff :=range objects {if _ ,_aba :=_bcgb [_gfff ];_aba {continue ;};_abfg =append (_abfg ,_gfff );};_ccdb (_abfg ,_afe );return _abfg ,nil ;};
2020-11-11 18:48:37 +00:00
// Optimize optimizes PDF objects to decrease PDF size.
2020-11-23 22:15:56 +00:00
func (_cab *CombineDuplicateDirectObjects )Optimize (objects []_d .PdfObject )(_bge []_d .PdfObject ,_ade error ){_fafc (objects );_dee :=make (map[string ][]*_d .PdfObjectDictionary );var _bcc func (_beadg *_d .PdfObjectDictionary );_bcc =func (_aa *_d .PdfObjectDictionary ){for _ ,_gca :=range _aa .Keys (){_bcf :=_aa .Get (_gca );if _eac ,_ccd :=_bcf .(*_d .PdfObjectDictionary );_ccd {_eege :=_ac .New ();_eege .Write ([]byte (_eac .WriteString ()));_ggde :=string (_eege .Sum (nil ));_dee [_ggde ]=append (_dee [_ggde ],_eac );_bcc (_eac );};};};for _ ,_eg :=range objects {_gdf ,_gaca :=_eg .(*_d .PdfIndirectObject );if !_gaca {continue ;};if _gcg ,_dec :=_gdf .PdfObject .(*_d .PdfObjectDictionary );_dec {_bcc (_gcg );};};_bfa :=make ([]_d .PdfObject ,0,len (_dee ));_aca :=make (map[_d .PdfObject ]_d .PdfObject );for _ ,_dbab :=range _dee {if len (_dbab )< 2{continue ;};_fbc :=_d .MakeDict ();_fbc .Merge (_dbab [0]);_eef :=_d .MakeIndirectObject (_fbc );_bfa =append (_bfa ,_eef );for _fegd :=0;_fegd < len (_dbab );_fegd ++{_eag :=_dbab [_fegd ];_aca [_eag ]=_eef ;};};_bge =make ([]_d .PdfObject ,len (objects ));copy (_bge ,objects );_bge =append (_bfa ,_bge ...);_ccdb (_bge ,_aca );return _bge ,nil ;};
2020-11-11 18:48:37 +00:00
2020-11-23 22:15:56 +00:00
// CompressStreams compresses uncompressed streams.
2020-11-11 18:48:37 +00:00
// It implements interface model.Optimizer.
2020-11-23 22:15:56 +00:00
type CompressStreams struct{};
2020-11-11 18:48:37 +00:00
2020-11-23 22:15:56 +00:00
// Image optimizes images by rewrite images into JPEG format with quality equals to ImageQuality.
// TODO(a5i): Add support for inline images.
2020-09-07 00:23:12 +00:00
// It implements interface model.Optimizer.
2020-11-23 22:15:56 +00:00
type Image struct{ImageQuality int ;};func _ffc (_eae *_d .PdfObjectStream ,_bce []rune ,_bda []_b .GlyphIndex )error {_eae ,_aee :=_d .GetStream (_eae );if !_aee {_ga .Log .Debug ("\u0045\u006d\u0062\u0065\u0064\u0064\u0065\u0064\u0020\u0066\u006f\u006e\u0074\u0020\u006f\u0062\u006a\u0065c\u0074\u0020\u006e\u006f\u0074\u0020\u0066o\u0075\u006e\u0064\u0020\u002d\u002d\u0020\u0041\u0042\u004f\u0052T\u0020\u0073\u0075\u0062\u0073\u0065\u0074\u0074\u0069\u006e\u0067");return _gf .New ("\u0066\u006f\u006e\u0074fi\u006c\u0065\u0032\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_edgc ,_fda :=_d .DecodeStream (_eae );if _fda !=nil {_ga .Log .Debug ("\u0044\u0065c\u006f\u0064\u0065 \u0065\u0072\u0072\u006f\u0072\u003a\u0020\u0025\u0076",_fda );return _fda ;};_cdg ,_fda :=_b .Parse (_cfd .NewReader (_edgc ));if _fda !=nil {_ga .Log .Debug ("\u0045\u0072\u0072\u006f\u0072\u0020\u0070\u0061\u0072\u0073\u0069n\u0067\u0020\u0025\u0064\u0020\u0062\u0079\u0074\u0065\u0020f\u006f\u006e\u0074",len (_eae .Stream ));return _fda ;};_afd :=_bda ;if len (_bce )> 0{_dbd :=_cdg .LookupRunes (_bce );_afd =append (_afd ,_dbd ...);};_cdg ,_fda =_cdg .SubsetKeepIndices (_afd );if _fda !=nil {_ga .Log .Debug ("\u0045R\u0052\u004f\u0052\u0020s\u0075\u0062\u0073\u0065\u0074t\u0069n\u0067 \u0066\u006f\u006e\u0074\u003a\u0020\u0025v",_fda );return _fda ;};var _ada _cfd .Buffer ;_fda =_cdg .Write (&_ada );if _fda !=nil {_ga .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_fda );return _fda ;};if _ada .Len ()> len (_edgc ){_ga .Log .Debug ("\u0052\u0065-\u0077\u0072\u0069\u0074\u0074\u0065\u006e\u0020\u0066\u006f\u006e\u0074\u0020\u0069\u0073\u0020\u006c\u0061\u0072\u0067\u0065\u0072\u0020\u0074\u0068\u0061\u006e\u0020\u006f\u0072\u0069\u0067\u0069\u006e\u0061\u006c\u0020\u002d\u0020\u0073\u006b\u0069\u0070");return nil ;};_cbb ,_fda :=_d .MakeStream (_ada .Bytes (),_d .NewFlateEncoder ());if _fda !=nil {_ga .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_fda );return _fda ;};*_eae =*_cbb ;_eae .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_d .MakeInteger (int64 (_ada .Len ())));return nil ;};func _cfgd (_daf *_d .PdfObjectStream ,_cfce float64 )error {_dbf ,_cdc :=_da .NewXObjectImageFromStream (_daf );if _cdc !=nil {return _cdc ;};_egc ,_cdc :=_dbf .ToImage ();if _cdc !=nil {return _cdc ;};_fagc ,_cdc :=_egc .ToGoImage ();if _cdc !=nil {return _cdc ;};_gafb :=int (_cc .RoundToEven (float64 (_egc .Width )*_cfce ));_abda :=int (_cc .RoundToEven (float64 (_egc .Height )*_cfce ));_ffdce :=_ca .Rect (0,0,_gafb ,_abda );var _afdc _f .Image ;var _dge func (_ca .Image )(*_da .Image ,error );switch _dbf .ColorSpace .String (){case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_afdc =_ca .NewRGBA (_ffdce );_dge =_da .ImageHandling .NewImageFromGoImage ;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_afdc =_ca .NewGray (_ffdce );_dge =_da .ImageHandling .NewGrayImageFromGoImage ;default:return _a .Errorf ("\u006f\u0070\u0074\u0069\u006d\u0069\u007a\u0061t\u0069\u006f\u006e i\u0073\u0020\u006e\u006f\u0074\u0020s\u0075\u0070\u0070\u006f\u0072\u0074\u0065\u0064\u0020\u0066\u006f\u0072\u0020\u0063\u006fl\u006f\u0072\u0020\u0073\u0070\u0061\u0063\u0065 \u0025\u0073",_dbf .ColorSpace .String ());};_f .CatmullRom .Scale (_afdc ,_afdc .Bounds (),_fagc ,_fagc .Bounds (),_f .Over ,&_f .Options {});if _egc ,_cdc =_dge (_afdc );_cdc !=nil {return _cdc ;};_gcda :=_d .MakeDict ();_gcda .Set ("\u0051u\u0061\u006c\u0069\u0074\u0079",_d .MakeInteger (100));_gcda .Set ("\u0050r\u0065\u0064\u0069\u0063\u0074\u006fr",_d .MakeInteger (1));_dbf .Filter .UpdateParams (_gcda );if _cdc =_dbf .SetImage (_egc ,nil );_cdc !=nil {return _cdc ;};_dbf .ToPdfObject ();return nil ;};