unipdf/model/optimize/optimize.go
2021-01-07 14:20:10 +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 (_fc "bytes";_f "crypto/md5";_dgc "errors";_g "fmt";_ge "github.com/unidoc/unipdf/v3/common";_gd "github.com/unidoc/unipdf/v3/contentstream";_c "github.com/unidoc/unipdf/v3/core";_fg "github.com/unidoc/unipdf/v3/extractor";_gg "github.com/unidoc/unipdf/v3/internal/textencoding";_ed "github.com/unidoc/unipdf/v3/model";_gef "github.com/unidoc/unitype";_d "golang.org/x/image/draw";_cg "image";_dg "math";);
// CompressStreams compresses uncompressed streams.
// It implements interface model.Optimizer.
type CompressStreams struct{};func _ga (_dca *_c .PdfObjectStream )error {_aa ,_da :=_c .DecodeStream (_dca );if _da !=nil {return _da ;};_gfc :=_gd .NewContentStreamParser (string (_aa ));_ca ,_da :=_gfc .Parse ();if _da !=nil {return _da ;};_ca =_bbg (_ca );_bg :=_ca .Bytes ();if len (_bg )>=len (_aa ){return nil ;};_ae ,_da :=_c .MakeStream (_ca .Bytes (),_c .NewFlateEncoder ());if _da !=nil {return _da ;};_dca .Stream =_ae .Stream ;_dca .Merge (_ae .PdfObjectDictionary );return nil ;};
// ObjectStreams groups PDF objects to object streams.
// It implements interface model.Optimizer.
type ObjectStreams struct{};
// Optimize optimizes PDF objects to decrease PDF size.
func (_bba *CombineDuplicateDirectObjects )Optimize (objects []_c .PdfObject )(_gc []_c .PdfObject ,_geg error ){_ebb (objects );_eea :=make (map[string ][]*_c .PdfObjectDictionary );var _afb func (_ddc *_c .PdfObjectDictionary );_afb =func (_cfb *_c .PdfObjectDictionary ){for _ ,_dec :=range _cfb .Keys (){_dega :=_cfb .Get (_dec );if _gde ,_dde :=_dega .(*_c .PdfObjectDictionary );_dde {_bdb :=_f .New ();_bdb .Write ([]byte (_gde .WriteString ()));_egfe :=string (_bdb .Sum (nil ));_eea [_egfe ]=append (_eea [_egfe ],_gde );_afb (_gde );};};};for _ ,_cfbf :=range objects {_fdcc ,_gdc :=_cfbf .(*_c .PdfIndirectObject );if !_gdc {continue ;};if _bbe ,_edfbg :=_fdcc .PdfObject .(*_c .PdfObjectDictionary );_edfbg {_afb (_bbe );};};_dbfa :=make ([]_c .PdfObject ,0,len (_eea ));_bcg :=make (map[_c .PdfObject ]_c .PdfObject );for _ ,_eaa :=range _eea {if len (_eaa )< 2{continue ;};_gece :=_c .MakeDict ();_gece .Merge (_eaa [0]);_bfd :=_c .MakeIndirectObject (_gece );_dbfa =append (_dbfa ,_bfd );for _ace :=0;_ace < len (_eaa );_ace ++{_bfg :=_eaa [_ace ];_bcg [_bfg ]=_bfd ;};};_gc =make ([]_c .PdfObject ,len (objects ));copy (_gc ,objects );_gc =append (_dbfa ,_gc ...);_cdd (_gc ,_bcg );return _gc ,nil ;};type imageInfo struct{ColorSpace _c .PdfObjectName ;BitsPerComponent int ;ColorComponents int ;Width int ;Height int ;Stream *_c .PdfObjectStream ;PPI float64 ;};
// CombineIdenticalIndirectObjects combines identical indirect objects.
// It implements interface model.Optimizer.
type CombineIdenticalIndirectObjects struct{};
// 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 ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_edff *CleanFonts )Optimize (objects []_c .PdfObject )(_ffde []_c .PdfObject ,_deg error ){var _def map[*_c .PdfObjectStream ]struct{};if _edff .Subset {var _dge error ;_def ,_dge =_gfg (objects );if _dge !=nil {return nil ,_dge ;};};for _ ,_bgff :=range objects {_aeba ,_cda :=_c .GetStream (_bgff );if !_cda {continue ;};if _ ,_edb :=_def [_aeba ];_edb {continue ;};_cab ,_gfd :=_c .NewEncoderFromStream (_aeba );if _gfd !=nil {_ge .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",_gfd );continue ;};_egf ,_gfd :=_cab .DecodeStream (_aeba );if _gfd !=nil {_ge .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",_gfd );continue ;};if len (_egf )< 4{continue ;};_gga :=string (_egf [:4]);if _gga =="\u004f\u0054\u0054\u004f"{continue ;};if _gga !="\u0000\u0001\u0000\u0000"&&_gga !="\u0074\u0072\u0075\u0065"{continue ;};_afc ,_gfd :=_gef .Parse (_fc .NewReader (_egf ));if _gfd !=nil {_ge .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",_gfd );continue ;};_gfd =_afc .Optimize ();if _gfd !=nil {continue ;};var _ecd _fc .Buffer ;_gfd =_afc .Write (&_ecd );if _gfd !=nil {_ge .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",_gfd );continue ;};if _ecd .Len ()> len (_egf ){_ge .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 ;};_edfb ,_gfd :=_c .MakeStream (_ecd .Bytes (),_c .NewFlateEncoder ());if _gfd !=nil {continue ;};*_aeba =*_edfb ;_aeba .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_c .MakeInteger (int64 (_ecd .Len ())));};return objects ,nil ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_bfac *CompressStreams )Optimize (objects []_c .PdfObject )(_accb []_c .PdfObject ,_dbg error ){_accb =make ([]_c .PdfObject ,len (objects ));copy (_accb ,objects );for _ ,_gge :=range objects {_aecf ,_agd :=_c .GetStream (_gge );if !_agd {continue ;};if _eec :=_aecf .Get ("\u0046\u0069\u006c\u0074\u0065\u0072");_eec !=nil {if _ ,_cce :=_c .GetName (_eec );_cce {continue ;};if _bff ,_ebfg :=_c .GetArray (_eec );_ebfg &&_bff .Len ()> 0{continue ;};};_bcc :=_c .NewFlateEncoder ();var _bee []byte ;_bee ,_dbg =_bcc .EncodeBytes (_aecf .Stream );if _dbg !=nil {return _accb ,_dbg ;};_cef :=_bcc .MakeStreamDict ();if len (_bee )+len (_cef .WriteString ())< len (_aecf .Stream ){_aecf .Stream =_bee ;_aecf .PdfObjectDictionary .Merge (_cef );_aecf .PdfObjectDictionary .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_c .MakeInteger (int64 (len (_aecf .Stream ))));};};return _accb ,nil ;};type content struct{_ddd string ;_cdg *_ed .PdfPageResources ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_dcd *Chain )Optimize (objects []_c .PdfObject )(_gf []_c .PdfObject ,_b error ){_gf =objects ;for _ ,_bb :=range _dcd ._eg {_gf ,_b =_bb .Optimize (_gf );if _b !=nil {return _gf ,_b ;};};return _gf ,nil ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_ddfg *ImagePPI )Optimize (objects []_c .PdfObject )(_gea []_c .PdfObject ,_aeg error ){if _ddfg .ImageUpperPPI <=0{return objects ,nil ;};_agce :=_ggac (objects );if len (_agce )==0{return objects ,nil ;};_dfe :=make (map[_c .PdfObject ]struct{});for _ ,_cdac :=range _agce {_gab :=_cdac .Stream .PdfObjectDictionary .Get (_c .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_dfe [_gab ]=struct{}{};};_eecf :=make (map[*_c .PdfObjectStream ]*imageInfo );for _ ,_bffd :=range _agce {_eecf [_bffd .Stream ]=_bffd ;};var _dddg *_c .PdfObjectDictionary ;for _ ,_feae :=range objects {if _aebab ,_cafd :=_c .GetDict (_feae );_dddg ==nil &&_cafd {if _afe ,_cea :=_c .GetName (_aebab .Get (_c .PdfObjectName ("\u0054\u0079\u0070\u0065")));_cea &&*_afe =="\u0043a\u0074\u0061\u006c\u006f\u0067"{_dddg =_aebab ;};};};if _dddg ==nil {return objects ,nil ;};_fga ,_fbe :=_c .GetDict (_dddg .Get (_c .PdfObjectName ("\u0050\u0061\u0067e\u0073")));if !_fbe {return objects ,nil ;};_aceb ,_bdc :=_c .GetArray (_fga .Get (_c .PdfObjectName ("\u004b\u0069\u0064\u0073")));if !_bdc {return objects ,nil ;};_bfgc :=make (map[string ]*imageInfo );for _ ,_gdeb :=range _aceb .Elements (){_cfgd ,_ddgd :=_c .GetDict (_gdeb );if !_ddgd {continue ;};_eafbd ,_cedd :=_c .GetArray (_cfgd .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));if !_cedd {continue ;};_gdad ,_dae :=_c .GetDict (_cfgd .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_dae {continue ;};_efb ,_cagc :=_c .GetDict (_gdad .Get ("\u0058O\u0062\u006a\u0065\u0063\u0074"));if !_cagc {continue ;};_dgag :=_efb .Keys ();for _ ,_ecec :=range _dgag {if _bbgc ,_cbdf :=_c .GetStream (_efb .Get (_ecec ));_cbdf {if _ebeg ,_aab :=_eecf [_bbgc ];_aab {_bfgc [string (_ecec )]=_ebeg ;};};};for _ ,_ffaa :=range _eafbd .Elements (){if _afd ,_dbbb :=_c .GetStream (_ffaa );_dbbb {_bca ,_dgfg :=_c .NewEncoderFromStream (_afd );if _dgfg !=nil {return nil ,_dgfg ;};_cadf ,_dgfg :=_bca .DecodeStream (_afd );if _dgfg !=nil {return nil ,_dgfg ;};_gad :=_gd .NewContentStreamParser (string (_cadf ));_fda ,_dgfg :=_gad .Parse ();if _dgfg !=nil {return nil ,_dgfg ;};_efdaf ,_eaab :=1.0,1.0;for _ ,_cagd :=range *_fda {if _cagd .Operand =="\u0051"{_efdaf ,_eaab =1.0,1.0;};if _cagd .Operand =="\u0063\u006d"&&len (_cagd .Params )==6{if _dcae ,_eabf :=_c .GetFloatVal (_cagd .Params [0]);_eabf {_efdaf =_efdaf *_dcae ;};if _dfg ,_fgbe :=_c .GetFloatVal (_cagd .Params [3]);_fgbe {_eaab =_eaab *_dfg ;};if _cee ,_dgea :=_c .GetIntVal (_cagd .Params [0]);_dgea {_efdaf =_efdaf *float64 (_cee );};if _fegd ,_gabf :=_c .GetIntVal (_cagd .Params [3]);_gabf {_eaab =_eaab *float64 (_fegd );};};if _cagd .Operand =="\u0044\u006f"&&len (_cagd .Params )==1{_bde ,_fgbed :=_c .GetName (_cagd .Params [0]);if !_fgbed {continue ;};if _agaa ,_eeg :=_bfgc [string (*_bde )];_eeg {_egb ,_ecece :=_efdaf /72.0,_eaab /72.0;_cbb ,_egce :=float64 (_agaa .Width )/_egb ,float64 (_agaa .Height )/_ecece ;if _egb ==0||_ecece ==0{_cbb =72.0;_egce =72.0;};_agaa .PPI =_dg .Max (_agaa .PPI ,_cbb );_agaa .PPI =_dg .Max (_agaa .PPI ,_egce );};};};};};};for _ ,_fgcc :=range _agce {if _ ,_dcf :=_dfe [_fgcc .Stream ];_dcf {continue ;};if _fgcc .PPI <=_ddfg .ImageUpperPPI {continue ;};_acab :=_ddfg .ImageUpperPPI /_fgcc .PPI ;if _caab :=_bfe (_fgcc .Stream ,_acab );_caab !=nil {_ge .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",_caab );}else {if _ebg ,_bea :=_c .GetStream (_fgcc .Stream .PdfObjectDictionary .Get (_c .PdfObjectName ("\u0053\u004d\u0061s\u006b")));_bea {if _bgb :=_bfe (_ebg ,_acab );_bgb !=nil {return nil ,_bgb ;};};};};return objects ,nil ;};
// Append appends optimizers to the chain.
func (_dc *Chain )Append (optimizers ..._ed .Optimizer ){_dc ._eg =append (_dc ._eg ,optimizers ...)};func _bfe (_cegg *_c .PdfObjectStream ,_dee float64 )error {_dffba ,_cbf :=_ed .NewXObjectImageFromStream (_cegg );if _cbf !=nil {return _cbf ;};_ffge ,_cbf :=_dffba .ToImage ();if _cbf !=nil {return _cbf ;};_eeae ,_cbf :=_ffge .ToGoImage ();if _cbf !=nil {return _cbf ;};_acec :=int (_dg .RoundToEven (float64 (_ffge .Width )*_dee ));_ffb :=int (_dg .RoundToEven (float64 (_ffge .Height )*_dee ));_ebede :=_cg .Rect (0,0,_acec ,_ffb );var _edba _d .Image ;var _dfa func (_cg .Image )(*_ed .Image ,error );switch _dffba .ColorSpace .String (){case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_edba =_cg .NewRGBA (_ebede );_dfa =_ed .ImageHandling .NewImageFromGoImage ;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_edba =_cg .NewGray (_ebede );_dfa =_ed .ImageHandling .NewGrayImageFromGoImage ;default:return _g .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",_dffba .ColorSpace .String ());};_d .CatmullRom .Scale (_edba ,_edba .Bounds (),_eeae ,_eeae .Bounds (),_d .Over ,&_d .Options {});if _ffge ,_cbf =_dfa (_edba );_cbf !=nil {return _cbf ;};_abb :=_c .MakeDict ();_abb .Set ("\u0051u\u0061\u006c\u0069\u0074\u0079",_c .MakeInteger (100));_abb .Set ("\u0050r\u0065\u0064\u0069\u0063\u0074\u006fr",_c .MakeInteger (1));_dffba .Filter .UpdateParams (_abb );if _cbf =_dffba .SetImage (_ffge ,nil );_cbf !=nil {return _cbf ;};_dffba .ToPdfObject ();return nil ;};
// Chain allows to use sequence of optimizers.
// It implements interface model.Optimizer.
type Chain struct{_eg []_ed .Optimizer };
// New creates a optimizers chain from options.
func New (options Options )*Chain {_fggc :=new (Chain );if options .CleanFonts ||options .SubsetFonts {_fggc .Append (&CleanFonts {Subset :options .SubsetFonts });};if options .CleanContentstream {_fggc .Append (new (CleanContentstream ));};if options .ImageUpperPPI > 0{_dfb :=new (ImagePPI );_dfb .ImageUpperPPI =options .ImageUpperPPI ;_fggc .Append (_dfb );};if options .ImageQuality > 0{_ccg :=new (Image );_ccg .ImageQuality =options .ImageQuality ;_fggc .Append (_ccg );};if options .CombineDuplicateDirectObjects {_fggc .Append (new (CombineDuplicateDirectObjects ));};if options .CombineDuplicateStreams {_fggc .Append (new (CombineDuplicateStreams ));};if options .CombineIdenticalIndirectObjects {_fggc .Append (new (CombineIdenticalIndirectObjects ));};if options .UseObjectStreams {_fggc .Append (new (ObjectStreams ));};if options .CompressStreams {_fggc .Append (new (CompressStreams ));};return _fggc ;};
// 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 (_eacc *CombineDuplicateStreams )Optimize (objects []_c .PdfObject )(_ddea []_c .PdfObject ,_dad error ){_cabe :=make (map[_c .PdfObject ]_c .PdfObject );_agf :=make (map[_c .PdfObject ]struct{});_bgfg :=make (map[string ][]*_c .PdfObjectStream );for _ ,_dff :=range objects {if _acc ,_gcb :=_dff .(*_c .PdfObjectStream );_gcb {_dbc :=_f .New ();_dbc .Write (_acc .Stream );_gcf :=string (_dbc .Sum (nil ));_bgfg [_gcf ]=append (_bgfg [_gcf ],_acc );};};for _ ,_fbdb :=range _bgfg {if len (_fbdb )< 2{continue ;};_fdg :=_fbdb [0];for _beg :=1;_beg < len (_fbdb );_beg ++{_fgd :=_fbdb [_beg ];_cabe [_fgd ]=_fdg ;_agf [_fgd ]=struct{}{};};};_ddea =make ([]_c .PdfObject ,0,len (objects )-len (_agf ));for _ ,_ggd :=range objects {if _ ,_dffb :=_agf [_ggd ];_dffb {continue ;};_ddea =append (_ddea ,_ggd );};_cdd (_ddea ,_cabe );return _ddea ,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 ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_ee *CleanContentstream )Optimize (objects []_c .PdfObject )(_ac []_c .PdfObject ,_fa error ){_dcdc :=map[*_c .PdfObjectStream ]struct{}{};var _ec []*_c .PdfObjectStream ;_ce :=func (_faa *_c .PdfObjectStream ){if _ ,_ecg :=_dcdc [_faa ];!_ecg {_dcdc [_faa ]=struct{}{};_ec =append (_ec ,_faa );};};for _ ,_fee :=range objects {switch _cc :=_fee .(type ){case *_c .PdfIndirectObject :switch _fad :=_cc .PdfObject .(type ){case *_c .PdfObjectDictionary :if _ced ,_be :=_c .GetName (_fad .Get ("\u0054\u0079\u0070\u0065"));!_be ||_ced .String ()!="\u0050\u0061\u0067\u0065"{continue ;};if _fd ,_cgc :=_c .GetStream (_fad .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_cgc {_ce (_fd );}else if _eed ,_cag :=_c .GetArray (_fad .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_cag {for _ ,_ea :=range _eed .Elements (){if _eda ,_aeb :=_c .GetStream (_ea );_aeb {_ce (_eda );};};};};case *_c .PdfObjectStream :if _gdd ,_efd :=_c .GetName (_cc .Get ("\u0054\u0079\u0070\u0065"));!_efd ||_gdd .String ()!="\u0058O\u0062\u006a\u0065\u0063\u0074"{continue ;};if _ece ,_ecc :=_c .GetName (_cc .Get ("\u0053u\u0062\u0074\u0079\u0070\u0065"));!_ecc ||_ece .String ()!="\u0046\u006f\u0072\u006d"{continue ;};_ce (_cc );};};for _ ,_ff :=range _ec {_fa =_ga (_ff );if _fa !=nil {return nil ,_fa ;};};return objects ,nil ;};func _gfg (_dd []_c .PdfObject )(_gda map[*_c .PdfObjectStream ]struct{},_dgf error ){_gda =map[*_c .PdfObjectStream ]struct{}{};_ged :=map[*_ed .PdfFont ]struct{}{};_ab :=_defd (_dd );for _ ,_bed :=range _ab ._cdgb {_feg ,_de :=_c .GetDict (_bed .PdfObject );if !_de {continue ;};_efc ,_de :=_c .GetDict (_feg .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_de {continue ;};_eab ,_ :=_ceb (_feg .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_gb ,_db :=_ed .NewPdfPageResourcesFromDict (_efc );if _db !=nil {return nil ,_db ;};_faf :=[]content {{_ddd :_eab ,_cdg :_gb }};_cd :=_fbd (_feg .Get ("\u0041\u006e\u006e\u006f\u0074\u0073"));if _cd !=nil {_faf =append (_faf ,_cd ...);};for _ ,_gfgb :=range _faf {_ddg ,_cgf :=_fg .NewFromContents (_gfgb ._ddd ,_gfgb ._cdg );if _cgf !=nil {return nil ,_cgf ;};_ege ,_ ,_ ,_cgf :=_ddg .ExtractPageText ();if _cgf !=nil {return nil ,_cgf ;};for _ ,_cgd :=range _ege .Marks ().Elements (){if _cgd .Font ==nil {continue ;};if _ ,_eaf :=_ged [_cgd .Font ];!_eaf {_ged [_cgd .Font ]=struct{}{};};};};};_ccfe :=map[*_c .PdfObjectStream ][]*_ed .PdfFont {};for _deb :=range _ged {_fec :=_deb .FontDescriptor ();if _fec ==nil ||_fec .FontFile2 ==nil {continue ;};_dbb ,_cbd :=_c .GetStream (_fec .FontFile2 );if !_cbd {continue ;};_ccfe [_dbb ]=append (_ccfe [_dbb ],_deb );};for _cad :=range _ccfe {var _dga []rune ;var _aaf []_gef .GlyphIndex ;for _ ,_cbg :=range _ccfe [_cad ]{switch _dgb :=_cbg .Encoder ().(type ){case *_gg .IdentityEncoder :_efg :=_dgb .RegisteredRunes ();_agb :=make ([]_gef .GlyphIndex ,len (_efg ));for _aafb ,_dab :=range _efg {_agb [_aafb ]=_gef .GlyphIndex (_dab );};_aaf =append (_aaf ,_agb ...);case *_gg .TrueTypeFontEncoder :_bf :=_dgb .RegisteredRunes ();_dga =append (_dga ,_bf ...);case _gg .SimpleEncoder :_ddf :=_dgb .Charcodes ();for _ ,_agc :=range _ddf {_cca ,_agcb :=_dgb .CharcodeToRune (_agc );if !_agcb {_ge .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",_agc );continue ;};_dga =append (_dga ,_cca );};};};_dgf =_gfb (_cad ,_dga ,_aaf );if _dgf !=nil {_ge .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",_dgf );return nil ,_dgf ;};_gda [_cad ]=struct{}{};};return _gda ,nil ;};func _cdd (_bbf []_c .PdfObject ,_daed map[_c .PdfObject ]_c .PdfObject ){if len (_daed )==0{return ;};for _bad ,_ceeb :=range _bbf {if _dbcc ,_ebfga :=_daed [_ceeb ];_ebfga {_bbf [_bad ]=_dbcc ;continue ;};_daed [_ceeb ]=_ceeb ;switch _gdac :=_ceeb .(type ){case *_c .PdfObjectArray :_ccec :=make ([]_c .PdfObject ,_gdac .Len ());copy (_ccec ,_gdac .Elements ());_cdd (_ccec ,_daed );for _bada ,_begf :=range _ccec {_gdac .Set (_bada ,_begf );};case *_c .PdfObjectStreams :_cdd (_gdac .Elements (),_daed );case *_c .PdfObjectStream :_bfc :=[]_c .PdfObject {_gdac .PdfObjectDictionary };_cdd (_bfc ,_daed );_gdac .PdfObjectDictionary =_bfc [0].(*_c .PdfObjectDictionary );case *_c .PdfObjectDictionary :_bbgb :=_gdac .Keys ();_ggf :=make ([]_c .PdfObject ,len (_bbgb ));for _efdc ,_fade :=range _bbgb {_ggf [_efdc ]=_gdac .Get (_fade );};_cdd (_ggf ,_daed );for _gdfg ,_cagbg :=range _bbgb {_gdac .Set (_cagbg ,_ggf [_gdfg ]);};case *_c .PdfIndirectObject :_dfed :=[]_c .PdfObject {_gdac .PdfObject };_cdd (_dfed ,_daed );_gdac .PdfObject =_dfed [0];};};};func _ceb (_bgg _c .PdfObject )(_cbdcd string ,_agdd []_c .PdfObject ){var _bgc _fc .Buffer ;switch _agff :=_bgg .(type ){case *_c .PdfIndirectObject :_agdd =append (_agdd ,_agff );_bgg =_agff .PdfObject ;};switch _efef :=_bgg .(type ){case *_c .PdfObjectStream :if _fdcee ,_gedd :=_c .DecodeStream (_efef );_gedd ==nil {_bgc .Write (_fdcee );_agdd =append (_agdd ,_efef );};case *_c .PdfObjectArray :for _ ,_cadg :=range _efef .Elements (){switch _ggee :=_cadg .(type ){case *_c .PdfObjectStream :if _gadg ,_cefb :=_c .DecodeStream (_ggee );_cefb ==nil {_bgc .Write (_gadg );_agdd =append (_agdd ,_ggee );};};};};return _bgc .String (),_agdd ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_bdbb *Image )Optimize (objects []_c .PdfObject )(_bgd []_c .PdfObject ,_cbcb error ){if _bdbb .ImageQuality <=0{return objects ,nil ;};_egc :=_ggac (objects );if len (_egc )==0{return objects ,nil ;};_cfed :=make (map[_c .PdfObject ]_c .PdfObject );_ebfa :=make (map[_c .PdfObject ]struct{});for _ ,_eag :=range _egc {_acd :=_eag .Stream .PdfObjectDictionary .Get (_c .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_ebfa [_acd ]=struct{}{};};for _ccd ,_daga :=range _egc {_fbc :=_daga .Stream ;if _ ,_bdf :=_ebfa [_fbc ];_bdf {continue ;};_fce ,_dba :=_c .NewEncoderFromStream (_fbc );if _dba !=nil {_ge .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 ;};_ba ,_dba :=_fce .DecodeStream (_fbc );if _dba !=nil {_ge .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 ;};_efdg :=_c .NewDCTEncoder ();_efdg .ColorComponents =_daga .ColorComponents ;_efdg .Quality =_bdbb .ImageQuality ;_efdg .BitsPerComponent =_daga .BitsPerComponent ;_efdg .Width =_daga .Width ;_efdg .Height =_daga .Height ;_edef ,_dba :=_efdg .EncodeBytes (_ba );if _dba !=nil {_ge .Log .Debug ("\u0045R\u0052\u004f\u0052\u003a\u0020\u0025v",_dba );return nil ,_dba ;};var _aag _c .StreamEncoder ;_aag =_efdg ;{_cfa :=_c .NewFlateEncoder ();_acca :=_c .NewMultiEncoder ();_acca .AddEncoder (_cfa );_acca .AddEncoder (_efdg );_gba ,_gdec :=_acca .EncodeBytes (_ba );if _gdec !=nil {return nil ,_gdec ;};if len (_gba )< len (_edef ){_ge .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 (_edef ),len (_gba ),len (_fbc .Stream ));_edef =_gba ;_aag =_acca ;};};_dcab :=len (_fbc .Stream );if _dcab < len (_edef ){continue ;};_dcag :=&_c .PdfObjectStream {Stream :_edef };_dcag .PdfObjectReference =_fbc .PdfObjectReference ;_dcag .PdfObjectDictionary =_c .MakeDict ();_dcag .Merge (_fbc .PdfObjectDictionary );_dcag .Merge (_aag .MakeStreamDict ());_dcag .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_c .MakeInteger (int64 (len (_edef ))));_cfed [_fbc ]=_dcag ;_egc [_ccd ].Stream =_dcag ;};_bgd =make ([]_c .PdfObject ,len (objects ));copy (_bgd ,objects );_cdd (_bgd ,_cfed );return _bgd ,nil ;};func _fbd (_cfg _c .PdfObject )[]content {if _cfg ==nil {return nil ;};_cba ,_gfca :=_c .GetArray (_cfg );if !_gfca {_ge .Log .Debug ("\u0041\u006e\u006e\u006fts\u0020\u006e\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");return nil ;};var _ecgf []content ;for _ ,_fgg :=range _cba .Elements (){_bd ,_cfe :=_c .GetDict (_fgg );if !_cfe {_ge .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 ;};_ggb ,_cfe :=_c .GetDict (_bd .Get ("\u0041\u0050"));if !_cfe {_ge .Log .Debug ("\u004e\u006f\u0020\u0041P \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_eac :=_c .TraceToDirectObject (_ggb .Get ("\u004e"));if _eac ==nil {_ge .Log .Debug ("N\u006f\u0020\u004e\u0020en\u0074r\u0079\u0020\u002d\u0020\u0073k\u0069\u0070\u0070\u0069\u006e\u0067");continue ;};var _fff *_c .PdfObjectStream ;switch _caa :=_eac .(type ){case *_c .PdfObjectDictionary :_ebe ,_dede :=_c .GetName (_bd .Get ("\u0041\u0053"));if !_dede {_ge .Log .Debug ("\u004e\u006f\u0020\u0041S \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_fff ,_dede =_c .GetStream (_caa .Get (*_ebe ));if !_dede {_ge .Log .Debug ("\u0046o\u0072\u006d\u0020\u006eo\u0074\u0020\u0066\u006f\u0075n\u0064 \u002d \u0073\u006b\u0069\u0070\u0070\u0069\u006eg");continue ;};case *_c .PdfObjectStream :_fff =_caa ;};if _fff ==nil {_ge .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 ;};_ad ,_fdc :=_ed .NewXObjectFormFromStream (_fff );if _fdc !=nil {_ge .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",_fdc );continue ;};_bbgg ,_fdc :=_ad .GetContentStream ();if _fdc !=nil {_ge .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",_fdc );continue ;};_ecgf =append (_ecgf ,content {_ddd :string (_bbgg ),_cdg :_ad .Resources });};return _ecgf ;};func _ggac (_cagb []_c .PdfObject )[]*imageInfo {_cge :=_c .PdfObjectName ("\u0053u\u0062\u0074\u0079\u0070\u0065");_ccb :=make (map[*_c .PdfObjectStream ]struct{});var _dedf error ;var _bga []*imageInfo ;for _ ,_bce :=range _cagb {_gdf ,_aecd :=_c .GetStream (_bce );if !_aecd {continue ;};if _ ,_bgae :=_ccb [_gdf ];_bgae {continue ;};_ccb [_gdf ]=struct{}{};_ddff :=_gdf .PdfObjectDictionary .Get (_cge );_ceg ,_aecd :=_c .GetName (_ddff );if !_aecd ||string (*_ceg )!="\u0049\u006d\u0061g\u0065"{continue ;};_degb :=&imageInfo {BitsPerComponent :8,Stream :_gdf };if _degb .ColorSpace ,_dedf =_ed .DetermineColorspaceNameFromPdfObject (_gdf .PdfObjectDictionary .Get ("\u0043\u006f\u006c\u006f\u0072\u0053\u0070\u0061\u0063\u0065"));_dedf !=nil {_ge .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",_dedf );continue ;};if _caf ,_gcae :=_c .GetIntVal (_gdf .PdfObjectDictionary .Get ("\u0042\u0069t\u0073\u0050\u0065r\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074"));_gcae {_degb .BitsPerComponent =_caf ;};if _gefg ,_fbf :=_c .GetIntVal (_gdf .PdfObjectDictionary .Get ("\u0057\u0069\u0064t\u0068"));_fbf {_degb .Width =_gefg ;};if _ccbe ,_ffgf :=_c .GetIntVal (_gdf .PdfObjectDictionary .Get ("\u0048\u0065\u0069\u0067\u0068\u0074"));_ffgf {_degb .Height =_ccbe ;};switch _degb .ColorSpace {case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_degb .ColorComponents =3;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_degb .ColorComponents =1;default:_ge .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",_degb .ColorSpace );continue ;};_bga =append (_bga ,_degb );};return _bga ;};type objectStructure struct{_decd *_c .PdfObjectDictionary ;_fcd *_c .PdfObjectDictionary ;_cdgb []*_c .PdfIndirectObject ;};func _defd (_bge []_c .PdfObject )objectStructure {_fdb :=objectStructure {};_bbggd :=false ;for _ ,_eccf :=range _bge {switch _cbag :=_eccf .(type ){case *_c .PdfIndirectObject :_cece ,_fcf :=_c .GetDict (_cbag );if !_fcf {continue ;};_gac ,_fcf :=_c .GetName (_cece .Get ("\u0054\u0079\u0070\u0065"));if !_fcf {continue ;};switch _gac .String (){case "\u0043a\u0074\u0061\u006c\u006f\u0067":_fdb ._decd =_cece ;_bbggd =true ;};};if _bbggd {break ;};};if !_bbggd {return _fdb ;};_faaf ,_edad :=_c .GetDict (_fdb ._decd .Get ("\u0050\u0061\u0067e\u0073"));if !_edad {return _fdb ;};_fdb ._fcd =_faaf ;_gdeg ,_edad :=_c .GetArray (_faaf .Get ("\u004b\u0069\u0064\u0073"));if !_edad {return _fdb ;};for _ ,_abbd :=range _gdeg .Elements (){_ega ,_dbbg :=_c .GetIndirect (_abbd );if !_dbbg {break ;};_fdb ._cdgb =append (_fdb ._cdgb ,_ega );};return _fdb ;};
// CombineDuplicateStreams combines duplicated streams by its data hash.
// It implements interface model.Optimizer.
type CombineDuplicateStreams struct{};
// 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 _bbg (_cf *_gd .ContentStreamOperations )*_gd .ContentStreamOperations {if _cf ==nil {return nil ;};_ede :=_gd .ContentStreamOperations {};for _ ,_eb :=range *_cf {switch _eb .Operand {case "\u0042\u0044\u0043","\u0042\u004d\u0043","\u0045\u004d\u0043":continue ;case "\u0054\u006d":if len (_eb .Params )==6{if _a ,_fe :=_c .GetNumbersAsFloat (_eb .Params );_fe ==nil {if _a [0]==1&&_a [1]==0&&_a [2]==0&&_a [3]==1{_eb =&_gd .ContentStreamOperation {Params :[]_c .PdfObject {_eb .Params [4],_eb .Params [5]},Operand :"\u0054\u0064"};};};};};_ede =append (_ede ,_eb );};return &_ede ;};
// 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 ;};func _ebb (_bcge []_c .PdfObject ){for _dea ,_adg :=range _bcge {switch _eedf :=_adg .(type ){case *_c .PdfIndirectObject :_eedf .ObjectNumber =int64 (_dea +1);_eedf .GenerationNumber =0;case *_c .PdfObjectStream :_eedf .ObjectNumber =int64 (_dea +1);_eedf .GenerationNumber =0;case *_c .PdfObjectStreams :_eedf .ObjectNumber =int64 (_dea +1);_eedf .GenerationNumber =0;};};};
// 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 _gfb (_df *_c .PdfObjectStream ,_gbe []rune ,_gec []_gef .GlyphIndex )error {_df ,_dbf :=_c .GetStream (_df );if !_dbf {_ge .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 _dgc .New ("\u0066\u006f\u006e\u0074fi\u006c\u0065\u0032\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_ffd ,_bgf :=_c .DecodeStream (_df );if _bgf !=nil {_ge .Log .Debug ("\u0044\u0065c\u006f\u0064\u0065 \u0065\u0072\u0072\u006f\u0072\u003a\u0020\u0025\u0076",_bgf );return _bgf ;};_bfa ,_bgf :=_gef .Parse (_fc .NewReader (_ffd ));if _bgf !=nil {_ge .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 (_df .Stream ));return _bgf ;};_beb :=_gec ;if len (_gbe )> 0{_ggg :=_bfa .LookupRunes (_gbe );_beb =append (_beb ,_ggg ...);};_bfa ,_bgf =_bfa .SubsetKeepIndices (_beb );if _bgf !=nil {_ge .Log .Debug ("\u0045R\u0052\u004f\u0052\u0020s\u0075\u0062\u0073\u0065\u0074t\u0069n\u0067 \u0066\u006f\u006e\u0074\u003a\u0020\u0025v",_bgf );return _bgf ;};var _af _fc .Buffer ;_bgf =_bfa .Write (&_af );if _bgf !=nil {_ge .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_bgf );return _bgf ;};if _af .Len ()> len (_ffd ){_ge .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 ;};_bec ,_bgf :=_c .MakeStream (_af .Bytes (),_c .NewFlateEncoder ());if _bgf !=nil {_ge .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_bgf );return _bgf ;};*_df =*_bec ;_df .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_c .MakeInteger (int64 (_af .Len ())));return nil ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_bbc *CombineIdenticalIndirectObjects )Optimize (objects []_c .PdfObject )(_ebed []_c .PdfObject ,_gca error ){_ebb (objects );_ggc :=make (map[_c .PdfObject ]_c .PdfObject );_gdda :=make (map[_c .PdfObject ]struct{});_dfd :=make (map[string ][]*_c .PdfIndirectObject );for _ ,_cdf :=range objects {_ebf ,_eafb :=_cdf .(*_c .PdfIndirectObject );if !_eafb {continue ;};if _gdg ,_efda :=_ebf .PdfObject .(*_c .PdfObjectDictionary );_efda {if _dag ,_bef :=_gdg .Get ("\u0054\u0079\u0070\u0065").(*_c .PdfObjectName );_bef &&*_dag =="\u0050\u0061\u0067\u0065"{continue ;};_gecc :=_f .New ();_gecc .Write ([]byte (_gdg .WriteString ()));_cgb :=string (_gecc .Sum (nil ));_dfd [_cgb ]=append (_dfd [_cgb ],_ebf );};};for _ ,_agcc :=range _dfd {if len (_agcc )< 2{continue ;};_aec :=_agcc [0];for _fbb :=1;_fbb < len (_agcc );_fbb ++{_fea :=_agcc [_fbb ];_ggc [_fea ]=_aec ;_gdda [_fea ]=struct{}{};};};_ebed =make ([]_c .PdfObject ,0,len (objects )-len (_gdda ));for _ ,_fdce :=range objects {if _ ,_fae :=_gdda [_fdce ];_fae {continue ;};_ebed =append (_ebed ,_fdce );};_cdd (_ebed ,_ggc );return _ebed ,nil ;};
// Optimize optimizes PDF objects to decrease PDF size.
func (_eae *ObjectStreams )Optimize (objects []_c .PdfObject )(_bcb []_c .PdfObject ,_fab error ){_agcd :=&_c .PdfObjectStreams {};_ggdb :=make ([]_c .PdfObject ,0,len (objects ));for _ ,_aff :=range objects {if _fafe ,_dcfe :=_aff .(*_c .PdfIndirectObject );_dcfe &&_fafe .GenerationNumber ==0{_agcd .Append (_aff );}else {_ggdb =append (_ggdb ,_aff );};};if _agcd .Len ()==0{return _ggdb ,nil ;};_bcb =make ([]_c .PdfObject ,0,len (_ggdb )+_agcd .Len ()+1);if _agcd .Len ()> 1{_bcb =append (_bcb ,_agcd );};_bcb =append (_bcb ,_agcd .Elements ()...);_bcb =append (_bcb ,_ggdb ...);return _bcb ,nil ;};