mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-24 13:48:49 +08:00
99 lines
34 KiB
Go
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 (_gf "bytes";_ega "crypto/md5";_g "errors";_bd "fmt";_ee "github.com/unidoc/unipdf/v3/common";_gb "github.com/unidoc/unipdf/v3/contentstream";_e "github.com/unidoc/unipdf/v3/core";_aa "github.com/unidoc/unipdf/v3/extractor";_bf "github.com/unidoc/unipdf/v3/internal/textencoding";_ae "github.com/unidoc/unipdf/v3/model";_f "github.com/unidoc/unitype";_eg "golang.org/x/image/draw";_c "image";_b "math";);func _gaaa (_cbbc *_e .PdfObjectStream ,_eccc float64 )error {_dfd ,_fbb :=_ae .NewXObjectImageFromStream (_cbbc );if _fbb !=nil {return _fbb ;};_aedae ,_fbb :=_dfd .ToImage ();if _fbb !=nil {return _fbb ;};_beg ,_fbb :=_aedae .ToGoImage ();if _fbb !=nil {return _fbb ;};_dded :=int (_b .RoundToEven (float64 (_aedae .Width )*_eccc ));_ggd :=int (_b .RoundToEven (float64 (_aedae .Height )*_eccc ));_eca :=_c .Rect (0,0,_dded ,_ggd );var _dbdg _eg .Image ;var _bbd func (_c .Image )(*_ae .Image ,error );switch _dfd .ColorSpace .String (){case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_dbdg =_c .NewRGBA (_eca );_bbd =_ae .ImageHandling .NewImageFromGoImage ;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_dbdg =_c .NewGray (_eca );_bbd =_ae .ImageHandling .NewGrayImageFromGoImage ;default:return _bd .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",_dfd .ColorSpace .String ());};_eg .CatmullRom .Scale (_dbdg ,_dbdg .Bounds (),_beg ,_beg .Bounds (),_eg .Over ,&_eg .Options {});if _aedae ,_fbb =_bbd (_dbdg );_fbb !=nil {return _fbb ;};_ead :=_e .MakeDict ();_ead .Set ("\u0051u\u0061\u006c\u0069\u0074\u0079",_e .MakeInteger (100));_ead .Set ("\u0050r\u0065\u0064\u0069\u0063\u0074\u006fr",_e .MakeInteger (1));_dfd .Filter .UpdateParams (_ead );if _fbb =_dfd .SetImage (_aedae ,nil );_fbb !=nil {return _fbb ;};_dfd .ToPdfObject ();return nil ;};
|
|
|
|
// Append appends optimizers to the chain.
|
|
func (_d *Chain )Append (optimizers ..._ae .Optimizer ){_d ._ba =append (_d ._ba ,optimizers ...)};func _gbg (_dccc []_e .PdfObject )objectStructure {_gdd :=objectStructure {};_cgfe :=false ;for _ ,_gfee :=range _dccc {switch _fdc :=_gfee .(type ){case *_e .PdfIndirectObject :_fbdg ,_daa :=_e .GetDict (_fdc );if !_daa {continue ;};_eeff ,_daa :=_e .GetName (_fbdg .Get ("\u0054\u0079\u0070\u0065"));if !_daa {continue ;};switch _eeff .String (){case "\u0043a\u0074\u0061\u006c\u006f\u0067":_gdd ._efab =_fbdg ;_cgfe =true ;};};if _cgfe {break ;};};if !_cgfe {return _gdd ;};_bgca ,_fbeg :=_e .GetDict (_gdd ._efab .Get ("\u0050\u0061\u0067e\u0073"));if !_fbeg {return _gdd ;};_gdd ._afaf =_bgca ;_ecee ,_fbeg :=_e .GetArray (_bgca .Get ("\u004b\u0069\u0064\u0073"));if !_fbeg {return _gdd ;};for _ ,_deaga :=range _ecee .Elements (){_aeec ,_ceeb :=_e .GetIndirect (_deaga );if !_ceeb {break ;};_gdd ._dbce =append (_gdd ._dbce ,_aeec );};return _gdd ;};func _cdd (_cegf _e .PdfObject )[]content {if _cegf ==nil {return nil ;};_gfag ,_cdf :=_e .GetArray (_cegf );if !_cdf {_ee .Log .Debug ("\u0041\u006e\u006e\u006fts\u0020\u006e\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");return nil ;};var _cde []content ;for _ ,_efd :=range _gfag .Elements (){_aegg ,_cgf :=_e .GetDict (_efd );if !_cgf {_ee .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 ;};_fgg ,_cgf :=_e .GetDict (_aegg .Get ("\u0041\u0050"));if !_cgf {_ee .Log .Debug ("\u004e\u006f\u0020\u0041P \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_adg :=_e .TraceToDirectObject (_fgg .Get ("\u004e"));if _adg ==nil {_ee .Log .Debug ("N\u006f\u0020\u004e\u0020en\u0074r\u0079\u0020\u002d\u0020\u0073k\u0069\u0070\u0070\u0069\u006e\u0067");continue ;};var _cce *_e .PdfObjectStream ;switch _dbg :=_adg .(type ){case *_e .PdfObjectDictionary :_dea ,_fbc :=_e .GetName (_aegg .Get ("\u0041\u0053"));if !_fbc {_ee .Log .Debug ("\u004e\u006f\u0020\u0041S \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_cce ,_fbc =_e .GetStream (_dbg .Get (*_dea ));if !_fbc {_ee .Log .Debug ("\u0046o\u0072\u006d\u0020\u006eo\u0074\u0020\u0066\u006f\u0075n\u0064 \u002d \u0073\u006b\u0069\u0070\u0070\u0069\u006eg");continue ;};case *_e .PdfObjectStream :_cce =_dbg ;};if _cce ==nil {_ee .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 ;};_gda ,_cee :=_ae .NewXObjectFormFromStream (_cce );if _cee !=nil {_ee .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",_cee );continue ;};_eeb ,_cee :=_gda .GetContentStream ();if _cee !=nil {_ee .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",_cee );continue ;};_cde =append (_cde ,content {_fbd :string (_eeb ),_gfba :_gda .Resources });};return _cde ;};func _bc (_ca *_gb .ContentStreamOperations )*_gb .ContentStreamOperations {if _ca ==nil {return nil ;};_ga :=_gb .ContentStreamOperations {};for _ ,_fa :=range *_ca {switch _fa .Operand {case "\u0042\u0044\u0043","\u0042\u004d\u0043","\u0045\u004d\u0043":continue ;case "\u0054\u006d":if len (_fa .Params )==6{if _aea ,_df :=_e .GetNumbersAsFloat (_fa .Params );_df ==nil {if _aea [0]==1&&_aea [1]==0&&_aea [2]==0&&_aea [3]==1{_fa =&_gb .ContentStreamOperation {Params :[]_e .PdfObject {_fa .Params [4],_fa .Params [5]},Operand :"\u0054\u0064"};};};};};_ga =append (_ga ,_fa );};return &_ga ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_bead *ImagePPI )Optimize (objects []_e .PdfObject )(_afa []_e .PdfObject ,_bdga error ){if _bead .ImageUpperPPI <=0{return objects ,nil ;};_deag :=_caf (objects );if len (_deag )==0{return objects ,nil ;};_ffd :=make (map[_e .PdfObject ]struct{});for _ ,_edc :=range _deag {_ffcg :=_edc .Stream .PdfObjectDictionary .Get (_e .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_ffd [_ffcg ]=struct{}{};};_gcf :=make (map[*_e .PdfObjectStream ]*imageInfo );for _ ,_bab :=range _deag {_gcf [_bab .Stream ]=_bab ;};var _fdbd *_e .PdfObjectDictionary ;for _ ,_ccg :=range objects {if _cbe ,_aeeaa :=_e .GetDict (_ccg );_fdbd ==nil &&_aeeaa {if _bfe ,_acc :=_e .GetName (_cbe .Get (_e .PdfObjectName ("\u0054\u0079\u0070\u0065")));_acc &&*_bfe =="\u0043a\u0074\u0061\u006c\u006f\u0067"{_fdbd =_cbe ;};};};if _fdbd ==nil {return objects ,nil ;};_cfd ,_gba :=_e .GetDict (_fdbd .Get (_e .PdfObjectName ("\u0050\u0061\u0067e\u0073")));if !_gba {return objects ,nil ;};_ecde ,_aece :=_e .GetArray (_cfd .Get (_e .PdfObjectName ("\u004b\u0069\u0064\u0073")));if !_aece {return objects ,nil ;};_gfe :=make (map[string ]*imageInfo );for _ ,_abf :=range _ecde .Elements (){_afdg ,_ccf :=_e .GetDict (_abf );if !_ccf {continue ;};_fcdb ,_eefe :=_e .GetArray (_afdg .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));if !_eefe {continue ;};_cfe ,_bge :=_e .GetDict (_afdg .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_bge {continue ;};_deb ,_efcbb :=_e .GetDict (_cfe .Get ("\u0058O\u0062\u006a\u0065\u0063\u0074"));if !_efcbb {continue ;};_agg :=_deb .Keys ();for _ ,_cfc :=range _agg {if _cdda ,_ebg :=_e .GetStream (_deb .Get (_cfc ));_ebg {if _eedd ,_daf :=_gcf [_cdda ];_daf {_gfe [string (_cfc )]=_eedd ;};};};for _ ,_gfae :=range _fcdb .Elements (){if _debg ,_dgf :=_e .GetStream (_gfae );_dgf {_bee ,_fed :=_e .NewEncoderFromStream (_debg );if _fed !=nil {return nil ,_fed ;};_gbac ,_fed :=_bee .DecodeStream (_debg );if _fed !=nil {return nil ,_fed ;};_aecf :=_gb .NewContentStreamParser (string (_gbac ));_dcbb ,_fed :=_aecf .Parse ();if _fed !=nil {return nil ,_fed ;};_ggaf ,_bgb :=1.0,1.0;for _ ,_eee :=range *_dcbb {if _eee .Operand =="\u0051"{_ggaf ,_bgb =1.0,1.0;};if _eee .Operand =="\u0063\u006d"&&len (_eee .Params )==6{if _agc ,_ffb :=_e .GetFloatVal (_eee .Params [0]);_ffb {_ggaf =_ggaf *_agc ;};if _ffdd ,_dcd :=_e .GetFloatVal (_eee .Params [3]);_dcd {_bgb =_bgb *_ffdd ;};if _egdb ,_bbea :=_e .GetIntVal (_eee .Params [0]);_bbea {_ggaf =_ggaf *float64 (_egdb );};if _ecb ,_beeg :=_e .GetIntVal (_eee .Params [3]);_beeg {_bgb =_bgb *float64 (_ecb );};};if _eee .Operand =="\u0044\u006f"&&len (_eee .Params )==1{_ceec ,_gef :=_e .GetName (_eee .Params [0]);if !_gef {continue ;};if _ffab ,_gcbc :=_gfe [string (*_ceec )];_gcbc {_cfeb ,_cge :=_ggaf /72.0,_bgb /72.0;_bgee ,_fdbf :=float64 (_ffab .Width )/_cfeb ,float64 (_ffab .Height )/_cge ;if _cfeb ==0||_cge ==0{_bgee =72.0;_fdbf =72.0;};_ffab .PPI =_b .Max (_ffab .PPI ,_bgee );_ffab .PPI =_b .Max (_ffab .PPI ,_fdbf );};};};};};};for _ ,_gcg :=range _deag {if _ ,_bcg :=_ffd [_gcg .Stream ];_bcg {continue ;};if _gcg .PPI <=_bead .ImageUpperPPI {continue ;};_cdea :=_bead .ImageUpperPPI /_gcg .PPI ;if _dfeb :=_gaaa (_gcg .Stream ,_cdea );_dfeb !=nil {_ee .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",_dfeb );}else {if _bffg ,_deba :=_e .GetStream (_gcg .Stream .PdfObjectDictionary .Get (_e .PdfObjectName ("\u0053\u004d\u0061s\u006b")));_deba {if _bgd :=_gaaa (_bffg ,_cdea );_bgd !=nil {return nil ,_bgd ;};};};};return objects ,nil ;};
|
|
|
|
// Chain allows to use sequence of optimizers.
|
|
// It implements interface model.Optimizer.
|
|
type Chain struct{_ba []_ae .Optimizer };
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_ffc *CombineDuplicateStreams )Optimize (objects []_e .PdfObject )(_bcd []_e .PdfObject ,_acbf error ){_dbfa :=make (map[_e .PdfObject ]_e .PdfObject );_gggf :=make (map[_e .PdfObject ]struct{});_dc :=make (map[string ][]*_e .PdfObjectStream );for _ ,_fcd :=range objects {if _gggc ,_acba :=_fcd .(*_e .PdfObjectStream );_acba {_gcb :=_ega .New ();_gcb .Write ([]byte (_gggc .Stream ));_cfa :=string (_gcb .Sum (nil ));_dc [_cfa ]=append (_dc [_cfa ],_gggc );};};for _ ,_fdbc :=range _dc {if len (_fdbc )< 2{continue ;};_afbe :=_fdbc [0];for _eefc :=1;_eefc < len (_fdbc );_eefc ++{_eed :=_fdbc [_eefc ];_dbfa [_eed ]=_afbe ;_gggf [_eed ]=struct{}{};};};_bcd =make ([]_e .PdfObject ,0,len (objects )-len (_gggf ));for _ ,_gfbd :=range objects {if _ ,_efb :=_gggf [_gfbd ];_efb {continue ;};_bcd =append (_bcd ,_gfbd );};_aef (_bcd ,_dbfa );return _bcd ,nil ;};type content struct{_fbd string ;_gfba *_ae .PdfPageResources ;};func _cab (_dgab _e .PdfObject )(_dcgc string ,_gdb []_e .PdfObject ){var _baeg _gf .Buffer ;switch _bed :=_dgab .(type ){case *_e .PdfIndirectObject :_gdb =append (_gdb ,_bed );_dgab =_bed .PdfObject ;};switch _fegca :=_dgab .(type ){case *_e .PdfObjectStream :if _ffad ,_dfg :=_e .DecodeStream (_fegca );_dfg ==nil {_baeg .Write (_ffad );_gdb =append (_gdb ,_fegca );};case *_e .PdfObjectArray :for _ ,_bbfg :=range _fegca .Elements (){switch _ecae :=_bbfg .(type ){case *_e .PdfObjectStream :if _dee ,_eec :=_e .DecodeStream (_ecae );_eec ==nil {_baeg .Write (_dee );_gdb =append (_gdb ,_ecae );};};};};return _baeg .String (),_gdb ;};
|
|
|
|
// CombineIdenticalIndirectObjects combines identical indirect objects.
|
|
// It implements interface model.Optimizer.
|
|
type CombineIdenticalIndirectObjects struct{};
|
|
|
|
// CombineDuplicateDirectObjects combines duplicated direct objects by its data hash.
|
|
// It implements interface model.Optimizer.
|
|
type CombineDuplicateDirectObjects struct{};func _ag (_aed *_e .PdfObjectStream )error {_fg ,_gd :=_e .DecodeStream (_aed );if _gd !=nil {return _gd ;};_eb :=_gb .NewContentStreamParser (string (_fg ));_dfa ,_gd :=_eb .Parse ();if _gd !=nil {return _gd ;};_dfa =_bc (_dfa );_ac :=_dfa .Bytes ();if len (_ac )>=len (_fg ){return nil ;};_db ,_gd :=_e .MakeStream (_dfa .Bytes (),_e .NewFlateEncoder ());if _gd !=nil {return _gd ;};_aed .Stream =_db .Stream ;_aed .Merge (_db .PdfObjectDictionary );return nil ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_gaa *CombineIdenticalIndirectObjects )Optimize (objects []_e .PdfObject )(_dda []_e .PdfObject ,_afea error ){_eebb (objects );_dde :=make (map[_e .PdfObject ]_e .PdfObject );_ecc :=make (map[_e .PdfObject ]struct{});_bfg :=make (map[string ][]*_e .PdfIndirectObject );for _ ,_efbb :=range objects {_gbe ,_cegd :=_efbb .(*_e .PdfIndirectObject );if !_cegd {continue ;};if _ebeb ,_baa :=_gbe .PdfObject .(*_e .PdfObjectDictionary );_baa {if _eace ,_bef :=_ebeb .Get ("\u0054\u0079\u0070\u0065").(*_e .PdfObjectName );_bef &&*_eace =="\u0050\u0061\u0067\u0065"{continue ;};_dbb :=_ega .New ();_dbb .Write ([]byte (_ebeb .WriteString ()));_dcg :=string (_dbb .Sum (nil ));_bfg [_dcg ]=append (_bfg [_dcg ],_gbe );};};for _ ,_bbg :=range _bfg {if len (_bbg )< 2{continue ;};_dga :=_bbg [0];for _aeggc :=1;_aeggc < len (_bbg );_aeggc ++{_cag :=_bbg [_aeggc ];_dde [_cag ]=_dga ;_ecc [_cag ]=struct{}{};};};_dda =make ([]_e .PdfObject ,0,len (objects )-len (_ecc ));for _ ,_fgfg :=range objects {if _ ,_ccd :=_ecc [_fgfg ];_ccd {continue ;};_dda =append (_dda ,_fgfg );};_aef (_dda ,_dde );return _dda ,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 (_affb *ObjectStreams )Optimize (objects []_e .PdfObject )(_fegc []_e .PdfObject ,_afeg error ){_aecb :=&_e .PdfObjectStreams {};_abdf :=make ([]_e .PdfObject ,0,len (objects ));for _ ,_fbf :=range objects {if _gca ,_abdg :=_fbf .(*_e .PdfIndirectObject );_abdg &&_gca .GenerationNumber ==0{_aecb .Append (_fbf );}else {_abdf =append (_abdf ,_fbf );};};if _aecb .Len ()==0{return _abdf ,nil ;};_fegc =make ([]_e .PdfObject ,0,len (_abdf )+_aecb .Len ()+1);if _aecb .Len ()> 1{_fegc =append (_fegc ,_aecb );};_fegc =append (_fegc ,_aecb .Elements ()...);_fegc =append (_fegc ,_abdf ...);return _fegc ,nil ;};func _aef (_gceg []_e .PdfObject ,_bcdd map[_e .PdfObject ]_e .PdfObject ){if _bcdd ==nil ||len (_bcdd )==0{return ;};for _acae ,_cbaa :=range _gceg {if _dbe ,_bbf :=_bcdd [_cbaa ];_bbf {_gceg [_acae ]=_dbe ;continue ;};_bcdd [_cbaa ]=_cbaa ;switch _gcad :=_cbaa .(type ){case *_e .PdfObjectArray :_eab :=make ([]_e .PdfObject ,_gcad .Len ());copy (_eab ,_gcad .Elements ());_aef (_eab ,_bcdd );for _efbf ,_fcb :=range _eab {_gcad .Set (_efbf ,_fcb );};case *_e .PdfObjectStreams :_aef (_gcad .Elements (),_bcdd );case *_e .PdfObjectStream :_aeaf :=[]_e .PdfObject {_gcad .PdfObjectDictionary };_aef (_aeaf ,_bcdd );_gcad .PdfObjectDictionary =_aeaf [0].(*_e .PdfObjectDictionary );case *_e .PdfObjectDictionary :_egf :=_gcad .Keys ();_afc :=make ([]_e .PdfObject ,len (_egf ));for _bfef ,_egc :=range _egf {_afc [_bfef ]=_gcad .Get (_egc );};_aef (_afc ,_bcdd );for _cdegf ,_ggb :=range _egf {_gcad .Set (_ggb ,_afc [_cdegf ]);};case *_e .PdfIndirectObject :_geb :=[]_e .PdfObject {_gcad .PdfObject };_aef (_geb ,_bcdd );_gcad .PdfObject =_geb [0];};};};func _caf (_aace []_e .PdfObject )[]*imageInfo {_bac :=_e .PdfObjectName ("\u0053u\u0062\u0074\u0079\u0070\u0065");_cad :=make (map[*_e .PdfObjectStream ]struct{});var _dba error ;var _cdeg []*imageInfo ;for _ ,_ecdf :=range _aace {_fea ,_dcb :=_e .GetStream (_ecdf );if !_dcb {continue ;};if _ ,_aff :=_cad [_fea ];_aff {continue ;};_cad [_fea ]=struct{}{};_ece :=_fea .PdfObjectDictionary .Get (_bac );_abda ,_dcb :=_e .GetName (_ece );if !_dcb ||string (*_abda )!="\u0049\u006d\u0061g\u0065"{continue ;};_dbgg :=&imageInfo {BitsPerComponent :8,Stream :_fea };if _dbgg .ColorSpace ,_dba =_ae .DetermineColorspaceNameFromPdfObject (_fea .PdfObjectDictionary .Get ("\u0043\u006f\u006c\u006f\u0072\u0053\u0070\u0061\u0063\u0065"));_dba !=nil {_ee .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",_dba );continue ;};if _dca ,_gcee :=_e .GetIntVal (_fea .PdfObjectDictionary .Get ("\u0042\u0069t\u0073\u0050\u0065r\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074"));_gcee {_dbgg .BitsPerComponent =_dca ;};if _beb ,_efa :=_e .GetIntVal (_fea .PdfObjectDictionary .Get ("\u0057\u0069\u0064t\u0068"));_efa {_dbgg .Width =_beb ;};if _eda ,_eae :=_e .GetIntVal (_fea .PdfObjectDictionary .Get ("\u0048\u0065\u0069\u0067\u0068\u0074"));_eae {_dbgg .Height =_eda ;};switch _dbgg .ColorSpace {case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_dbgg .ColorComponents =3;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_dbgg .ColorComponents =1;default:_ee .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",_dbgg .ColorSpace );continue ;};_cdeg =append (_cdeg ,_dbgg );};return _cdeg ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_ddb *CombineDuplicateDirectObjects )Optimize (objects []_e .PdfObject )(_fgf []_e .PdfObject ,_ed error ){_eebb (objects );_bcf :=make (map[string ][]*_e .PdfObjectDictionary );var _adc func (_baga *_e .PdfObjectDictionary );_adc =func (_fac *_e .PdfObjectDictionary ){for _ ,_bga :=range _fac .Keys (){_bfc :=_fac .Get (_bga );if _gggb ,_abg :=_bfc .(*_e .PdfObjectDictionary );_abg {_adb :=_ega .New ();_adb .Write ([]byte (_gggb .WriteString ()));_aee :=string (_adb .Sum (nil ));_bcf [_aee ]=append (_bcf [_aee ],_gggb );_adc (_gggb );};};};for _ ,_add :=range objects {_gcc ,_dfe :=_add .(*_e .PdfIndirectObject );if !_dfe {continue ;};if _fff ,_cef :=_gcc .PdfObject .(*_e .PdfObjectDictionary );_cef {_adc (_fff );};};_cbf :=make ([]_e .PdfObject ,0,len (_bcf ));_bde :=make (map[_e .PdfObject ]_e .PdfObject );for _ ,_ccac :=range _bcf {if len (_ccac )< 2{continue ;};_efcb :=_e .MakeDict ();_efcb .Merge (_ccac [0]);_aae :=_e .MakeIndirectObject (_efcb );_cbf =append (_cbf ,_aae );for _ffa :=0;_ffa < len (_ccac );_ffa ++{_ceed :=_ccac [_ffa ];_bde [_ceed ]=_aae ;};};_fgf =make ([]_e .PdfObject ,len (objects ));copy (_fgf ,objects );_fgf =append (_cbf ,_fgf ...);_aef (_fgf ,_bde );return _fgf ,nil ;};func _dbc (_cca []_e .PdfObject )(_afd map[*_e .PdfObjectStream ]struct{},_de error ){_afd =map[*_e .PdfObjectStream ]struct{}{};_fde :=map[*_ae .PdfFont ]struct{}{};_gad :=_gbg (_cca );for _ ,_aac :=range _gad ._dbce {_bag ,_ab :=_e .GetDict (_aac .PdfObject );if !_ab {continue ;};_aeg ,_ab :=_e .GetDict (_bag .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_ab {continue ;};_ggc ,_ :=_cab (_bag .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_gdcc ,_gga :=_ae .NewPdfPageResourcesFromDict (_aeg );if _gga !=nil {return nil ,_gga ;};_cb :=[]content {{_fbd :_ggc ,_gfba :_gdcc }};_bea :=_cdd (_bag .Get ("\u0041\u006e\u006e\u006f\u0074\u0073"));if _bea !=nil {_cb =append (_cb ,_bea ...);};for _ ,_gdg :=range _cb {_gfa ,_cf :=_aa .NewFromContents (_gdg ._fbd ,_gdg ._gfba );if _cf !=nil {return nil ,_cf ;};_agd ,_ ,_ ,_cf :=_gfa .ExtractPageText ();if _cf !=nil {return nil ,_cf ;};for _ ,_da :=range _agd .Marks ().Elements (){if _da .Font ==nil {continue ;};if _ ,_egae :=_fde [_da .Font ];!_egae {_fde [_da .Font ]=struct{}{};};};};};_acd :=map[*_e .PdfObjectStream ][]*_ae .PdfFont {};for _efc :=range _fde {_acb :=_efc .FontDescriptor ();if _acb ==nil ||_acb .FontFile2 ==nil {continue ;};_fab ,_aeda :=_e .GetStream (_acb .FontFile2 );if !_aeda {continue ;};_acd [_fab ]=append (_acd [_fab ],_efc );};for _eac :=range _acd {var _gde []rune ;var _egd []_f .GlyphIndex ;for _ ,_ceg :=range _acd [_eac ]{switch _dbd :=_ceg .Encoder ().(type ){case *_bf .IdentityEncoder :_caef :=_dbd .RegisteredRunes ();_cbb :=make ([]_f .GlyphIndex ,len (_caef ));for _eef ,_bba :=range _caef {_cbb [_eef ]=_f .GlyphIndex (_bba );};_egd =append (_egd ,_cbb ...);case *_bf .TrueTypeFontEncoder :_ccc :=_dbd .RegisteredRunes ();_gde =append (_gde ,_ccc ...);case _bf .SimpleEncoder :_dff :=_dbd .Charcodes ();for _ ,_ebe :=range _dff {_gfb ,_ggcc :=_dbd .CharcodeToRune (_ebe );if !_ggcc {_ee .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",_ebe );continue ;};_gde =append (_gde ,_gfb );};};};_de =_fe (_eac ,_gde ,_egd );if _de !=nil {_ee .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",_de );return nil ,_de ;};_afd [_eac ]=struct{}{};};return _afd ,nil ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_ded *CompressStreams )Optimize (objects []_e .PdfObject )(_fabb []_e .PdfObject ,_efdb error ){_fabb =make ([]_e .PdfObject ,len (objects ));copy (_fabb ,objects );for _ ,_bcab :=range objects {_eebe ,_dcc :=_e .GetStream (_bcab );if !_dcc {continue ;};if _ace :=_eebe .Get ("\u0046\u0069\u006c\u0074\u0065\u0072");_ace !=nil {if _ ,_fec :=_e .GetName (_ace );_fec {continue ;};if _fbda ,_aebg :=_e .GetArray (_ace );_aebg &&_fbda .Len ()> 0{continue ;};};_bff :=_e .NewFlateEncoder ();var _fdbcg []byte ;_fdbcg ,_efdb =_bff .EncodeBytes (_eebe .Stream );if _efdb !=nil {return _fabb ,_efdb ;};_eafd :=_bff .MakeStreamDict ();if len (_fdbcg )+len (_eafd .WriteString ())< len (_eebe .Stream ){_eebe .Stream =_fdbcg ;_eebe .PdfObjectDictionary .Merge (_eafd );_eebe .PdfObjectDictionary .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_e .MakeInteger (int64 (len (_eebe .Stream ))));};};return _fabb ,nil ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_aca *CleanFonts )Optimize (objects []_e .PdfObject )(_dfbb []_e .PdfObject ,_abe error ){var _dgg map[*_e .PdfObjectStream ]struct{};if _aca .Subset {var _bbe error ;_dgg ,_bbe =_dbc (objects );if _bbe !=nil {return nil ,_bbe ;};};for _ ,_fc :=range objects {_eegf ,_bec :=_e .GetStream (_fc );if !_bec {continue ;};if _ ,_afga :=_dgg [_eegf ];_afga {continue ;};_gec ,_eea :=_e .NewEncoderFromStream (_eegf );if _eea !=nil {_ee .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",_eea );continue ;};_egdd ,_eea :=_gec .DecodeStream (_eegf );if _eea !=nil {_ee .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",_eea );continue ;};if len (_egdd )< 4{continue ;};_afb :=string (_egdd [:4]);if _afb =="\u004f\u0054\u0054\u004f"{continue ;};if _afb !="\u0000\u0001\u0000\u0000"&&_afb !="\u0074\u0072\u0075\u0065"{continue ;};_fcc ,_eea :=_f .Parse (_gf .NewReader (_egdd ));if _eea !=nil {_ee .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",_eea );continue ;};_eea =_fcc .Optimize ();if _eea !=nil {continue ;};var _abdc _gf .Buffer ;_eea =_fcc .Write (&_abdc );if _eea !=nil {_ee .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",_eea );continue ;};if _abdc .Len ()> len (_egdd ){_ee .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 ;};_bdg ,_eea :=_e .MakeStream (_abdc .Bytes (),_e .NewFlateEncoder ());if _eea !=nil {continue ;};*_eegf =*_bdg ;_eegf .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_e .MakeInteger (int64 (_abdc .Len ())));};return objects ,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 _eebb (_efaa []_e .PdfObject ){for _faa ,_fbe :=range _efaa {switch _bbc :=_fbe .(type ){case *_e .PdfIndirectObject :_bbc .ObjectNumber =int64 (_faa +1);_bbc .GenerationNumber =0;case *_e .PdfObjectStream :_bbc .ObjectNumber =int64 (_faa +1);_bbc .GenerationNumber =0;case *_e .PdfObjectStreams :_bbc .ObjectNumber =int64 (_faa +1);_bbc .GenerationNumber =0;};};};
|
|
|
|
// New creates a optimizers chain from options.
|
|
func New (options Options )*Chain {_fbfc :=new (Chain );if options .CleanFonts ||options .SubsetFonts {_fbfc .Append (&CleanFonts {Subset :options .SubsetFonts });};if options .CleanContentstream {_fbfc .Append (new (CleanContentstream ));};if options .ImageUpperPPI > 0{_beaa :=new (ImagePPI );_beaa .ImageUpperPPI =options .ImageUpperPPI ;_fbfc .Append (_beaa );};if options .ImageQuality > 0{_ecf :=new (Image );_ecf .ImageQuality =options .ImageQuality ;_fbfc .Append (_ecf );};if options .CombineDuplicateDirectObjects {_fbfc .Append (new (CombineDuplicateDirectObjects ));};if options .CombineDuplicateStreams {_fbfc .Append (new (CombineDuplicateStreams ));};if options .CombineIdenticalIndirectObjects {_fbfc .Append (new (CombineIdenticalIndirectObjects ));};if options .UseObjectStreams {_fbfc .Append (new (ObjectStreams ));};if options .CompressStreams {_fbfc .Append (new (CompressStreams ));};return _fbfc ;};
|
|
|
|
// 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 (_bfd *Chain )Optimize (objects []_e .PdfObject )(_gg []_e .PdfObject ,_ef error ){_gg =objects ;for _ ,_ec :=range _bfd ._ba {_gg ,_ef =_ec .Optimize (_gg );if _ef !=nil {return _gg ,_ef ;};};return _gg ,nil ;};type objectStructure struct{_efab *_e .PdfObjectDictionary ;_afaf *_e .PdfObjectDictionary ;_dbce []*_e .PdfIndirectObject ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_aga *Image )Optimize (objects []_e .PdfObject )(_efe []_e .PdfObject ,_dfce error ){if _aga .ImageQuality <=0{return objects ,nil ;};_deda :=_caf (objects );if len (_deda )==0{return objects ,nil ;};_fbg :=make (map[_e .PdfObject ]_e .PdfObject );_eacg :=make (map[_e .PdfObject ]struct{});for _ ,_fba :=range _deda {_dbff :=_fba .Stream .PdfObjectDictionary .Get (_e .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_eacg [_dbff ]=struct{}{};};for _dge ,_aacg :=range _deda {_cba :=_aacg .Stream ;if _ ,_fbce :=_eacg [_cba ];_fbce {continue ;};_aag ,_abc :=_e .NewEncoderFromStream (_cba );if _abc !=nil {_ee .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 ;};_aede ,_abc :=_aag .DecodeStream (_cba );if _abc !=nil {_ee .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 ;};_aeea :=_e .NewDCTEncoder ();_aeea .ColorComponents =_aacg .ColorComponents ;_aeea .Quality =_aga .ImageQuality ;_aeea .BitsPerComponent =_aacg .BitsPerComponent ;_aeea .Width =_aacg .Width ;_aeea .Height =_aacg .Height ;_bae ,_abc :=_aeea .EncodeBytes (_aede );if _abc !=nil {_ee .Log .Debug ("\u0045R\u0052\u004f\u0052\u003a\u0020\u0025v",_abc );return nil ,_abc ;};var _fbgd _e .StreamEncoder ;_fbgd =_aeea ;{_ceee :=_e .NewFlateEncoder ();_ecea :=_e .NewMultiEncoder ();_ecea .AddEncoder (_ceee );_ecea .AddEncoder (_aeea );_cegdc ,_ecef :=_ecea .EncodeBytes (_aede );if _ecef !=nil {return nil ,_ecef ;};if len (_cegdc )< len (_bae ){_ee .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 (_bae ),len (_cegdc ),len (_cba .Stream ));_bae =_cegdc ;_fbgd =_ecea ;};};_aedef :=len (_cba .Stream );if _aedef < len (_bae ){continue ;};_acbe :=&_e .PdfObjectStream {Stream :_bae };_acbe .PdfObjectReference =_cba .PdfObjectReference ;_acbe .PdfObjectDictionary =_e .MakeDict ();_acbe .Merge (_cba .PdfObjectDictionary );_acbe .Merge (_fbgd .MakeStreamDict ());_acbe .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_e .MakeInteger (int64 (len (_bae ))));_fbg [_cba ]=_acbe ;_deda [_dge ].Stream =_acbe ;};_efe =make ([]_e .PdfObject ,len (objects ));copy (_efe ,objects );_aef (_efe ,_fbg );return _efe ,nil ;};func _fe (_dbf *_e .PdfObjectStream ,_gbc []rune ,_ff []_f .GlyphIndex )error {_dbf ,_ge :=_e .GetStream (_dbf );if !_ge {_ee .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 _g .New ("\u0066\u006f\u006e\u0074fi\u006c\u0065\u0032\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_ffg ,_afg :=_e .DecodeStream (_dbf );if _afg !=nil {_ee .Log .Debug ("\u0044\u0065c\u006f\u0064\u0065 \u0065\u0072\u0072\u006f\u0072\u003a\u0020\u0025\u0076",_afg );return _afg ;};_bfda ,_afg :=_f .Parse (_gf .NewReader (_ffg ));if _afg !=nil {_ee .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 (_dbf .Stream ));return _afg ;};_ggae :=_ff ;if len (_gbc )> 0{_dfc :=_bfda .LookupRunes (_gbc );_ggae =append (_ggae ,_dfc ...);};_bfda ,_afg =_bfda .SubsetKeepIndices (_ggae );if _afg !=nil {_ee .Log .Debug ("\u0045R\u0052\u004f\u0052\u0020s\u0075\u0062\u0073\u0065\u0074t\u0069n\u0067 \u0066\u006f\u006e\u0074\u003a\u0020\u0025v",_afg );return _afg ;};var _afdf _gf .Buffer ;_afg =_bfda .Write (&_afdf );if _afg !=nil {_ee .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_afg );return _afg ;};if _afdf .Len ()> len (_ffg ){_ee .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 ;};_aeb ,_afg :=_e .MakeStream (_afdf .Bytes (),_e .NewFlateEncoder ());if _afg !=nil {_ee .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_afg );return _afg ;};*_dbf =*_aeb ;_dbf .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_e .MakeInteger (int64 (_afdf .Len ())));return nil ;};
|
|
|
|
// ObjectStreams groups PDF objects to object streams.
|
|
// It implements interface model.Optimizer.
|
|
type ObjectStreams struct{};
|
|
|
|
// 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 ;};
|
|
|
|
// 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{};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_fgd *CleanContentstream )Optimize (objects []_e .PdfObject )(_fd []_e .PdfObject ,_dg error ){_ecd :=map[*_e .PdfObjectStream ]struct{}{};var _gc []*_e .PdfObjectStream ;_bdc :=func (_ebd *_e .PdfObjectStream ){if _ ,_dgd :=_ecd [_ebd ];!_dgd {_ecd [_ebd ]=struct{}{};_gc =append (_gc ,_ebd );};};for _ ,_dd :=range objects {switch _agb :=_dd .(type ){case *_e .PdfIndirectObject :switch _bg :=_agb .PdfObject .(type ){case *_e .PdfObjectDictionary :if _ad ,_bb :=_e .GetName (_bg .Get ("\u0054\u0079\u0070\u0065"));!_bb ||_ad .String ()!="\u0050\u0061\u0067\u0065"{continue ;};if _ea ,_bca :=_e .GetStream (_bg .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_bca {_bdc (_ea );}else if _af ,_eaa :=_e .GetArray (_bg .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_eaa {for _ ,_eaf :=range _af .Elements (){if _eeg ,_cd :=_e .GetStream (_eaf );_cd {_bdc (_eeg );};};};};case *_e .PdfObjectStream :if _cc ,_agbb :=_e .GetName (_agb .Get ("\u0054\u0079\u0070\u0065"));!_agbb ||_cc .String ()!="\u0058O\u0062\u006a\u0065\u0063\u0074"{continue ;};if _gac ,_afe :=_e .GetName (_agb .Get ("\u0053u\u0062\u0074\u0079\u0070\u0065"));!_afe ||_gac .String ()!="\u0046\u006f\u0072\u006d"{continue ;};_bdc (_agb );};};for _ ,_cae :=range _gc {_dg =_ag (_cae );if _dg !=nil {return nil ,_dg ;};};return objects ,nil ;};
|
|
|
|
// 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 ;};
|
|
|
|
// CompressStreams compresses uncompressed streams.
|
|
// It implements interface model.Optimizer.
|
|
type CompressStreams struct{};type imageInfo struct{ColorSpace _e .PdfObjectName ;BitsPerComponent int ;ColorComponents int ;Width int ;Height int ;Stream *_e .PdfObjectStream ;PPI float64 ;}; |