mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-27 13:48:51 +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 (_eg "bytes";_bc "crypto/md5";_dg "errors";_e "fmt";_cf "github.com/unidoc/unipdf/v3/common";_cfg "github.com/unidoc/unipdf/v3/contentstream";_c "github.com/unidoc/unipdf/v3/core";_a "github.com/unidoc/unipdf/v3/extractor";_f "github.com/unidoc/unipdf/v3/internal/textencoding";_aa "github.com/unidoc/unipdf/v3/model";_af "github.com/unidoc/unitype";_cb "golang.org/x/image/draw";_cc "image";_b "math";);func _fcd (_bbc []_c .PdfObject )[]*imageInfo {_aad :=_c .PdfObjectName ("\u0053u\u0062\u0074\u0079\u0070\u0065");_aac :=make (map[*_c .PdfObjectStream ]struct{});var _cec error ;var _efe []*imageInfo ;for _ ,_bbf :=range _bbc {_cbca ,_afge :=_c .GetStream (_bbf );if !_afge {continue ;};if _ ,_cfbf :=_aac [_cbca ];_cfbf {continue ;};_aac [_cbca ]=struct{}{};_ggfb :=_cbca .PdfObjectDictionary .Get (_aad );_caae ,_afge :=_c .GetName (_ggfb );if !_afge ||string (*_caae )!="\u0049\u006d\u0061g\u0065"{continue ;};_fabe :=&imageInfo {BitsPerComponent :8,Stream :_cbca };if _fabe .ColorSpace ,_cec =_aa .DetermineColorspaceNameFromPdfObject (_cbca .PdfObjectDictionary .Get ("\u0043\u006f\u006c\u006f\u0072\u0053\u0070\u0061\u0063\u0065"));_cec !=nil {_cf .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",_cec );continue ;};if _ceg ,_ggaf :=_c .GetIntVal (_cbca .PdfObjectDictionary .Get ("\u0042\u0069t\u0073\u0050\u0065r\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074"));_ggaf {_fabe .BitsPerComponent =_ceg ;};if _cga ,_efc :=_c .GetIntVal (_cbca .PdfObjectDictionary .Get ("\u0057\u0069\u0064t\u0068"));_efc {_fabe .Width =_cga ;};if _addc ,_ebb :=_c .GetIntVal (_cbca .PdfObjectDictionary .Get ("\u0048\u0065\u0069\u0067\u0068\u0074"));_ebb {_fabe .Height =_addc ;};switch _fabe .ColorSpace {case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_fabe .ColorComponents =3;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_fabe .ColorComponents =1;default:_cf .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",_fabe .ColorSpace );continue ;};_efe =append (_efe ,_fabe );};return _efe ;};func _dga (_ebga _c .PdfObject )[]content {if _ebga ==nil {return nil ;};_dbeg ,_egd :=_c .GetArray (_ebga );if !_egd {_cf .Log .Debug ("\u0041\u006e\u006e\u006fts\u0020\u006e\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");return nil ;};var _fec []content ;for _ ,_afff :=range _dbeg .Elements (){_cff ,_ddb :=_c .GetDict (_afff );if !_ddb {_cf .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 ;};_eaca ,_ddb :=_c .GetDict (_cff .Get ("\u0041\u0050"));if !_ddb {_cf .Log .Debug ("\u004e\u006f\u0020\u0041P \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_bee :=_c .TraceToDirectObject (_eaca .Get ("\u004e"));if _bee ==nil {_cf .Log .Debug ("N\u006f\u0020\u004e\u0020en\u0074r\u0079\u0020\u002d\u0020\u0073k\u0069\u0070\u0070\u0069\u006e\u0067");continue ;};var _gfed *_c .PdfObjectStream ;switch _bec :=_bee .(type ){case *_c .PdfObjectDictionary :_dce ,_dbbc :=_c .GetName (_cff .Get ("\u0041\u0053"));if !_dbbc {_cf .Log .Debug ("\u004e\u006f\u0020\u0041S \u0065\u006e\u0074\u0072\u0079\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067");continue ;};_gfed ,_dbbc =_c .GetStream (_bec .Get (*_dce ));if !_dbbc {_cf .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 :_gfed =_bec ;};if _gfed ==nil {_cf .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 ;};_ce ,_bdcf :=_aa .NewXObjectFormFromStream (_gfed );if _bdcf !=nil {_cf .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",_bdcf );continue ;};_fgd ,_bdcf :=_ce .GetContentStream ();if _bdcf !=nil {_cf .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",_bdcf );continue ;};_fec =append (_fec ,content {_dbe :string (_fgd ),_efg :_ce .Resources });};return _fec ;};
|
|
|
|
// CombineDuplicateDirectObjects combines duplicated direct objects by its data hash.
|
|
// It implements interface model.Optimizer.
|
|
type CombineDuplicateDirectObjects struct{};
|
|
|
|
// New creates a optimizers chain from options.
|
|
func New (options Options )*Chain {_ggga :=new (Chain );if options .CleanFonts ||options .SubsetFonts {_ggga .Append (&CleanFonts {Subset :options .SubsetFonts });};if options .CleanContentstream {_ggga .Append (new (CleanContentstream ));};if options .ImageUpperPPI > 0{_adag :=new (ImagePPI );_adag .ImageUpperPPI =options .ImageUpperPPI ;_ggga .Append (_adag );};if options .ImageQuality > 0{_ccea :=new (Image );_ccea .ImageQuality =options .ImageQuality ;_ggga .Append (_ccea );};if options .CombineDuplicateDirectObjects {_ggga .Append (new (CombineDuplicateDirectObjects ));};if options .CombineDuplicateStreams {_ggga .Append (new (CombineDuplicateStreams ));};if options .CombineIdenticalIndirectObjects {_ggga .Append (new (CombineIdenticalIndirectObjects ));};if options .UseObjectStreams {_ggga .Append (new (ObjectStreams ));};if options .CompressStreams {_ggga .Append (new (CompressStreams ));};return _ggga ;};
|
|
|
|
// 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 (_cgbf *ObjectStreams )Optimize (objects []_c .PdfObject )(_gbc []_c .PdfObject ,_bggg error ){_caaec :=&_c .PdfObjectStreams {};_cbad :=make ([]_c .PdfObject ,0,len (objects ));for _ ,_bdba :=range objects {if _dag ,_gcde :=_bdba .(*_c .PdfIndirectObject );_gcde &&_dag .GenerationNumber ==0{_caaec .Append (_bdba );}else {_cbad =append (_cbad ,_bdba );};};if _caaec .Len ()==0{return _cbad ,nil ;};_gbc =make ([]_c .PdfObject ,0,len (_cbad )+_caaec .Len ()+1);if _caaec .Len ()> 1{_gbc =append (_gbc ,_caaec );};_gbc =append (_gbc ,_caaec .Elements ()...);_gbc =append (_gbc ,_cbad ...);return _gbc ,nil ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_gga *CleanFonts )Optimize (objects []_c .PdfObject )(_dcgd []_c .PdfObject ,_ebg error ){var _ef map[*_c .PdfObjectStream ]struct{};if _gga .Subset {var _daf error ;_ef ,_daf =_bcc (objects );if _daf !=nil {return nil ,_daf ;};};for _ ,_ada :=range objects {_cdg ,_caaf :=_c .GetStream (_ada );if !_caaf {continue ;};if _ ,_daa :=_ef [_cdg ];_daa {continue ;};_aee ,_bfd :=_c .NewEncoderFromStream (_cdg );if _bfd !=nil {_cf .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",_bfd );continue ;};_bea ,_bfd :=_aee .DecodeStream (_cdg );if _bfd !=nil {_cf .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",_bfd );continue ;};if len (_bea )< 4{continue ;};_fde :=string (_bea [:4]);if _fde =="\u004f\u0054\u0054\u004f"{continue ;};if _fde !="\u0000\u0001\u0000\u0000"&&_fde !="\u0074\u0072\u0075\u0065"{continue ;};_dbb ,_bfd :=_af .Parse (_eg .NewReader (_bea ));if _bfd !=nil {_cf .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",_bfd );continue ;};_bfd =_dbb .Optimize ();if _bfd !=nil {continue ;};var _gfb _eg .Buffer ;_bfd =_dbb .Write (&_gfb );if _bfd !=nil {_cf .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",_bfd );continue ;};if _gfb .Len ()> len (_bea ){_cf .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 ;};_abg ,_bfd :=_c .MakeStream (_gfb .Bytes (),_c .NewFlateEncoder ());if _bfd !=nil {continue ;};*_cdg =*_abg ;_cdg .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_c .MakeInteger (int64 (_gfb .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 ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_fdc *CompressStreams )Optimize (objects []_c .PdfObject )(_bdcg []_c .PdfObject ,_dge error ){_bdcg =make ([]_c .PdfObject ,len (objects ));copy (_bdcg ,objects );for _ ,_gcff :=range objects {_bbbff ,_dgad :=_c .GetStream (_gcff );if !_dgad {continue ;};if _fdee :=_bbbff .Get ("\u0046\u0069\u006c\u0074\u0065\u0072");_fdee !=nil {if _ ,_ggg :=_c .GetName (_fdee );_ggg {continue ;};if _gge ,_gecb :=_c .GetArray (_fdee );_gecb &&_gge .Len ()> 0{continue ;};};_de :=_c .NewFlateEncoder ();var _ced []byte ;_ced ,_dge =_de .EncodeBytes (_bbbff .Stream );if _dge !=nil {return _bdcg ,_dge ;};_egae :=_de .MakeStreamDict ();if len (_ced )+len (_egae .WriteString ())< len (_bbbff .Stream ){_bbbff .Stream =_ced ;_bbbff .PdfObjectDictionary .Merge (_egae );_bbbff .PdfObjectDictionary .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_c .MakeInteger (int64 (len (_bbbff .Stream ))));};};return _bdcg ,nil ;};func _gca (_acbd _c .PdfObject )(_ddbe string ,_fbd []_c .PdfObject ){var _ffg _eg .Buffer ;switch _fccd :=_acbd .(type ){case *_c .PdfIndirectObject :_fbd =append (_fbd ,_fccd );_acbd =_fccd .PdfObject ;};switch _fbgg :=_acbd .(type ){case *_c .PdfObjectStream :if _agcg ,_ged :=_c .DecodeStream (_fbgg );_ged ==nil {_ffg .Write (_agcg );_fbd =append (_fbd ,_fbgg );};case *_c .PdfObjectArray :for _ ,_ecg :=range _fbgg .Elements (){switch _gdc :=_ecg .(type ){case *_c .PdfObjectStream :if _bggc ,_gadd :=_c .DecodeStream (_gdc );_gadd ==nil {_ffg .Write (_bggc );_fbd =append (_fbd ,_gdc );};};};};return _ffg .String (),_fbd ;};func _beg (_gf *_c .PdfObjectStream )error {_bb ,_gc :=_c .DecodeStream (_gf );if _gc !=nil {return _gc ;};_ee :=_cfg .NewContentStreamParser (string (_bb ));_aeb ,_gc :=_ee .Parse ();if _gc !=nil {return _gc ;};_aeb =_ac (_aeb );_ad :=_aeb .Bytes ();if len (_ad )>=len (_bb ){return nil ;};_egg ,_gc :=_c .MakeStream (_aeb .Bytes (),_c .NewFlateEncoder ());if _gc !=nil {return _gc ;};_gf .Stream =_egg .Stream ;_gf .Merge (_egg .PdfObjectDictionary );return nil ;};func _bcc (_bccb []_c .PdfObject )(_ade map[*_c .PdfObjectStream ]struct{},_fed error ){_ade =map[*_c .PdfObjectStream ]struct{}{};_gd :=map[*_aa .PdfFont ]struct{}{};_bga :=_cad (_bccb );for _ ,_ebc :=range _bga ._egb {_bege ,_dfb :=_c .GetDict (_ebc .PdfObject );if !_dfb {continue ;};_bcb ,_dfb :=_c .GetDict (_bege .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_dfb {continue ;};_egac ,_ :=_gca (_bege .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_bdf ,_cd :=_aa .NewPdfPageResourcesFromDict (_bcb );if _cd !=nil {return nil ,_cd ;};_dcb :=[]content {{_dbe :_egac ,_efg :_bdf }};_aff :=_dga (_bege .Get ("\u0041\u006e\u006e\u006f\u0074\u0073"));if _aff !=nil {_dcb =append (_dcb ,_aff ...);};for _ ,_cae :=range _dcb {_dda ,_caa :=_a .NewFromContents (_cae ._dbe ,_cae ._efg );if _caa !=nil {return nil ,_caa ;};_da ,_ ,_ ,_caa :=_dda .ExtractPageText ();if _caa !=nil {return nil ,_caa ;};for _ ,_gb :=range _da .Marks ().Elements (){if _gb .Font ==nil {continue ;};if _ ,_cce :=_gd [_gb .Font ];!_cce {_gd [_gb .Font ]=struct{}{};};};};};_ffa :=map[*_c .PdfObjectStream ][]*_aa .PdfFont {};for _bgac :=range _gd {_gbb :=_bgac .FontDescriptor ();if _gbb ==nil ||_gbb .FontFile2 ==nil {continue ;};_dgb ,_dgg :=_c .GetStream (_gbb .FontFile2 );if !_dgg {continue ;};_ffa [_dgb ]=append (_ffa [_dgb ],_bgac );};for _aba :=range _ffa {var _bde []rune ;var _beb []_af .GlyphIndex ;for _ ,_baf :=range _ffa [_aba ]{switch _ge :=_baf .Encoder ().(type ){case *_f .IdentityEncoder :_gcc :=_ge .RegisteredRunes ();_gag :=make ([]_af .GlyphIndex ,len (_gcc ));for _eaa ,_bgc :=range _gcc {_gag [_eaa ]=_af .GlyphIndex (_bgc );};_beb =append (_beb ,_gag ...);case *_f .TrueTypeFontEncoder :_aca :=_ge .RegisteredRunes ();_bde =append (_bde ,_aca ...);case _f .SimpleEncoder :_aaa :=_ge .Charcodes ();for _ ,_bgd :=range _aaa {_ed ,_edf :=_ge .CharcodeToRune (_bgd );if !_edf {_cf .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",_bgd );continue ;};_bde =append (_bde ,_ed );};};};_fed =_gfe (_aba ,_bde ,_beb );if _fed !=nil {_cf .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",_fed );return nil ,_fed ;};_ade [_aba ]=struct{}{};};return _ade ,nil ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_fg *CleanContentstream )Optimize (objects []_c .PdfObject )(_ea []_c .PdfObject ,_fdb error ){_egf :=map[*_c .PdfObjectStream ]struct{}{};var _eaf []*_c .PdfObjectStream ;_eag :=func (_ba *_c .PdfObjectStream ){if _ ,_fe :=_egf [_ba ];!_fe {_egf [_ba ]=struct{}{};_eaf =append (_eaf ,_ba );};};for _ ,_dc :=range objects {switch _cg :=_dc .(type ){case *_c .PdfIndirectObject :switch _bg :=_cg .PdfObject .(type ){case *_c .PdfObjectDictionary :if _eac ,_db :=_c .GetName (_bg .Get ("\u0054\u0079\u0070\u0065"));!_db ||_eac .String ()!="\u0050\u0061\u0067\u0065"{continue ;};if _aef ,_fb :=_c .GetStream (_bg .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_fb {_eag (_aef );}else if _ccf ,_dfd :=_c .GetArray (_bg .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));_dfd {for _ ,_bdc :=range _ccf .Elements (){if _gg ,_dcg :=_c .GetStream (_bdc );_dcg {_eag (_gg );};};};};case *_c .PdfObjectStream :if _afa ,_bf :=_c .GetName (_cg .Get ("\u0054\u0079\u0070\u0065"));!_bf ||_afa .String ()!="\u0058O\u0062\u006a\u0065\u0063\u0074"{continue ;};if _dbc ,_bfc :=_c .GetName (_cg .Get ("\u0053u\u0062\u0074\u0079\u0070\u0065"));!_bfc ||_dbc .String ()!="\u0046\u006f\u0072\u006d"{continue ;};_eag (_cg );};};for _ ,_bcf :=range _eaf {_fdb =_beg (_bcf );if _fdb !=nil {return nil ,_fdb ;};};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 ;};
|
|
|
|
// 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 ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_bgce *CombineDuplicateStreams )Optimize (objects []_c .PdfObject )(_dba []_c .PdfObject ,_bggd error ){_bef :=make (map[_c .PdfObject ]_c .PdfObject );_add :=make (map[_c .PdfObject ]struct{});_cda :=make (map[string ][]*_c .PdfObjectStream );for _ ,_eaff :=range objects {if _gbef ,_aeba :=_eaff .(*_c .PdfObjectStream );_aeba {_fbc :=_bc .New ();_fbc .Write ([]byte (_gbef .Stream ));_fab :=string (_fbc .Sum (nil ));_cda [_fab ]=append (_cda [_fab ],_gbef );};};for _ ,_egc :=range _cda {if len (_egc )< 2{continue ;};_gcd :=_egc [0];for _fc :=1;_fc < len (_egc );_fc ++{_bdg :=_egc [_fc ];_bef [_bdg ]=_gcd ;_add [_bdg ]=struct{}{};};};_dba =make ([]_c .PdfObject ,0,len (objects )-len (_add ));for _ ,_gdg :=range objects {if _ ,_gbeb :=_add [_gdg ];_gbeb {continue ;};_dba =append (_dba ,_gdg );};_eee (_dba ,_bef );return _dba ,nil ;};func _cad (_cgf []_c .PdfObject )objectStructure {_ded :=objectStructure {};_ggda :=false ;for _ ,_cfdb :=range _cgf {switch _eefe :=_cfdb .(type ){case *_c .PdfIndirectObject :_ace ,_gcdeb :=_c .GetDict (_eefe );if !_gcdeb {continue ;};_abae ,_gcdeb :=_c .GetName (_ace .Get ("\u0054\u0079\u0070\u0065"));if !_gcdeb {continue ;};switch _abae .String (){case "\u0043a\u0074\u0061\u006c\u006f\u0067":_ded ._dddd =_ace ;_ggda =true ;};};if _ggda {break ;};};if !_ggda {return _ded ;};_befe ,_fef :=_c .GetDict (_ded ._dddd .Get ("\u0050\u0061\u0067e\u0073"));if !_fef {return _ded ;};_ded ._eeg =_befe ;_aaba ,_fef :=_c .GetArray (_befe .Get ("\u004b\u0069\u0064\u0073"));if !_fef {return _ded ;};for _ ,_dfc :=range _aaba .Elements (){_geab ,_faf :=_c .GetIndirect (_dfc );if !_faf {break ;};_ded ._egb =append (_ded ._egb ,_geab );};return _ded ;};
|
|
|
|
// CompressStreams compresses uncompressed streams.
|
|
// It implements interface model.Optimizer.
|
|
type CompressStreams struct{};func _ac (_ae *_cfg .ContentStreamOperations )*_cfg .ContentStreamOperations {if _ae ==nil {return nil ;};_fd :=_cfg .ContentStreamOperations {};for _ ,_ag :=range *_ae {switch _ag .Operand {case "\u0042\u0044\u0043","\u0042\u004d\u0043","\u0045\u004d\u0043":continue ;case "\u0054\u006d":if len (_ag .Params )==6{if _be ,_ega :=_c .GetNumbersAsFloat (_ag .Params );_ega ==nil {if _be [0]==1&&_be [1]==0&&_be [2]==0&&_be [3]==1{_ag =&_cfg .ContentStreamOperation {Params :[]_c .PdfObject {_ag .Params [4],_ag .Params [5]},Operand :"\u0054\u0064"};};};};};_fd =append (_fd ,_ag );};return &_fd ;};
|
|
|
|
// Chain allows to use sequence of optimizers.
|
|
// It implements interface model.Optimizer.
|
|
type Chain struct{_ca []_aa .Optimizer };
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_ebd *CombineDuplicateDirectObjects )Optimize (objects []_c .PdfObject )(_afg []_c .PdfObject ,_ddf error ){_bagd (objects );_abab :=make (map[string ][]*_c .PdfObjectDictionary );var _bag func (_acc *_c .PdfObjectDictionary );_bag =func (_ddef *_c .PdfObjectDictionary ){for _ ,_bfdd :=range _ddef .Keys (){_aec :=_ddef .Get (_bfdd );if _cbb ,_efd :=_aec .(*_c .PdfObjectDictionary );_efd {_dgc :=_bc .New ();_dgc .Write ([]byte (_cbb .WriteString ()));_edc :=string (_dgc .Sum (nil ));_abab [_edc ]=append (_abab [_edc ],_cbb );_bag (_cbb );};};};for _ ,_bbb :=range objects {_bdfd ,_dddc :=_bbb .(*_c .PdfIndirectObject );if !_dddc {continue ;};if _agg ,_dcgb :=_bdfd .PdfObject .(*_c .PdfObjectDictionary );_dcgb {_bag (_agg );};};_gec :=make ([]_c .PdfObject ,0,len (_abab ));_ddc :=make (map[_c .PdfObject ]_c .PdfObject );for _ ,_adec :=range _abab {if len (_adec )< 2{continue ;};_efga :=_c .MakeDict ();_efga .Merge (_adec [0]);_eba :=_c .MakeIndirectObject (_efga );_gec =append (_gec ,_eba );for _dcge :=0;_dcge < len (_adec );_dcge ++{_gbe :=_adec [_dcge ];_ddc [_gbe ]=_eba ;};};_afg =make ([]_c .PdfObject ,len (objects ));copy (_afg ,objects );_afg =append (_gec ,_afg ...);_eee (_afg ,_ddc );return _afg ,nil ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_bcg *ImagePPI )Optimize (objects []_c .PdfObject )(_fae []_c .PdfObject ,_gdgg error ){if _bcg .ImageUpperPPI <=0{return objects ,nil ;};_bafe :=_fcd (objects );if len (_bafe )==0{return objects ,nil ;};_bdfc :=make (map[_c .PdfObject ]struct{});for _ ,_cfff :=range _bafe {_dggaa :=_cfff .Stream .PdfObjectDictionary .Get (_c .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_bdfc [_dggaa ]=struct{}{};};_fce :=make (map[*_c .PdfObjectStream ]*imageInfo );for _ ,_gbac :=range _bafe {_fce [_gbac .Stream ]=_gbac ;};var _abe *_c .PdfObjectDictionary ;for _ ,_eab :=range objects {if _egaf ,_dggc :=_c .GetDict (_eab );_abe ==nil &&_dggc {if _bbd ,_fcc :=_c .GetName (_egaf .Get (_c .PdfObjectName ("\u0054\u0079\u0070\u0065")));_fcc &&*_bbd =="\u0043a\u0074\u0061\u006c\u006f\u0067"{_abe =_egaf ;};};};if _abe ==nil {return objects ,nil ;};_gfa ,_dfbg :=_c .GetDict (_abe .Get (_c .PdfObjectName ("\u0050\u0061\u0067e\u0073")));if !_dfbg {return objects ,nil ;};_eea ,_ec :=_c .GetArray (_gfa .Get (_c .PdfObjectName ("\u004b\u0069\u0064\u0073")));if !_ec {return objects ,nil ;};_afad :=make (map[string ]*imageInfo );for _ ,_bagb :=range _eea .Elements (){_dcad ,_dgfc :=_c .GetDict (_bagb );if !_dgfc {continue ;};_fdg ,_fgb :=_c .GetArray (_dcad .Get ("\u0043\u006f\u006e\u0074\u0065\u006e\u0074\u0073"));if !_fgb {continue ;};_aab ,_fdac :=_c .GetDict (_dcad .Get ("\u0052e\u0073\u006f\u0075\u0072\u0063\u0065s"));if !_fdac {continue ;};_bdd ,_gbbb :=_c .GetDict (_aab .Get ("\u0058O\u0062\u006a\u0065\u0063\u0074"));if !_gbbb {continue ;};_edcc :=_bdd .Keys ();for _ ,_abf :=range _edcc {if _cafd ,_cfed :=_c .GetStream (_bdd .Get (_abf ));_cfed {if _bcec ,_abac :=_fce [_cafd ];_abac {_afad [string (_abf )]=_bcec ;};};};for _ ,_gdf :=range _fdg .Elements (){if _efdf ,_afac :=_c .GetStream (_gdf );_afac {_bbge ,_dadb :=_c .NewEncoderFromStream (_efdf );if _dadb !=nil {return nil ,_dadb ;};_cdb ,_dadb :=_bbge .DecodeStream (_efdf );if _dadb !=nil {return nil ,_dadb ;};_dbad :=_cfg .NewContentStreamParser (string (_cdb ));_fge ,_dadb :=_dbad .Parse ();if _dadb !=nil {return nil ,_dadb ;};_gcee ,_bdb :=1.0,1.0;for _ ,_dgef :=range *_fge {if _dgef .Operand =="\u0051"{_gcee ,_bdb =1.0,1.0;};if _dgef .Operand =="\u0063\u006d"&&len (_dgef .Params )==6{if _bdgf ,_eeaf :=_c .GetFloatVal (_dgef .Params [0]);_eeaf {_gcee =_gcee *_bdgf ;};if _adf ,_dafb :=_c .GetFloatVal (_dgef .Params [3]);_dafb {_bdb =_bdb *_adf ;};if _abfb ,_adc :=_c .GetIntVal (_dgef .Params [0]);_adc {_gcee =_gcee *float64 (_abfb );};if _cbge ,_aabg :=_c .GetIntVal (_dgef .Params [3]);_aabg {_bdb =_bdb *float64 (_cbge );};};if _dgef .Operand =="\u0044\u006f"&&len (_dgef .Params )==1{_cbbd ,_badb :=_c .GetName (_dgef .Params [0]);if !_badb {continue ;};if _eafa ,_bgf :=_afad [string (*_cbbd )];_bgf {_cgg ,_dadg :=_gcee /72.0,_bdb /72.0;_agc ,_dgd :=float64 (_eafa .Width )/_cgg ,float64 (_eafa .Height )/_dadg ;if _cgg ==0||_dadg ==0{_agc =72.0;_dgd =72.0;};_eafa .PPI =_b .Max (_eafa .PPI ,_agc );_eafa .PPI =_b .Max (_eafa .PPI ,_dgd );};};};};};};for _ ,_eecc :=range _bafe {if _ ,_gada :=_bdfc [_eecc .Stream ];_gada {continue ;};if _eecc .PPI <=_bcg .ImageUpperPPI {continue ;};_efb :=_bcg .ImageUpperPPI /_eecc .PPI ;if _bfcg :=_dgf (_eecc .Stream ,_efb );_bfcg !=nil {_cf .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",_bfcg );}else {if _affe ,_fbg :=_c .GetStream (_eecc .Stream .PdfObjectDictionary .Get (_c .PdfObjectName ("\u0053\u004d\u0061s\u006b")));_fbg {if _cecb :=_dgf (_affe ,_efb );_cecb !=nil {return nil ,_cecb ;};};};};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 (_dbd *Image )Optimize (objects []_c .PdfObject )(_aga []_c .PdfObject ,_ababf error ){if _dbd .ImageQuality <=0{return objects ,nil ;};_caeg :=_fcd (objects );if len (_caeg )==0{return objects ,nil ;};_fda :=make (map[_c .PdfObject ]_c .PdfObject );_dbab :=make (map[_c .PdfObject ]struct{});for _ ,_aebad :=range _caeg {_ffe :=_aebad .Stream .PdfObjectDictionary .Get (_c .PdfObjectName ("\u0053\u004d\u0061s\u006b"));_dbab [_ffe ]=struct{}{};};for _cgb ,_fbf :=range _caeg {_fecb :=_fbf .Stream ;if _ ,_dfg :=_dbab [_fecb ];_dfg {continue ;};_bbe ,_beaf :=_c .NewEncoderFromStream (_fecb );if _beaf !=nil {_cf .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 ;};_cdaa ,_beaf :=_bbe .DecodeStream (_fecb );if _beaf !=nil {_cf .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 ;};_affb :=_c .NewDCTEncoder ();_affb .ColorComponents =_fbf .ColorComponents ;_affb .Quality =_dbd .ImageQuality ;_affb .BitsPerComponent =_fbf .BitsPerComponent ;_affb .Width =_fbf .Width ;_affb .Height =_fbf .Height ;_accd ,_beaf :=_affb .EncodeBytes (_cdaa );if _beaf !=nil {_cf .Log .Debug ("\u0045R\u0052\u004f\u0052\u003a\u0020\u0025v",_beaf );return nil ,_beaf ;};var _ggd _c .StreamEncoder ;_ggd =_affb ;{_cfc :=_c .NewFlateEncoder ();_deg :=_c .NewMultiEncoder ();_deg .AddEncoder (_cfc );_deg .AddEncoder (_affb );_edfb ,_edb :=_deg .EncodeBytes (_cdaa );if _edb !=nil {return nil ,_edb ;};if len (_edfb )< len (_accd ){_cf .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 (_accd ),len (_edfb ),len (_fecb .Stream ));_accd =_edfb ;_ggd =_deg ;};};_bad :=len (_fecb .Stream );if _bad < len (_accd ){continue ;};_adeb :=&_c .PdfObjectStream {Stream :_accd };_adeb .PdfObjectReference =_fecb .PdfObjectReference ;_adeb .PdfObjectDictionary =_c .MakeDict ();_adeb .Merge (_fecb .PdfObjectDictionary );_adeb .Merge (_ggd .MakeStreamDict ());_adeb .Set ("\u004c\u0065\u006e\u0067\u0074\u0068",_c .MakeInteger (int64 (len (_accd ))));_fda [_fecb ]=_adeb ;_caeg [_cgb ].Stream =_adeb ;};_aga =make ([]_c .PdfObject ,len (objects ));copy (_aga ,objects );_eee (_aga ,_fda );return _aga ,nil ;};func _bagd (_aefc []_c .PdfObject ){for _gfd ,_fdag :=range _aefc {switch _ead :=_fdag .(type ){case *_c .PdfIndirectObject :_ead .ObjectNumber =int64 (_gfd +1);_ead .GenerationNumber =0;case *_c .PdfObjectStream :_ead .ObjectNumber =int64 (_gfd +1);_ead .GenerationNumber =0;case *_c .PdfObjectStreams :_ead .ObjectNumber =int64 (_gfd +1);_ead .GenerationNumber =0;};};};type content struct{_dbe string ;_efg *_aa .PdfPageResources ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_dbf *CombineIdenticalIndirectObjects )Optimize (objects []_c .PdfObject )(_cfge []_c .PdfObject ,_afab error ){_bagd (objects );_ggf :=make (map[_c .PdfObject ]_c .PdfObject );_egde :=make (map[_c .PdfObject ]struct{});_dad :=make (map[string ][]*_c .PdfIndirectObject );for _ ,_fad :=range objects {_bbbf ,_gcg :=_fad .(*_c .PdfIndirectObject );if !_gcg {continue ;};if _gdb ,_dgga :=_bbbf .PdfObject .(*_c .PdfObjectDictionary );_dgga {if _bdff ,_eec :=_gdb .Get ("\u0054\u0079\u0070\u0065").(*_c .PdfObjectName );_eec &&*_bdff =="\u0050\u0061\u0067\u0065"{continue ;};_ddfa :=_bc .New ();_ddfa .Write ([]byte (_gdb .WriteString ()));_ffc :=string (_ddfa .Sum (nil ));_dad [_ffc ]=append (_dad [_ffc ],_bbbf );};};for _ ,_cfe :=range _dad {if len (_cfe )< 2{continue ;};_bgcd :=_cfe [0];for _bebd :=1;_bebd < len (_cfe );_bebd ++{_bbg :=_cfe [_bebd ];_ggf [_bbg ]=_bgcd ;_egde [_bbg ]=struct{}{};};};_cfge =make ([]_c .PdfObject ,0,len (objects )-len (_egde ));for _ ,_daag :=range objects {if _ ,_dcag :=_egde [_daag ];_dcag {continue ;};_cfge =append (_cfge ,_daag );};_eee (_cfge ,_ggf );return _cfge ,nil ;};
|
|
|
|
// Append appends optimizers to the chain.
|
|
func (_cbg *Chain )Append (optimizers ..._aa .Optimizer ){_cbg ._ca =append (_cbg ._ca ,optimizers ...)};
|
|
|
|
// CombineIdenticalIndirectObjects combines identical indirect objects.
|
|
// It implements interface model.Optimizer.
|
|
type CombineIdenticalIndirectObjects struct{};func _gfe (_cba *_c .PdfObjectStream ,_dae []rune ,_acb []_af .GlyphIndex )error {_cba ,_ccg :=_c .GetStream (_cba );if !_ccg {_cf .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 _dg .New ("\u0066\u006f\u006e\u0074fi\u006c\u0065\u0032\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_ccfd ,_fba :=_c .DecodeStream (_cba );if _fba !=nil {_cf .Log .Debug ("\u0044\u0065c\u006f\u0064\u0065 \u0065\u0072\u0072\u006f\u0072\u003a\u0020\u0025\u0076",_fba );return _fba ;};_bab ,_fba :=_af .Parse (_eg .NewReader (_ccfd ));if _fba !=nil {_cf .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 (_cba .Stream ));return _fba ;};_ffb :=_acb ;if len (_dae )> 0{_aebf :=_bab .LookupRunes (_dae );_ffb =append (_ffb ,_aebf ...);};_bab ,_fba =_bab .SubsetKeepIndices (_ffb );if _fba !=nil {_cf .Log .Debug ("\u0045R\u0052\u004f\u0052\u0020s\u0075\u0062\u0073\u0065\u0074t\u0069n\u0067 \u0066\u006f\u006e\u0074\u003a\u0020\u0025v",_fba );return _fba ;};var _eda _eg .Buffer ;_fba =_bab .Write (&_eda );if _fba !=nil {_cf .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_fba );return _fba ;};if _eda .Len ()> len (_ccfd ){_cf .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 ;};_bfa ,_fba :=_c .MakeStream (_eda .Bytes (),_c .NewFlateEncoder ());if _fba !=nil {_cf .Log .Debug ("\u0045\u0052\u0052\u004fR \u0057\u0072\u0069\u0074\u0069\u006e\u0067\u0020\u0066\u006f\u006e\u0074\u003a\u0020%\u0076",_fba );return _fba ;};*_cba =*_bfa ;_cba .Set ("\u004ce\u006e\u0067\u0074\u0068\u0031",_c .MakeInteger (int64 (_eda .Len ())));return nil ;};
|
|
|
|
// CombineDuplicateStreams combines duplicated streams by its data hash.
|
|
// It implements interface model.Optimizer.
|
|
type CombineDuplicateStreams struct{};
|
|
|
|
// ObjectStreams groups PDF objects to object streams.
|
|
// It implements interface model.Optimizer.
|
|
type ObjectStreams struct{};func _eee (_dgbb []_c .PdfObject ,_beag map[_c .PdfObject ]_c .PdfObject ){if _beag ==nil ||len (_beag )==0{return ;};for _dcbf ,_bbdc :=range _dgbb {if _ggb ,_cdab :=_beag [_bbdc ];_cdab {_dgbb [_dcbf ]=_ggb ;continue ;};_beag [_bbdc ]=_bbdc ;switch _becf :=_bbdc .(type ){case *_c .PdfObjectArray :_beeg :=make ([]_c .PdfObject ,_becf .Len ());copy (_beeg ,_becf .Elements ());_eee (_beeg ,_beag );for _bccg ,_geb :=range _beeg {_becf .Set (_bccg ,_geb );};case *_c .PdfObjectStreams :_eee (_becf .Elements (),_beag );case *_c .PdfObjectStream :_gbg :=[]_c .PdfObject {_becf .PdfObjectDictionary };_eee (_gbg ,_beag );_becf .PdfObjectDictionary =_gbg [0].(*_c .PdfObjectDictionary );case *_c .PdfObjectDictionary :_age :=_becf .Keys ();_gfee :=make ([]_c .PdfObject ,len (_age ));for _gbca ,_cggg :=range _age {_gfee [_gbca ]=_becf .Get (_cggg );};_eee (_gfee ,_beag );for _fade ,_egfg :=range _age {_becf .Set (_egfg ,_gfee [_fade ]);};case *_c .PdfIndirectObject :_cffa :=[]_c .PdfObject {_becf .PdfObject };_eee (_cffa ,_beag );_becf .PdfObject =_cffa [0];};};};type objectStructure struct{_dddd *_c .PdfObjectDictionary ;_eeg *_c .PdfObjectDictionary ;_egb []*_c .PdfIndirectObject ;};
|
|
|
|
// Optimize optimizes PDF objects to decrease PDF size.
|
|
func (_df *Chain )Optimize (objects []_c .PdfObject )(_bd []_c .PdfObject ,_caf error ){_bd =objects ;for _ ,_g :=range _df ._ca {_bd ,_caf =_g .Optimize (_bd );if _caf !=nil {return _bd ,_caf ;};};return _bd ,nil ;};func _dgf (_bce *_c .PdfObjectStream ,_dfdg float64 )error {_agf ,_dea :=_aa .NewXObjectImageFromStream (_bce );if _dea !=nil {return _dea ;};_ddaa ,_dea :=_agf .ToImage ();if _dea !=nil {return _dea ;};_dcgeg ,_dea :=_ddaa .ToGoImage ();if _dea !=nil {return _dea ;};_gfbd :=int (_b .RoundToEven (float64 (_ddaa .Width )*_dfdg ));_agaa :=int (_b .RoundToEven (float64 (_ddaa .Height )*_dfdg ));_gcce :=_cc .Rect (0,0,_gfbd ,_agaa );var _eefdd _cb .Image ;var _gea func (_cc .Image )(*_aa .Image ,error );switch _agf .ColorSpace .String (){case "\u0044e\u0076\u0069\u0063\u0065\u0052\u0047B":_eefdd =_cc .NewRGBA (_gcce );_gea =_aa .ImageHandling .NewImageFromGoImage ;case "\u0044\u0065\u0076\u0069\u0063\u0065\u0047\u0072\u0061\u0079":_eefdd =_cc .NewGray (_gcce );_gea =_aa .ImageHandling .NewGrayImageFromGoImage ;default:return _e .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",_agf .ColorSpace .String ());};_cb .CatmullRom .Scale (_eefdd ,_eefdd .Bounds (),_dcgeg ,_dcgeg .Bounds (),_cb .Over ,&_cb .Options {});if _ddaa ,_dea =_gea (_eefdd );_dea !=nil {return _dea ;};_dcbd :=_c .MakeDict ();_dcbd .Set ("\u0051u\u0061\u006c\u0069\u0074\u0079",_c .MakeInteger (100));_dcbd .Set ("\u0050r\u0065\u0064\u0069\u0063\u0074\u006fr",_c .MakeInteger (1));_agf .Filter .UpdateParams (_dcbd );if _dea =_agf .SetImage (_ddaa ,nil );_dea !=nil {return _dea ;};_agf .ToPdfObject ();return nil ;};type imageInfo struct{ColorSpace _c .PdfObjectName ;BitsPerComponent int ;ColorComponents int ;Width int ;Height int ;Stream *_c .PdfObjectStream ;PPI float64 ;}; |