unipdf/model/optimize/optimize.go
2020-09-07 00:23:12 +00:00

99 lines
34 KiB
Go

//
// 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/
package optimize ;import (_bbc "bytes";_aeb "crypto/md5";_bb "errors";_ab "fmt";_c "github.com/unidoc/unipdf/v3/common";_d "github.com/unidoc/unipdf/v3/contentstream";_ae "github.com/unidoc/unipdf/v3/core";_fc "github.com/unidoc/unipdf/v3/extractor";_aa "github.com/unidoc/unipdf/v3/internal/textencoding";_df "github.com/unidoc/unipdf/v3/model";_af "github.com/unidoc/unitype";_f "golang.org/x/image/draw";_b "image";_ff "math";);
// CompressStreams compresses uncompressed streams.
// It implements interface model.Optimizer.
type CompressStreams struct{};
// Optimize optimizes PDF objects to decrease PDF size.
func (_acg *CompressStreams )Optimize (objects []_ae .PdfObject )(_eff []_ae .PdfObject ,_feg error ){_eff =make ([]_ae .PdfObject ,len (objects ));copy (_eff ,objects );for _ ,_gca :=range objects {_aafb ,_gfe :=_ae .GetStream (_gca );if !_gfe {continue ;};if _feed :=_aafb .Get ("\u0046\u0069\u006c\u0074\u0065\u0072");_feed !=nil {if _ ,_fbga :=_ae .GetName (_feed );_fbga {continue ;};if _beef ,_ceg :=_ae .GetArray (_feed );_ceg &&_beef .Len ()> 0{continue ;};};_faa :=_ae .NewFlateEncoder ();var _cfa []byte ;_cfa ,_feg =_faa .EncodeBytes (_aafb .Stream );if _feg !=nil {return _eff ,_feg ;};_abaf :=_faa .MakeStreamDict ();if len (_cfa )+len (_abaf .WriteString ())< len (_aafb .Stream ){_aafb .Stream =_cfa ;_aafb .PdfObjectDictionary .Merge (_abaf );_aafb .PdfObjectDictionary .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_ae .MakeInteger (int64 (len (_aafb .Stream ))));};};return _eff ,nil ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_aca *CombineDuplicateStreams )Optimize (objects []_ae .PdfObject )(_daa []_ae .PdfObject ,_agdd error ){_dcg :=make (map[_ae .PdfObject ]_ae .PdfObject );_acde :=make (map[_ae .PdfObject ]struct{});_dcd :=make (map[string ][]*_ae .PdfObjectStream );for _ ,_fga :=range objects {if _ddee ,_bda :=_fga .(*_ae .PdfObjectStream );_bda {_gaa :=_aeb .New ();_gaa .Write ([]byte (_ddee .Stream ));_ddc :=string (_gaa .Sum (nil ));_dcd [_ddc ]=append (_dcd [_ddc ],_ddee );};};for _ ,_dfg :=range _dcd {if len (_dfg )< 2{continue ;};_geeg :=_dfg [0];for _gegc :=1;_gegc < len (_dfg );_gegc ++{_ffad :=_dfg [_gegc ];_dcg [_ffad ]=_geeg ;_acde [_ffad ]=struct{}{};};};_daa =make ([]_ae .PdfObject ,0,len (objects )-len (_acde ));for _ ,_fae :=range objects {if _ ,_afa :=_acde [_fae ];_afa {continue ;};_daa =append (_daa ,_fae );};_gdeb (_daa ,_dcg );return _daa ,nil ;};type imageInfo struct{ColorSpace _ae .PdfObjectName ;BitsPerComponent int ;ColorComponents int ;Width int ;Height int ;Stream *_ae .PdfObjectStream ;PPI float64 ;};
// CleanFonts cleans up embedded fonts, reducing font sizes.
type CleanFonts struct{
// Subset embedded fonts if encountered (if true).
// Otherwise attempts to reduce the font program.
Subset bool ;};
// Append appends optimizers to the chain.
func (_fcc *Chain )Append (optimizers ..._df .Optimizer ){_fcc ._cc =append (_fcc ._cc ,optimizers ...)};
// ObjectStreams groups PDF objects to object streams.
// It implements interface model.Optimizer.
type ObjectStreams struct{};func _dfb (_bf *_ae .PdfObjectStream )error {_fa ,_db :=_ae .DecodeStream (_bf );if _db !=nil {return _db ;};_bbe :=_d .NewContentStreamParser (string (_fa ));_adf ,_db :=_bbe .Parse ();if _db !=nil {return _db ;};_adf =_gc (_adf );_de :=_adf .Bytes ();if len (_de )>=len (_fa ){return nil ;};_fb ,_db :=_ae .MakeStream (_adf .Bytes (),_ae .NewFlateEncoder ());if _db !=nil {return _db ;};_bf .Stream =_fb .Stream ;_bf .Merge (_fb .PdfObjectDictionary );return nil ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_fbf *CleanFonts )Optimize (objects []_ae .PdfObject )(_bcaa []_ae .PdfObject ,_ege error ){var _gcd map[*_ae .PdfObjectStream ]struct{};if _fbf .Subset {var _daf error ;_gcd ,_daf =_faf (objects );if _daf !=nil {return nil ,_daf ;};};for _ ,_gabg :=range objects {_cdb ,_ccb :=_ae .GetStream (_gabg );if !_ccb {continue ;};if _ ,_fcgd :=_gcd [_cdb ];_fcgd {continue ;};_cgf ,_gga :=_ae .NewEncoderFromStream (_cdb );if _gga !=nil {_c .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",_gga );continue ;};_acd ,_gga :=_cgf .DecodeStream (_cdb );if _gga !=nil {_c .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",_gga );continue ;};if len (_acd )< 4{continue ;};_cga :=string (_acd [:4]);if _cga =="\u004f\u0054\u0054\u004f"{continue ;};if _cga !="\u0000\u0001\u0000\u0000"&&_cga !="\u0074\u0072\u0075\u0065"{continue ;};_cdd ,_gga :=_af .Parse (_bbc .NewReader (_acd ));if _gga !=nil {_c .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",_gga );continue ;};_gga =_cdd .Optimize ();if _gga !=nil {continue ;};var _aea _bbc .Buffer ;_gga =_cdd .Write (&_aea );if _gga !=nil {_c .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",_gga );continue ;};if _aea .Len ()> len (_acd ){_c .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 ;};_bdfe ,_gga :=_ae .MakeStream (_aea .Bytes (),_ae .NewFlateEncoder ());if _gga !=nil {continue ;};*_cdb =*_bdfe ;_cdb .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_ae .MakeInteger (int64 (_aea .Len ())));};return objects ,nil ;};
// Image optimizes images by rewrite images into JPEG format with quality equals to ImageQuality.
// TODO(a5i): Add support for inline images.
// It implements interface model.Optimizer.
type Image struct{ImageQuality int ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_aafag *CombineDuplicateDirectObjects )Optimize (objects []_ae .PdfObject )(_dbg []_ae .PdfObject ,_ffae error ){_eggee (objects );_edc :=make (map[string ][]*_ae .PdfObjectDictionary );var _bba func (_ggga *_ae .PdfObjectDictionary );_bba =func (_dd *_ae .PdfObjectDictionary ){for _ ,_ece :=range _dd .Keys (){_eafd :=_dd .Get (_ece );if _bebg ,_abc :=_eafd .(*_ae .PdfObjectDictionary );_abc {_fed :=_aeb .New ();_fed .Write ([]byte (_bebg .WriteString ()));_dff :=string (_fed .Sum (nil ));_edc [_dff ]=append (_edc [_dff ],_bebg );_bba (_bebg );};};};for _ ,_dde :=range objects {_afd ,_deeb :=_dde .(*_ae .PdfIndirectObject );if !_deeb {continue ;};if _adg ,_cfg :=_afd .PdfObject .(*_ae .PdfObjectDictionary );_cfg {_bba (_adg );};};_gfca :=make ([]_ae .PdfObject ,0,len (_edc ));_ddb :=make (map[_ae .PdfObject ]_ae .PdfObject );for _ ,_efb :=range _edc {if len (_efb )< 2{continue ;};_aba :=_ae .MakeDict ();_aba .Merge (_efb [0]);_cgb :=_ae .MakeIndirectObject (_aba );_gfca =append (_gfca ,_cgb );for _bcgb :=0;_bcgb < len (_efb );_bcgb ++{_gcc :=_efb [_bcgb ];_ddb [_gcc ]=_cgb ;};};_dbg =make ([]_ae .PdfObject ,len (objects ));copy (_dbg ,objects );_dbg =append (_gfca ,_dbg ...);_gdeb (_dbg ,_ddb );return _dbg ,nil ;};
// CombineIdenticalIndirectObjects combines identical indirect objects.
// It implements interface model.Optimizer.
type CombineIdenticalIndirectObjects struct{};
// Optimize optimizes PDF objects to decrease PDF size.
func (_dg *CleanContentstream )Optimize (objects []_ae .PdfObject )(_e []_ae .PdfObject ,_dgg error ){_aaf :=map[*_ae .PdfObjectStream ]struct{}{};var _ed []*_ae .PdfObjectStream ;_gf :=func (_ga *_ae .PdfObjectStream ){if _ ,_ec :=_aaf [_ga ];!_ec {_aaf [_ga ]=struct{}{};_ed =append (_ed ,_ga );};};for _ ,_bef :=range objects {switch _dc :=_bef .(type ){case *_ae .PdfIndirectObject :switch _bdg :=_dc .PdfObject .(type ){case *_ae .PdfObjectDictionary :if _bg ,_bcac :=_ae .GetName (_bdg .Get ("\u0054\u0079\u0070\u0065"));!_bcac ||_bg .String ()!="\u0050\u0061\u0067\u0065"{continue ;};if _bed ,_ecf :=_ae .GetStream (_bdg .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_ecf {_gf (_bed );}else if _gae ,_gab :=_ae .GetArray (_bdg .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_gab {for _ ,_fg :=range _gae .Elements (){if _deb ,_fe :=_ae .GetStream (_fg );_fe {_gf (_deb );};};};};case *_ae .PdfObjectStream :if _ge ,_gg :=_ae .GetName (_dc .Get ("\u0054\u0079\u0070\u0065"));!_gg ||_ge .String ()!="\u0058O\u0062\u006a\u0065\u0063\u0074"{continue ;};if _gee ,_cad :=_ae .GetName (_dc .Get ("\u0053u\u0062\u0074\u0079\u0070\u0065"));!_cad ||_gee .String ()!="\u0046\u006f\u0072\u006d"{continue ;};_gf (_dc );};};for _ ,_fbg :=range _ed {_dgg =_dfb (_fbg );if _dgg !=nil {return nil ,_dgg ;};};return objects ,nil ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_g *Chain )Optimize (objects []_ae .PdfObject )(_bbf []_ae .PdfObject ,_be error ){_bbf =objects ;for _ ,_ca :=range _g ._cc {_bbf ,_be =_ca .Optimize (_bbf );if _be !=nil {return _bbf ,_be ;};};return _bbf ,nil ;};
// New creates a optimizers chain from options.
func New (options Options )*Chain {_fdb :=new (Chain );if options .CleanFonts ||options .SubsetFonts {_fdb .Append (&CleanFonts {Subset :options .SubsetFonts });};if options .CleanContentstream {_fdb .Append (new (CleanContentstream ));};if options .ImageUpperPPI > 0{_ged :=new (ImagePPI );_ged .ImageUpperPPI =options .ImageUpperPPI ;_fdb .Append (_ged );};if options .ImageQuality > 0{_ebdc :=new (Image );_ebdc .ImageQuality =options .ImageQuality ;_fdb .Append (_ebdc );};if options .CombineDuplicateDirectObjects {_fdb .Append (new (CombineDuplicateDirectObjects ));};if options .CombineDuplicateStreams {_fdb .Append (new (CombineDuplicateStreams ));};if options .CombineIdenticalIndirectObjects {_fdb .Append (new (CombineIdenticalIndirectObjects ));};if options .UseObjectStreams {_fdb .Append (new (ObjectStreams ));};if options .CompressStreams {_fdb .Append (new (CompressStreams ));};return _fdb ;};type content struct{_ef string ;_bea *_df .PdfPageResources ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_fdd *Image )Optimize (objects []_ae .PdfObject )(_abb []_ae .PdfObject ,_adb error ){if _fdd .ImageQuality <=0{return objects ,nil ;};_aae :=_gbe (objects );if len (_aae )==0{return objects ,nil ;};_caaf :=make (map[_ae .PdfObject ]_ae .PdfObject );_faac :=make (map[_ae .PdfObject ]struct{});for _ ,_defc :=range _aae {_dbae :=_defc .Stream .PdfObjectDictionary .Get (_ae .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_faac [_dbae ]=struct{}{};};for _dda ,_faacc :=range _aae {_fac :=_faacc .Stream ;if _ ,_addf :=_faac [_fac ];_addf {continue ;};_fafb ,_adce :=_ae .NewEncoderFromStream (_fac );if _adce !=nil {_c .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 ;};_dgc ,_adce :=_fafb .DecodeStream (_fac );if _adce !=nil {_c .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 ;};_dfff :=_ae .NewDCTEncoder ();_dfff .ColorComponents =_faacc .ColorComponents ;_dfff .Quality =_fdd .ImageQuality ;_dfff .BitsPerComponent =_faacc .BitsPerComponent ;_dfff .Width =_faacc .Width ;_dfff .Height =_faacc .Height ;_gbbc ,_adce :=_dfff .EncodeBytes (_dgc );if _adce !=nil {_c .Log .Debug ("\u0045R\u0052\u004f\u0052\u003a\u0020\u0025v",_adce );return nil ,_adce ;};var _abe _ae .StreamEncoder ;_abe =_dfff ;{_gaea :=_ae .NewFlateEncoder ();_ccbd :=_ae .NewMultiEncoder ();_ccbd .AddEncoder (_gaea );_ccbd .AddEncoder (_dfff );_agbf ,_cbd :=_ccbd .EncodeBytes (_dgc );if _cbd !=nil {return nil ,_cbd ;};if len (_agbf )< len (_gbbc ){_c .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 (_gbbc ),len (_agbf ),len (_fac .Stream ));_gbbc =_agbf ;_abe =_ccbd ;};};_dcgf :=len (_fac .Stream );if _dcgf < len (_gbbc ){continue ;};_ecab :=&_ae .PdfObjectStream {Stream :_gbbc };_ecab .PdfObjectReference =_fac .PdfObjectReference ;_ecab .PdfObjectDictionary =_ae .MakeDict ();_ecab .Merge (_fac .PdfObjectDictionary );_ecab .Merge (_abe .MakeStreamDict ());_ecab .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_ae .MakeInteger (int64 (len (_gbbc ))));_caaf [_fac ]=_ecab ;_aae [_dda ].Stream =_ecab ;};_abb =make ([]_ae .PdfObject ,len (objects ));copy (_abb ,objects );_gdeb (_abb ,_caaf );return _abb ,nil ;};
// ImagePPI optimizes images by scaling images such that the PPI (pixels per inch) is never higher than ImageUpperPPI.
// TODO(a5i): Add support for inline images.
// It implements interface model.Optimizer.
type ImagePPI struct{ImageUpperPPI float64 ;};func _eggee (_dfdc []_ae .PdfObject ){for _gafc ,_dga :=range _dfdc {switch _ccdg :=_dga .(type ){case *_ae .PdfIndirectObject :_ccdg .ObjectNumber =int64 (_gafc +1);_ccdg .GenerationNumber =0;case *_ae .PdfObjectStream :_ccdg .ObjectNumber =int64 (_gafc +1);_ccdg .GenerationNumber =0;case *_ae .PdfObjectStreams :_ccdg .ObjectNumber =int64 (_gafc +1);_ccdg .GenerationNumber =0;};};};
// Chain allows to use sequence of optimizers.
// It implements interface model.Optimizer.
type Chain struct{_cc []_df .Optimizer };func _bga (_bbg []_ae .PdfObject )objectStructure {_ffc :=objectStructure {};_afb :=false ;for _ ,_ebb :=range _bbg {switch _bcace :=_ebb .(type ){case *_ae .PdfIndirectObject :_fbc ,_dcgb :=_ae .GetDict (_bcace );if !_dcgb {continue ;};_adfg ,_dcgb :=_ae .GetName (_fbc .Get ("\u0054\u0079\u0070\u0065"));if !_dcgb {continue ;};switch _adfg .String (){case "\u0043a\u0074\u0061\u006c\u006f\u0067":_ffc ._bfe =_fbc ;_afb =true ;};};if _afb {break ;};};if !_afb {return _ffc ;};_bfag ,_cdca :=_ae .GetDict (_ffc ._bfe .Get ("\u0050\u0061\u0067e\u0073"));if !_cdca {return _ffc ;};_ffc ._fced =_bfag ;_afde ,_cdca :=_ae .GetArray (_bfag .Get ("\u004b\u0069\u0064\u0073"));if !_cdca {return _ffc ;};for _ ,_efba :=range _afde .Elements (){_fgff ,_cde :=_ae .GetIndirect (_efba );if !_cde {break ;};_ffc ._fgfa =append (_ffc ._fgfa ,_fgff );};return _ffc ;};
// 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.
type CleanContentstream struct{};func _faf (_bedf []_ae .PdfObject )(_ee map[*_ae .PdfObjectStream ]struct{},_ag error ){_ee =map[*_ae .PdfObjectStream ]struct{}{};_aafa :=map[*_df .PdfFont ]struct{}{};_gad :=_bga (_bedf );for _ ,_fgc :=range _gad ._fgfa {_ba ,_bgf :=_ae .GetDict (_fgc .PdfObject );if !_bgf {continue ;};_aebe ,_bgf :=_ae .GetDict (_ba .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_bgf {continue ;};_ea ,_ :=_gdd (_ba .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_bfb ,_gef :=_df .NewPdfPageResourcesFromDict (_aebe );if _gef !=nil {return nil ,_gef ;};_bae :=[]content {{_ef :_ea ,_bea :_bfb }};_aaa :=_def (_ba .Get ("\u0041\u006e\u006e\u006f\u0074\u0073"));if _aaa !=nil {_bae =append (_bae ,_aaa ...);};for _ ,_feb :=range _bae {_cf ,_adaa :=_fc .NewFromContents (_feb ._ef ,_feb ._bea );if _adaa !=nil {return nil ,_adaa ;};_ega ,_ ,_ ,_adaa :=_cf .ExtractPageText ();if _adaa !=nil {return nil ,_adaa ;};for _ ,_fec :=range _ega .Marks ().Elements (){if _fec .Font ==nil {continue ;};if _ ,_fcb :=_aafa [_fec .Font ];!_fcb {_aafa [_fec .Font ]=struct{}{};};};};};_dce :=map[*_ae .PdfObjectStream ][]*_df .PdfFont {};for _bdgd :=range _aafa {_eb :=_bdgd .FontDescriptor ();if _eb ==nil ||_eb .FontFile2 ==nil {continue ;};_eeg ,_da :=_ae .GetStream (_eb .FontFile2 );if !_da {continue ;};_dce [_eeg ]=append (_dce [_eeg ],_bdgd );};for _baf :=range _dce {var _agd []rune ;var _ebd []_af .GlyphIndex ;for _ ,_bdf :=range _dce [_baf ]{switch _fccf :=_bdf .Encoder ().(type ){case *_aa .IdentityEncoder :_aaac :=_fccf .RegisteredRunes ();_febe :=make ([]_af .GlyphIndex ,len (_aaac ));for _fbb ,_ggf :=range _aaac {_febe [_fbb ]=_af .GlyphIndex (_ggf );};_ebd =append (_ebd ,_febe ...);case *_aa .TrueTypeFontEncoder :_bad :=_fccf .RegisteredRunes ();_agd =append (_agd ,_bad ...);case _aa .SimpleEncoder :_bdc :=_fccf .Charcodes ();for _ ,_fafc :=range _bdc {_agf ,_gfc :=_fccf .CharcodeToRune (_fafc );if !_gfc {_c .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",_fafc );continue ;};_agd =append (_agd ,_agf );};};};_ag =_eac (_baf ,_agd ,_ebd );if _ag !=nil {_c .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",_ag );return nil ,_ag ;};_ee [_baf ]=struct{}{};};return _ee ,nil ;};func _eac (_dae *_ae .PdfObjectStream ,_add []rune ,_cd []_af .GlyphIndex )error {_dae ,_ac :=_ae .GetStream (_dae );if !_ac {_c .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 _bb .New ("\u0066\u006f\u006e\u0074fi\u006c\u0065\u0032\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_gb ,_age :=_ae .DecodeStream (_dae );if _age !=nil {_c .Log .Debug ("\u0044\u0065c\u006f\u0064\u0065 \u0065\u0072\u0072\u006f\u0072\u003a\u0020\u0025\u0076",_age );return _age ;};_eee ,_age :=_af .Parse (_bbc .NewReader (_gb ));if _age !=nil {_c .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 (_dae .Stream ));return _age ;};_cg :=_cd ;if len (_add )> 0{_bcb :=_eee .LookupRunes (_add );_cg =append (_cg ,_bcb ...);};_eee ,_age =_eee .SubsetKeepIndices (_cg );if _age !=nil {_c .Log .Debug ("\u0045R\u0052\u004f\u0052\u0020s\u0075\u0062\u0073\u0065\u0074t\u0069n\u0067 \u0066\u006f\u006e\u0074\u003a\u0020\u0025v",_age );return _age ;};var _bfa _bbc .Buffer ;_age =_eee .Write (&_bfa );if _age !=nil {_c .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_age );return _age ;};if _bfa .Len ()> len (_gb ){_c .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 ;};_cgd ,_age :=_ae .MakeStream (_bfa .Bytes (),_ae .NewFlateEncoder ());if _age !=nil {_c .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_age );return _age ;};*_dae =*_cgd ;_dae .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_ae .MakeInteger (int64 (_bfa .Len ())));return nil ;};func _def (_beb _ae .PdfObject )[]content {if _beb ==nil {return nil ;};_bgd ,_ce :=_ae .GetArray (_beb );if !_ce {_c .Log .Debug ("\u0041\u006e\u006e\u006fts\u0020\u006e\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");return nil ;};var _ace []content ;for _ ,_gabf :=range _bgd .Elements (){_abg ,_cgde :=_ae .GetDict (_gabf );if !_cgde {_c .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 ;};_agdb ,_cgde :=_ae .GetDict (_abg .Get ("\u0041\u0050"));if !_cgde {_c .Log .Debug ("\u004e\u006f\u0020\u0041P \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_dee :=_ae .TraceToDirectObject (_agdb .Get ("\u004e"));if _dee ==nil {_c .Log .Debug ("N\u006f\u0020\u004e\u0020en\u0074r\u0079\u0020\u002d\u0020\u0073k\u0069\u0070\u0070\u0069\u006e\u0067");continue ;};var _ggg *_ae .PdfObjectStream ;switch _fcd :=_dee .(type ){case *_ae .PdfObjectDictionary :_agc ,_dgfg :=_ae .GetName (_abg .Get ("\u0041\u0053"));if !_dgfg {_c .Log .Debug ("\u004e\u006f\u0020\u0041S \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_ggg ,_dgfg =_ae .GetStream (_fcd .Get (*_agc ));if !_dgfg {_c .Log .Debug ("\u0046o\u0072\u006d\u0020\u006eo\u0074\u0020\u0066\u006f\u0075n\u0064 \u002d \u0073\u006b\u0069\u0070\u0070\u0069\u006eg");continue ;};case *_ae .PdfObjectStream :_ggg =_fcd ;};if _ggg ==nil {_c .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 ;};_agdf ,_egaf :=_df .NewXObjectFormFromStream (_ggg );if _egaf !=nil {_c .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",_egaf );continue ;};_cfe ,_egaf :=_agdf .GetContentStream ();if _egaf !=nil {_c .Log .Debug ("E\u0072\u0072\u006f\u0072\u0020\u0064e\u0063\u006f\u0064\u0069\u006e\u0067\u0020\u0063\u006fn\u0074\u0065\u006et\u0073:\u0020\u0025\u0076",_egaf );continue ;};_ace =append (_ace ,content {_ef :string (_cfe ),_bea :_agdf .Resources });};return _ace ;};
// 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 ;};func _gc (_ad *_d .ContentStreamOperations )*_d .ContentStreamOperations {if _ad ==nil {return nil ;};_bc :=_d .ContentStreamOperations {};for _ ,_bd :=range *_ad {switch _bd .Operand {case "\u0042\u0044\u0043","\u0042\u004d\u0043","\u0045\u004d\u0043":continue ;case "\u0054\u006d":if len (_bd .Params )==6{if _bca ,_caa :=_ae .GetNumbersAsFloat (_bd .Params );_caa ==nil {if _bca [0]==1&&_bca [1]==0&&_bca [2]==0&&_bca [3]==1{_bd =&_d .ContentStreamOperation {Params :[]_ae .PdfObject {_bd .Params [4],_bd .Params [5]},Operand :"\u0054\u0064"};};};};};_bc =append (_bc ,_bd );};return &_bc ;};func _gbe (_gegd []_ae .PdfObject )[]*imageInfo {_feef :=_ae .PdfObjectName ("\u0053u\u0062\u0074\u0079\u0070\u0065");_beec :=make (map[*_ae .PdfObjectStream ]struct{});var _dfbf error ;var _cgbf []*imageInfo ;for _ ,_dgfb :=range _gegd {_aga ,_gd :=_ae .GetStream (_dgfb );if !_gd {continue ;};if _ ,_gefb :=_beec [_aga ];_gefb {continue ;};_beec [_aga ]=struct{}{};_aeda :=_aga .PdfObjectDictionary .Get (_feef );_gfcaf ,_gd :=_ae .GetName (_aeda );if !_gd ||string (*_gfcaf )!="\u0049\u006d\u0061g\u0065"{continue ;};_egg :=&imageInfo {BitsPerComponent :8,Stream :_aga };if _egg .ColorSpace ,_dfbf =_df .DetermineColorspaceNameFromPdfObject (_aga .PdfObjectDictionary .Get ("\u0043\u006f\u006c\u006f\u0072\u0053\u0070\u0061\u0063\u0065"));_dfbf !=nil {_c .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",_dfbf );continue ;};if _dbgf ,_eaa :=_ae .GetIntVal (_aga .PdfObjectDictionary .Get ("\u0042\u0069t\u0073\u0050\u0065r\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074"));_eaa {_egg .BitsPerComponent =_dbgf ;};if _egeb ,_fgd :=_ae .GetIntVal (_aga .PdfObjectDictionary .Get ("\u0057\u0069\u0064t\u0068"));_fgd {_egg .Width =_egeb ;};if _fcdd ,_bde :=_ae .GetIntVal (_aga .PdfObjectDictionary .Get ("\u0048\u0065\u0069\u0067\u0068\u0074"));_bde {_egg .Height =_fcdd ;};switch _egg .ColorSpace {case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_egg .ColorComponents =3;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_egg .ColorComponents =1;default:_c .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",_egg .ColorSpace );continue ;};_cgbf =append (_cgbf ,_egg );};return _cgbf ;};func _gdd (_aef _ae .PdfObject )(_egf string ,_dge []_ae .PdfObject ){var _feced _bbc .Buffer ;switch _beaf :=_aef .(type ){case *_ae .PdfIndirectObject :_dge =append (_dge ,_beaf );_aef =_beaf .PdfObject ;};switch _gfd :=_aef .(type ){case *_ae .PdfObjectStream :if _gdc ,_dea :=_ae .DecodeStream (_gfd );_dea ==nil {_feced .Write (_gdc );_dge =append (_dge ,_gfd );};case *_ae .PdfObjectArray :for _ ,_beg :=range _gfd .Elements (){switch _fbeg :=_beg .(type ){case *_ae .PdfObjectStream :if _cgdc ,_dbgc :=_ae .DecodeStream (_fbeg );_dbgc ==nil {_feced .Write (_cgdc );_dge =append (_dge ,_fbeg );};};};};return _feced .String (),_dge ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_cge *CombineIdenticalIndirectObjects )Optimize (objects []_ae .PdfObject )(_bdfec []_ae .PdfObject ,_agb error ){_eggee (objects );_abcc :=make (map[_ae .PdfObject ]_ae .PdfObject );_dggd :=make (map[_ae .PdfObject ]struct{});_fgf :=make (map[string ][]*_ae .PdfIndirectObject );for _ ,_cadb :=range objects {_adc ,_bgc :=_cadb .(*_ae .PdfIndirectObject );if !_bgc {continue ;};if _bgdg ,_daac :=_adc .PdfObject .(*_ae .PdfObjectDictionary );_daac {if _gegcf ,_cdc :=_bgdg .Get ("\u0054\u0079\u0070\u0065").(*_ae .PdfObjectName );_cdc &&*_gegcf =="\u0050\u0061\u0067\u0065"{continue ;};_bee :=_aeb .New ();_bee .Write ([]byte (_bgdg .WriteString ()));_ecb :=string (_bee .Sum (nil ));_fgf [_ecb ]=append (_fgf [_ecb ],_adc );};};for _ ,_bcbg :=range _fgf {if len (_bcbg )< 2{continue ;};_ddbb :=_bcbg [0];for _gbb :=1;_gbb < len (_bcbg );_gbb ++{_bbfd :=_bcbg [_gbb ];_abcc [_bbfd ]=_ddbb ;_dggd [_bbfd ]=struct{}{};};};_bdfec =make ([]_ae .PdfObject ,0,len (objects )-len (_dggd ));for _ ,_bdgb :=range objects {if _ ,_fgb :=_dggd [_bdgb ];_fgb {continue ;};_bdfec =append (_bdfec ,_bdgb );};_gdeb (_bdfec ,_abcc );return _bdfec ,nil ;};func _gdeb (_egef []_ae .PdfObject ,_agff map[_ae .PdfObject ]_ae .PdfObject ){if _agff ==nil ||len (_agff )==0{return ;};for _agbc ,_fef :=range _egef {if _egge ,_cdf :=_agff [_fef ];_cdf {_egef [_agbc ]=_egge ;continue ;};_agff [_fef ]=_fef ;switch _bbab :=_fef .(type ){case *_ae .PdfObjectArray :_dcea :=make ([]_ae .PdfObject ,_bbab .Len ());copy (_dcea ,_bbab .Elements ());_gdeb (_dcea ,_agff );for _cbg ,_bdaa :=range _dcea {_bbab .Set (_cbg ,_bdaa );};case *_ae .PdfObjectStreams :_gdeb (_bbab .Elements (),_agff );case *_ae .PdfObjectStream :_dgfa :=[]_ae .PdfObject {_bbab .PdfObjectDictionary };_gdeb (_dgfa ,_agff );_bbab .PdfObjectDictionary =_dgfa [0].(*_ae .PdfObjectDictionary );case *_ae .PdfObjectDictionary :_debg :=_bbab .Keys ();_gbbb :=make ([]_ae .PdfObject ,len (_debg ));for _cdbb ,_fcgaf :=range _debg {_gbbb [_cdbb ]=_bbab .Get (_fcgaf );};_gdeb (_gbbb ,_agff );for _ffe ,_dbe :=range _debg {_bbab .Set (_dbe ,_gbbb [_ffe ]);};case *_ae .PdfIndirectObject :_cgfg :=[]_ae .PdfObject {_bbab .PdfObject };_gdeb (_cgfg ,_agff );_bbab .PdfObject =_cgfg [0];};};};
// CombineDuplicateStreams combines duplicated streams by its data hash.
// It implements interface model.Optimizer.
type CombineDuplicateStreams struct{};
// Optimize optimizes PDF objects to decrease PDF size.
func (_abd *ImagePPI )Optimize (objects []_ae .PdfObject )(_agag []_ae .PdfObject ,_dfab error ){if _abd .ImageUpperPPI <=0{return objects ,nil ;};_eacg :=_gbe (objects );if len (_eacg )==0{return objects ,nil ;};_fea :=make (map[_ae .PdfObject ]struct{});for _ ,_ffb :=range _eacg {_afad :=_ffb .Stream .PdfObjectDictionary .Get (_ae .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_fea [_afad ]=struct{}{};};_gcb :=make (map[*_ae .PdfObjectStream ]*imageInfo );for _ ,_acab :=range _eacg {_gcb [_acab .Stream ]=_acab ;};var _ebe *_ae .PdfObjectDictionary ;for _ ,_ecea :=range objects {if _dgb ,_edg :=_ae .GetDict (_ecea );_ebe ==nil &&_edg {if _eege ,_ffd :=_ae .GetName (_dgb .Get (_ae .PdfObjectName ("\u0054\u0079\u0070\u0065")));_ffd &&*_eege =="\u0043a\u0074\u0061\u006c\u006f\u0067"{_ebe =_dgb ;};};};if _ebe ==nil {return objects ,nil ;};_cbc ,_ced :=_ae .GetDict (_ebe .Get (_ae .PdfObjectName ("\u0050\u0061\u0067e\u0073")));if !_ced {return objects ,nil ;};_gfcd ,_efde :=_ae .GetArray (_cbc .Get (_ae .PdfObjectName ("\u004b\u0069\u0064\u0073")));if !_efde {return objects ,nil ;};_dced :=make (map[string ]*imageInfo );for _ ,_ccd :=range _gfcd .Elements (){_ddg ,_gfb :=_ae .GetDict (_ccd );if !_gfb {continue ;};_egafd ,_feag :=_ae .GetArray (_ddg .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));if !_feag {continue ;};_eeea ,_adag :=_ae .GetDict (_ddg .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_adag {continue ;};_dfdg ,_gfea :=_ae .GetDict (_eeea .Get ("\u0058O\u0062\u006a\u0065\u0063\u0074"));if !_gfea {continue ;};_gfg :=_dfdg .Keys ();for _ ,_gaf :=range _gfg {if _cff ,_cbf :=_ae .GetStream (_dfdg .Get (_gaf ));_cbf {if _fdc ,_ceb :=_gcb [_cff ];_ceb {_dced [string (_gaf )]=_fdc ;};};};for _ ,_gde :=range _egafd .Elements (){if _cgc ,_bcc :=_ae .GetStream (_gde );_bcc {_bgg ,_gegb :=_ae .NewEncoderFromStream (_cgc );if _gegb !=nil {return nil ,_gegb ;};_ebg ,_gegb :=_bgg .DecodeStream (_cgc );if _gegb !=nil {return nil ,_gegb ;};_gdef :=_d .NewContentStreamParser (string (_ebg ));_bccc ,_gegb :=_gdef .Parse ();if _gegb !=nil {return nil ,_gegb ;};_gcg ,_edb :=1.0,1.0;for _ ,_ggd :=range *_bccc {if _ggd .Operand =="\u0051"{_gcg ,_edb =1.0,1.0;};if _ggd .Operand =="\u0063\u006d"&&len (_ggd .Params )==6{if _bce ,_fgbd :=_ae .GetFloatVal (_ggd .Params [0]);_fgbd {_gcg =_gcg *_bce ;};if _aeac ,_fcga :=_ae .GetFloatVal (_ggd .Params [3]);_fcga {_edb =_edb *_aeac ;};if _aac ,_afc :=_ae .GetIntVal (_ggd .Params [0]);_afc {_gcg =_gcg *float64 (_aac );};if _dgba ,_ebc :=_ae .GetIntVal (_ggd .Params [3]);_ebc {_edb =_edb *float64 (_dgba );};};if _ggd .Operand =="\u0044\u006f"&&len (_ggd .Params )==1{_gefe ,_efg :=_ae .GetName (_ggd .Params [0]);if !_efg {continue ;};if _bdd ,_afac :=_dced [string (*_gefe )];_afac {_bbcd ,_eaaf :=_gcg /72.0,_edb /72.0;_bcae ,_dgfga :=float64 (_bdd .Width )/_bbcd ,float64 (_bdd .Height )/_eaaf ;if _bbcd ==0||_eaaf ==0{_bcae =72.0;_dgfga =72.0;};_bdd .PPI =_ff .Max (_bdd .PPI ,_bcae );_bdd .PPI =_ff .Max (_bdd .PPI ,_dgfga );};};};};};};for _ ,_acc :=range _eacg {if _ ,_edag :=_fea [_acc .Stream ];_edag {continue ;};if _acc .PPI <=_abd .ImageUpperPPI {continue ;};_bggb :=_abd .ImageUpperPPI /_acc .PPI ;if _ggc :=_dca (_acc .Stream ,_bggb );_ggc !=nil {_c .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",_ggc );}else {if _gcf ,_baa :=_ae .GetStream (_acc .Stream .PdfObjectDictionary .Get (_ae .PdfObjectName ("\u0053\u004d\u0061s\u006b")));_baa {if _bbfde :=_dca (_gcf ,_bggb );_bbfde !=nil {return nil ,_bbfde ;};};};};return objects ,nil ;};type objectStructure struct{_bfe *_ae .PdfObjectDictionary ;_fced *_ae .PdfObjectDictionary ;_fgfa []*_ae .PdfIndirectObject ;};
// CombineDuplicateDirectObjects combines duplicated direct objects by its data hash.
// It implements interface model.Optimizer.
type CombineDuplicateDirectObjects struct{};
// Optimize optimizes PDF objects to decrease PDF size.
func (_dbd *ObjectStreams )Optimize (objects []_ae .PdfObject )(_fgfb []_ae .PdfObject ,_gaaf error ){_gbeg :=&_ae .PdfObjectStreams {};_acca :=make ([]_ae .PdfObject ,0,len (objects ));for _ ,_bddd :=range objects {if _bcgf ,_gff :=_bddd .(*_ae .PdfIndirectObject );_gff &&_bcgf .GenerationNumber ==0{_gbeg .Append (_bddd );}else {_acca =append (_acca ,_bddd );};};if _gbeg .Len ()==0{return _acca ,nil ;};_fgfb =make ([]_ae .PdfObject ,0,len (_acca )+_gbeg .Len ()+1);if _gbeg .Len ()> 1{_fgfb =append (_fgfb ,_gbeg );};_fgfb =append (_fgfb ,_gbeg .Elements ()...);_fgfb =append (_fgfb ,_acca ...);return _fgfb ,nil ;};func _dca (_cgbff *_ae .PdfObjectStream ,_deg float64 )error {_bge ,_acae :=_df .NewXObjectImageFromStream (_cgbff );if _acae !=nil {return _acae ;};_abce ,_acae :=_bge .ToImage ();if _acae !=nil {return _acae ;};_dfa ,_acae :=_abce .ToGoImage ();if _acae !=nil {return _acae ;};_acdb :=int (_ff .RoundToEven (float64 (_abce .Width )*_deg ));_fcba :=int (_ff .RoundToEven (float64 (_abce .Height )*_deg ));_bcf :=_b .Rect (0,0,_acdb ,_fcba );var _ecd _f .Image ;var _fgg func (_b .Image )(*_df .Image ,error );switch _bge .ColorSpace .String (){case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_ecd =_b .NewRGBA (_bcf );_fgg =_df .ImageHandling .NewImageFromGoImage ;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_ecd =_b .NewGray (_bcf );_fgg =_df .ImageHandling .NewGrayImageFromGoImage ;default:return _ab .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",_bge .ColorSpace .String ());};_f .CatmullRom .Scale (_ecd ,_ecd .Bounds (),_dfa ,_dfa .Bounds (),_f .Over ,&_f .Options {});if _abce ,_acae =_fgg (_ecd );_acae !=nil {return _acae ;};_fbe :=_ae .MakeDict ();_fbe .Set ("\u0051u\u0061\u006c\u0069\u0074\u0079",_ae .MakeInteger (100));_fbe .Set ("\u0050r\u0065\u0064\u0069\u0063\u0074\u006fr",_ae .MakeInteger (1));_bge .Filter .UpdateParams (_fbe );if _acae =_bge .SetImage (_abce ,nil );_acae !=nil {return _acae ;};_bge .ToPdfObject ();return nil ;};