unipdf/redactor/redactor.go
2024-12-20 06:39:10 +00:00

111 lines
23 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 redactor ;import (_d "errors";_b "fmt";_df "github.com/unidoc/unipdf/v3/common";_bg "github.com/unidoc/unipdf/v3/contentstream";_ca "github.com/unidoc/unipdf/v3/core";_eg "github.com/unidoc/unipdf/v3/creator";_f "github.com/unidoc/unipdf/v3/extractor";
_g "github.com/unidoc/unipdf/v3/model";_a "io";_c "regexp";_ag "sort";_ad "strings";);func _db (_bd *_bg .ContentStreamOperation ,_bdc _ca .PdfObject ,_de []localSpanMarks )error {_bc ,_ccc :=_ca .GetArray (_bd .Params [0]);_bde :=[]_ca .PdfObject {};if !_ccc {_df .Log .Debug ("\u0045\u0052\u0052OR\u003a\u0020\u0054\u004a\u0020\u006f\u0070\u003d\u0025s\u0020G\u0065t\u0041r\u0072\u0061\u0079\u0056\u0061\u006c\u0020\u0066\u0061\u0069\u006c\u0065\u0064",_bd );
return _b .Errorf ("\u0073\u0070\u0061\u006e\u004d\u0061\u0072\u006bs\u002e\u0042\u0042ox\u0020\u0068\u0061\u0073\u0020\u006eo\u0020\u0062\u006f\u0075\u006e\u0064\u0069\u006e\u0067\u0020\u0062\u006f\u0078\u002e\u0020s\u0070\u0061\u006e\u004d\u0061\u0072\u006b\u0073=\u0025\u0073",_bd );
};_abe ,_bca :=_egeg (_de );if len (_bca )==1{_dfc :=_bca [0];_eb :=_abe [_dfc ];if len (_eb )==1{_dd :=_eb [0];_cba :=_dd ._fcd ;_ea :=_gbg (_cba );_cbd ,_bbg :=_agfg (_bdc ,_ea );if _bbg !=nil {return _bbg ;};_ga ,_bbg :=_cgb (_dd ,_cba ,_ea ,_cbd ,_dfc );
if _bbg !=nil {return _bbg ;};for _ ,_bfc :=range _bc .Elements (){if _bfc ==_bdc {_bde =append (_bde ,_ga ...);}else {_bde =append (_bde ,_bfc );};};}else {_fa :=_eb [0]._fcd ;_gac :=_gbg (_fa );_cg ,_dba :=_agfg (_bdc ,_gac );if _dba !=nil {return _dba ;
};_da ,_dba :=_bga (_cg ,_eb );if _dba !=nil {return _dba ;};_ee :=_dbd (_da );_cfa :=_daba (_cg ,_ee ,_gac );for _ ,_adc :=range _bc .Elements (){if _adc ==_bdc {_bde =append (_bde ,_cfa ...);}else {_bde =append (_bde ,_adc );};};};_bd .Params [0]=_ca .MakeArray (_bde ...);
}else if len (_bca )> 1{_cde :=_de [0];_efc :=_cde ._fcd ;_ ,_fdd :=_gf (_efc );_fg :=_efc .Elements ()[_fdd ];_be :=_fg .Font ;_ebf ,_ade :=_agfg (_bdc ,_be );if _ade !=nil {return _ade ;};_baa ,_ade :=_bga (_ebf ,_de );if _ade !=nil {return _ade ;};_dg :=_dbd (_baa );
_ced :=_daba (_ebf ,_dg ,_be );for _ ,_bfa :=range _bc .Elements (){if _bfa ==_bdc {_bde =append (_bde ,_ced ...);}else {_bde =append (_bde ,_bfa );};};_bd .Params [0]=_ca .MakeArray (_bde ...);};return nil ;};func _cbe (_bf *_bg .ContentStreamOperations ,_gge string ,_bff int )error {_aef :=_bg .ContentStreamOperations {};
var _dc _bg .ContentStreamOperation ;for _cf ,_gb :=range *_bf {if _cf ==_bff {if _gge =="\u0027"{_ce :=_bg .ContentStreamOperation {Operand :"\u0054\u002a"};_aef =append (_aef ,&_ce );_dc .Params =_gb .Params ;_dc .Operand ="\u0054\u006a";_aef =append (_aef ,&_dc );
}else if _gge =="\u0022"{_bba :=_gb .Params [:2];Tc ,Tw :=_bba [0],_bba [1];_ef :=_bg .ContentStreamOperation {Params :[]_ca .PdfObject {Tc },Operand :"\u0054\u0063"};_aef =append (_aef ,&_ef );_ef =_bg .ContentStreamOperation {Params :[]_ca .PdfObject {Tw },Operand :"\u0054\u0077"};
_aef =append (_aef ,&_ef );_dc .Params =[]_ca .PdfObject {_gb .Params [2]};_dc .Operand ="\u0054\u006a";_aef =append (_aef ,&_dc );};};_aef =append (_aef ,_gb );};*_bf =_aef ;return nil ;};func _gcc (_gbf RedactionTerm )(*regexMatcher ,error ){return &regexMatcher {_ddc :_gbf },nil };
func _fe (_adf ,_ffb string )[]int {if len (_ffb )==0{return nil ;};var _afb []int ;for _edc :=0;_edc < len (_adf );{_aad :=_ad .Index (_adf [_edc :],_ffb );if _aad < 0{return _afb ;};_afb =append (_afb ,_edc +_aad );_edc +=_aad +len (_ffb );};return _afb ;
};func _bga (_fcb string ,_gdeb []localSpanMarks )([]placeHolders ,error ){_fbc :="";_ebe :=[]placeHolders {};for _fcg ,_ed :=range _gdeb {_gdc :=_ed ._fcd ;_gae :=_ed ._ffc ;_cbfc :=_gbe (_gdc );_afa ,_fad :=_agba (_gdc );if _fad !=nil {return nil ,_fad ;
};if _cbfc !=_fbc {var _dcae []int ;if _fcg ==0&&_gae !=_cbfc {_fde :=_ad .Index (_fcb ,_cbfc );_dcae =[]int {_fde };}else if _fcg ==len (_gdeb )-1{_beb :=_ad .LastIndex (_fcb ,_cbfc );_dcae =[]int {_beb };}else {_dcae =_fe (_fcb ,_cbfc );};_ggb :=placeHolders {_ba :_dcae ,_adg :_cbfc ,_gg :_afa };
_ebe =append (_ebe ,_ggb );};_fbc =_cbfc ;};return _ebe ,nil ;};
// WriteToFile writes the redacted document to file specified by `outputPath`.
func (_fef *Redactor )WriteToFile (outputPath string )error {if _afab :=_fef ._eea .WriteToFile (outputPath );_afab !=nil {return _b .Errorf ("\u0066\u0061\u0069l\u0065\u0064\u0020\u0074o\u0020\u0077\u0072\u0069\u0074\u0065\u0020t\u0068\u0065\u0020\u006f\u0075\u0074\u0070\u0075\u0074\u0020\u0066\u0069\u006c\u0065");
};return nil ;};func _agfg (_cfe _ca .PdfObject ,_eeg *_g .PdfFont )(string ,error ){_dbc ,_dagf :=_ca .GetStringBytes (_cfe );if !_dagf {return "",_ca .ErrTypeError ;};_facc :=_eeg .BytesToCharcodes (_dbc );_gabg ,_ccgd ,_cfg :=_eeg .CharcodesToStrings (_facc ,"");
if _cfg > 0{_df .Log .Debug ("\u0072\u0065nd\u0065\u0072\u0054e\u0078\u0074\u003a\u0020num\u0043ha\u0072\u0073\u003d\u0025\u0064\u0020\u006eum\u004d\u0069\u0073\u0073\u0065\u0073\u003d%\u0064",_ccgd ,_cfg );};_age :=_ad .Join (_gabg ,"");return _age ,nil ;
};func _dfe (_efag *_f .TextMarkArray )[]*_f .TextMarkArray {_cefb :=_efag .Elements ();_cbeg :=len (_cefb );var _gfde _ca .PdfObject ;_gaac :=[]*_f .TextMarkArray {};_ddgf :=&_f .TextMarkArray {};_fcba :=-1;for _cdb ,_cbba :=range _cefb {_ada :=_cbba .DirectObject ;
_fcba =_cbba .Index ;if _ada ==nil {_gbcc :=_eac (_efag ,_cdb ,_fcba );if _gfde !=nil {if _gbcc ==-1||_gbcc > _cdb {_gaac =append (_gaac ,_ddgf );_ddgf =&_f .TextMarkArray {};};};}else if _ada !=nil &&_gfde ==nil {if _fcba ==0&&_cdb > 0{_gaac =append (_gaac ,_ddgf );
_ddgf =&_f .TextMarkArray {};};}else if _ada !=nil &&_gfde !=nil {if _ada !=_gfde {_gaac =append (_gaac ,_ddgf );_ddgf =&_f .TextMarkArray {};};};_gfde =_ada ;_ddgf .Append (_cbba );if _cdb ==(_cbeg -1){_gaac =append (_gaac ,_ddgf );};};return _gaac ;};
func _bffb (_fbf ,_afd targetMap )(bool ,[]int ){_dea :=_ad .Contains (_fbf ._bcf ,_afd ._bcf );var _gcbd []int ;for _ ,_faaf :=range _fbf ._bea {for _agea ,_abd :=range _afd ._bea {if _abd [0]>=_faaf [0]&&_abd [1]<=_faaf [1]{_gcbd =append (_gcbd ,_agea );
};};};return _dea ,_gcbd ;};
// RedactionTerm holds the regexp pattern and the replacement string for the redaction process.
type RedactionTerm struct{Pattern *_c .Regexp ;};
// Redactor represents a Redactor object.
type Redactor struct{_bed *_g .PdfReader ;_decc *RedactionOptions ;_eea *_eg .Creator ;_cfgg *RectangleProps ;};
// Write writes the content of `re.creator` to writer of type io.Writer interface.
func (_eabg *Redactor )Write (writer _a .Writer )error {return _eabg ._eea .Write (writer )};func _agba (_ec *_f .TextMarkArray )(float64 ,error ){_bgd ,_cdg :=_ec .BBox ();if !_cdg {return 0.0,_b .Errorf ("\u0073\u0070\u0061\u006e\u004d\u0061\u0072\u006bs\u002e\u0042\u0042ox\u0020\u0068\u0061\u0073\u0020\u006eo\u0020\u0062\u006f\u0075\u006e\u0064\u0069\u006e\u0067\u0020\u0062\u006f\u0078\u002e\u0020s\u0070\u0061\u006e\u004d\u0061\u0072\u006b\u0073=\u0025\u0073",_ec );
};_aab :=_cd (_ec );_bbf :=0.0;_ ,_ffg :=_gf (_ec );_acf :=_ec .Elements ()[_ffg ];_gbc :=_acf .Font ;if _aab > 0{_bbf =_ge (_gbc ,_acf );};_edf :=(_bgd .Urx -_bgd .Llx );_edf =_edf +_bbf *float64 (_aab );Tj :=_bgbe (_edf ,_acf .FontSize ,_acf .Th );return Tj ,nil ;
};type replacement struct{_aga string ;_ff float64 ;_ae int ;};func _eac (_ccgc *_f .TextMarkArray ,_edd int ,_dcga int )int {_dbaab :=_ccgc .Elements ();_beee :=_edd -1;_cac :=_edd +1;_badb :=-1;if _beee >=0{_fdda :=_dbaab [_beee ];_fcfa :=_fdda .ObjString ;
_bbdb :=len (_fcfa );_ace :=_fdda .Index ;if _ace +1< _bbdb {_badb =_beee ;return _badb ;};};if _cac < len (_dbaab ){_acfc :=_dbaab [_cac ];_gce :=_acfc .ObjString ;if _gce [0]!=_acfc .Text {_badb =_cac ;return _badb ;};};return _badb ;};type targetMap struct{_bcf string ;
_bea [][]int ;};func _fcbg (_cffg int ,_fda []int )bool {for _ ,_ead :=range _fda {if _ead ==_cffg {return true ;};};return false ;};
// New instantiates a Redactor object with given PdfReader and `regex` pattern.
func New (reader *_g .PdfReader ,opts *RedactionOptions ,rectProps *RectangleProps )*Redactor {if rectProps ==nil {rectProps =RedactRectanglePropsNew ();};return &Redactor {_bed :reader ,_decc :opts ,_eea :_eg .New (),_cfgg :rectProps };};func _dbd (_gdgf []placeHolders )[]replacement {_dcc :=[]replacement {};
for _ ,_fgf :=range _gdgf {_gdga :=_fgf ._ba ;_fff :=_fgf ._adg ;_cad :=_fgf ._gg ;for _ ,_aac :=range _gdga {_fddd :=replacement {_aga :_fff ,_ff :_cad ,_ae :_aac };_dcc =append (_dcc ,_fddd );};};_ag .Slice (_dcc ,func (_abc ,_debg int )bool {return _dcc [_abc ]._ae < _dcc [_debg ]._ae });
return _dcc ;};func _bdfa (_faef *targetMap ,_agg []int ){var _feeg [][]int ;for _dff ,_bacd :=range _faef ._bea {if _fcbg (_dff ,_agg ){continue ;};_feeg =append (_feeg ,_bacd );};_faef ._bea =_feeg ;};
// Redact executes the redact operation on a pdf file and updates the content streams of all pages of the file.
func (_fcdg *Redactor )Redact ()error {_badg ,_eef :=_fcdg ._bed .GetNumPages ();if _eef !=nil {return _b .Errorf ("\u0066\u0061\u0069\u006c\u0065\u0064 \u0074\u006f\u0020\u0067\u0065\u0074\u0020\u0074\u0068\u0065\u0020\u006e\u0075m\u0062\u0065\u0072\u0020\u006f\u0066\u0020P\u0061\u0067\u0065\u0073");
};_bcfa :=_fcdg ._cfgg .FillColor ;_cedb :=_fcdg ._cfgg .BorderWidth ;_bgf :=_fcdg ._cfgg .FillOpacity ;for _ddg :=1;_ddg <=_badg ;_ddg ++{_cef ,_baad :=_fcdg ._bed .GetPage (_ddg );if _baad !=nil {return _baad ;};_bcb ,_baad :=_f .New (_cef );if _baad !=nil {return _baad ;
};_bae ,_ ,_ ,_baad :=_bcb .ExtractPageText ();if _baad !=nil {return _baad ;};_bce :=_bae .GetContentStreamOps ();_egda ,_cfaf ,_baad :=_fcdg .redactPage (_bce ,_cef .Resources );if _cfaf ==nil {_df .Log .Info ("N\u006f\u0020\u006d\u0061\u0074\u0063\u0068\u0020\u0066\u006f\u0075\u006e\u0064\u0020\u0066\u006f\u0072\u0020t\u0068\u0065\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065d \u0070\u0061\u0074t\u0061r\u006e\u002e");
_cfaf =_bce ;};_deg :=_bg .ContentStreamOperation {Operand :"\u006e"};*_cfaf =append (*_cfaf ,&_deg );_cef .SetContentStreams ([]string {_cfaf .String ()},_ca .NewFlateEncoder ());if _baad !=nil {return _baad ;};_bab ,_baad :=_cef .GetMediaBox ();if _baad !=nil {return _baad ;
};if _cef .MediaBox ==nil {_cef .MediaBox =_bab ;};if _cfee :=_fcdg ._eea .AddPage (_cef );_cfee !=nil {return _cfee ;};_ag .Slice (_egda ,func (_gaef ,_fee int )bool {return _egda [_gaef ]._gdcc < _egda [_fee ]._gdcc });_dbg :=_bab .Ury ;for _ ,_ged :=range _egda {_gbgb :=_ged ._daa ;
_acbc :=_fcdg ._eea .NewRectangle (_gbgb .Llx ,_dbg -_gbgb .Lly ,_gbgb .Urx -_gbgb .Llx ,-(_gbgb .Ury -_gbgb .Lly ));_acbc .SetFillColor (_bcfa );_acbc .SetBorderWidth (_cedb );_acbc .SetFillOpacity (_bgf );if _faae :=_fcdg ._eea .Draw (_acbc );_faae !=nil {return nil ;
};};};_fcdg ._eea .SetOutlineTree (_fcdg ._bed .GetOutlineTree ());return nil ;};func _fdc (_aaee []*targetMap ){for _cca ,_cfb :=range _aaee {for _bfe ,_cdc :=range _aaee {if _cca !=_bfe {_gba ,_aba :=_bffb (*_cfb ,*_cdc );if _gba {_bdfa (_cdc ,_aba );
};};};};};type matchedBBox struct{_daa _g .PdfRectangle ;_gdcc string ;};func _cd (_ab *_f .TextMarkArray )int {_bad :=0;_bbc :=_ab .Elements ();if _bbc [0].Text =="\u0020"{_bad ++;};if _bbc [_ab .Len ()-1].Text =="\u0020"{_bad ++;};return _bad ;};
// RectangleProps defines properties of the redaction rectangle to be drawn.
type RectangleProps struct{FillColor _eg .Color ;BorderWidth float64 ;FillOpacity float64 ;};type regexMatcher struct{_ddc RedactionTerm };func _abg (_cece *matchedIndex ,_eecc [][]int )(bool ,[][]int ){_beda :=[][]int {};for _ ,_baab :=range _eecc {if _cece ._dda < _baab [0]&&_cece ._fbca > _baab [1]{_beda =append (_beda ,_baab );
};};return len (_beda )> 0,_beda ;};
// RedactRectanglePropsNew return a new pointer to a default RectangleProps object.
func RedactRectanglePropsNew ()*RectangleProps {return &RectangleProps {FillColor :_eg .ColorBlack ,BorderWidth :0.0,FillOpacity :1.0};};func _egeg (_bdd []localSpanMarks )(map[string ][]localSpanMarks ,[]string ){_bfcf :=make (map[string ][]localSpanMarks );
_aed :=[]string {};for _ ,_cge :=range _bdd {_acd :=_cge ._ffc ;if _bada ,_gde :=_bfcf [_acd ];_gde {_bfcf [_acd ]=append (_bada ,_cge );}else {_bfcf [_acd ]=[]localSpanMarks {_cge };_aed =append (_aed ,_acd );};};return _bfcf ,_aed ;};func _gea (_gbb []*matchedIndex )[]*targetMap {_cgec :=make (map[string ][][]int );
_ffa :=[]*targetMap {};for _ ,_gcbe :=range _gbb {_eacb :=_gcbe ._aadd ;_dafg :=[]int {_gcbe ._dda ,_gcbe ._fbca };if _decg ,_gdce :=_cgec [_eacb ];_gdce {_cgec [_eacb ]=append (_decg ,_dafg );}else {_cgec [_eacb ]=[][]int {_dafg };};};for _afbd ,_bfdg :=range _cgec {_cegd :=&targetMap {_bcf :_afbd ,_bea :_bfdg };
_ffa =append (_ffa ,_cegd );};return _ffa ;};func (_bcg *regexMatcher )match (_gaefd string )([]*matchedIndex ,error ){_bece :=_bcg ._ddc .Pattern ;if _bece ==nil {return nil ,_d .New ("\u006e\u006f\u0020\u0070at\u0074\u0065\u0072\u006e\u0020\u0063\u006f\u006d\u0070\u0069\u006c\u0065\u0064");
};var (_agce =_bece .FindAllStringIndex (_gaefd ,-1);_ecd []*matchedIndex ;);for _ ,_bbfb :=range _agce {_ecd =append (_ecd ,&matchedIndex {_dda :_bbfb [0],_fbca :_bbfb [1],_aadd :_gaefd [_bbfb [0]:_bbfb [1]]});};return _ecd ,nil ;};func _agb (_cc *_bg .ContentStreamOperations ,_aa map[_ca .PdfObject ][]localSpanMarks )error {for _ege ,_fd :=range _aa {if _ege ==nil {continue ;
};_egd ,_fc ,_gd :=_dfcf (_cc ,_ege );if !_gd {_df .Log .Debug ("Pd\u0066\u004fb\u006a\u0065\u0063\u0074\u0020\u0025\u0073\u006e\u006ft\u0020\u0066\u006f\u0075\u006e\u0064\u0020\u0069\u006e\u0020\u0073\u0069\u0064\u0065\u0020\u0074\u0068\u0065\u0020\u0063\u006f\u006e\u0074\u0065\u006e\u0074\u0073\u0074r\u0065a\u006d\u0020\u006f\u0070\u0065\u0072\u0061\u0074i\u006fn\u0020\u0025s",_ege ,_cc );
return nil ;};if _egd .Operand =="\u0054\u006a"{_bb :=_dgf (_egd ,_ege ,_fd );if _bb !=nil {return _bb ;};}else if _egd .Operand =="\u0054\u004a"{_dfg :=_db (_egd ,_ege ,_fd );if _dfg !=nil {return _dfg ;};}else if _egd .Operand =="\u0027"||_egd .Operand =="\u0022"{_cb :=_cbe (_cc ,_egd .Operand ,_fc );
if _cb !=nil {return _cb ;};_cb =_dgf (_egd ,_ege ,_fd );if _cb !=nil {return _cb ;};};};return nil ;};func _dfcf (_dbaa *_bg .ContentStreamOperations ,PdfObj _ca .PdfObject )(*_bg .ContentStreamOperation ,int ,bool ){for _gdd ,_ddbc :=range *_dbaa {_eag :=_ddbc .Operand ;
if _eag =="\u0054\u006a"{_efca :=_ca .TraceToDirectObject (_ddbc .Params [0]);if _efca ==PdfObj {return _ddbc ,_gdd ,true ;};}else if _eag =="\u0054\u004a"{_agbad ,_gga :=_ca .GetArray (_ddbc .Params [0]);if !_gga {return nil ,_gdd ,_gga ;};for _ ,_dbf :=range _agbad .Elements (){if _dbf ==PdfObj {return _ddbc ,_gdd ,true ;
};};}else if _eag =="\u0022"{_caf :=_ca .TraceToDirectObject (_ddbc .Params [2]);if _caf ==PdfObj {return _ddbc ,_gdd ,true ;};}else if _eag =="\u0027"{_dbag :=_ca .TraceToDirectObject (_ddbc .Params [0]);if _dbag ==PdfObj {return _ddbc ,_gdd ,true ;};
};};return nil ,-1,false ;};func _daed (_cbdd *matchedIndex ,_agec [][]int )[]*matchedIndex {_fede :=[]*matchedIndex {};_acbd :=_cbdd ._dda ;_bgg :=_acbd ;_bdbe :=_cbdd ._aadd ;_cccd :=0;for _ ,_cgc :=range _agec {_gaf :=_cgc [0]-_acbd ;if _cccd >=_gaf {continue ;
};_fddad :=_bdbe [_cccd :_gaf ];_gbga :=&matchedIndex {_aadd :_fddad ,_dda :_bgg ,_fbca :_cgc [0]};if len (_ad .TrimSpace (_fddad ))!=0{_fede =append (_fede ,_gbga );};_cccd =_cgc [1]-_acbd ;_bgg =_acbd +_cccd ;};_bbbg :=_bdbe [_cccd :];_fec :=&matchedIndex {_aadd :_bbbg ,_dda :_bgg ,_fbca :_cbdd ._fbca };
if len (_ad .TrimSpace (_bbbg ))!=0{_fede =append (_fede ,_fec );};return _fede ;};
// RedactionOptions is a collection of RedactionTerm objects.
type RedactionOptions struct{Terms []RedactionTerm ;};func (_dfa *Redactor )redactPage (_bdda *_bg .ContentStreamOperations ,_ecc *_g .PdfPageResources )([]matchedBBox ,*_bg .ContentStreamOperations ,error ){_cbg ,_cfcc :=_f .NewFromContents (_bdda .String (),_ecc );
if _cfcc !=nil {return nil ,nil ,_cfcc ;};_cgeb ,_ ,_ ,_cfcc :=_cbg .ExtractPageText ();if _cfcc !=nil {return nil ,nil ,_cfcc ;};_bdda =_cgeb .GetContentStreamOps ();_cga :=_cgeb .Marks ();_eee :=_cgeb .Text ();_eee ,_gca :=_ecf (_eee );_gfd :=[]matchedBBox {};
_gege :=make (map[_ca .PdfObject ][]localSpanMarks );_cgeg :=[]*targetMap {};for _ ,_efg :=range _dfa ._decc .Terms {_eefc ,_gfa :=_gcc (_efg );if _gfa !=nil {return nil ,nil ,_gfa ;};_ebfd ,_gfa :=_eefc .match (_eee );if _gfa !=nil {return nil ,nil ,_gfa ;
};_ebfd =_ffab (_ebfd ,_gca );_cfeb :=_gea (_ebfd );_cgeg =append (_cgeg ,_cfeb ...);};_fdc (_cgeg );for _ ,_agag :=range _cgeg {_gdcg :=_agag ._bcf ;_deee :=_agag ._bea ;_fdf :=[]matchedBBox {};for _ ,_bcaf :=range _deee {_fbcf ,_gaefa ,_bedf :=_bfcd (_bcaf ,_cga ,_gdcg );
if _bedf !=nil {return nil ,nil ,_bedf ;};_ggfg :=_dfe (_fbcf );for _dgb ,_deeeb :=range _ggfg {_bcee :=localSpanMarks {_fcd :_deeeb ,_dde :_dgb ,_ffc :_gdcg };_dge ,_ :=_gf (_deeeb );if _cgega ,_gfdf :=_gege [_dge ];_gfdf {_gege [_dge ]=append (_cgega ,_bcee );
}else {_gege [_dge ]=[]localSpanMarks {_bcee };};};_fdf =append (_fdf ,_gaefa );};_gfd =append (_gfd ,_fdf ...);};_cfcc =_agb (_bdda ,_gege );if _cfcc !=nil {return nil ,nil ,_cfcc ;};return _gfd ,_bdda ,nil ;};func _bgbe (_ceec ,_eed ,_efce float64 )float64 {_efce =_efce /100;
_ccda :=(-1000*_ceec )/(_eed *_efce );return _ccda ;};func _ecf (_fddaa string )(string ,[][]int ){_fdcf :=_c .MustCompile ("\u005c\u006e");_fddf :=_fdcf .FindAllStringIndex (_fddaa ,-1);_gaaf :=_fdcf .ReplaceAllString (_fddaa ,"\u0020");return _gaaf ,_fddf ;
};func _gbe (_eaga *_f .TextMarkArray )string {_fgd :="";for _ ,_aae :=range _eaga .Elements (){_fgd +=_aae .Text ;};return _fgd ;};func _gbg (_fge *_f .TextMarkArray )*_g .PdfFont {_ ,_ggfd :=_gf (_fge );_dag :=_fge .Elements ()[_ggfd ];_efe :=_dag .Font ;
return _efe ;};func _ffab (_dccc []*matchedIndex ,_dgfc [][]int )[]*matchedIndex {_cfgf :=[]*matchedIndex {};for _ ,_eaag :=range _dccc {_aaac ,_aff :=_abg (_eaag ,_dgfc );if _aaac {_aaf :=_daed (_eaag ,_aff );_cfgf =append (_cfgf ,_aaf ...);}else {_cfgf =append (_cfgf ,_eaag );
};};return _cfgf ;};func _daba (_gfb string ,_gc []replacement ,_dce *_g .PdfFont )[]_ca .PdfObject {_gcd :=[]_ca .PdfObject {};_efae :=0;_cab :=_gfb ;for _bfg ,_ddb :=range _gc {_gad :=_ddb ._ae ;_debb :=_ddb ._ff ;_cfc :=_ddb ._aga ;_fac :=_ca .MakeFloat (_debb );
if _efae > _gad ||_gad ==-1{continue ;};_bdcd :=_gfb [_efae :_gad ];_gdgb :=_ggf (_bdcd ,_dce );_fcc :=_ca .MakeStringFromBytes (_gdgb );_gcd =append (_gcd ,_fcc );_gcd =append (_gcd ,_fac );_caa :=_gad +len (_cfc );_cab =_gfb [_caa :];_efae =_caa ;if _bfg ==len (_gc )-1{_gdgb =_ggf (_cab ,_dce );
_fcc =_ca .MakeStringFromBytes (_gdgb );_gcd =append (_gcd ,_fcc );};};return _gcd ;};type matchedIndex struct{_dda int ;_fbca int ;_aadd string ;};func _bfcd (_cfd []int ,_agfd *_f .TextMarkArray ,_adcg string )(*_f .TextMarkArray ,matchedBBox ,error ){_fdde :=matchedBBox {};
_afe :=_cfd [0];_geb :=_cfd [1];_cedd :=len (_adcg )-len (_ad .TrimLeft (_adcg ,"\u0020"));_dbde :=len (_adcg )-len (_ad .TrimRight (_adcg ,"\u0020\u000a"));_afe =_afe +_cedd ;_geb =_geb -_dbde ;_adcg =_ad .Trim (_adcg ,"\u0020\u000a");_adfg ,_aggg :=_agfd .RangeOffset (_afe ,_geb );
if _aggg !=nil {return nil ,_fdde ,_aggg ;};_fgeg ,_fdb :=_adfg .BBox ();if !_fdb {return nil ,_fdde ,_b .Errorf ("\u0073\u0070\u0061\u006e\u004d\u0061\u0072\u006bs\u002e\u0042\u0042ox\u0020\u0068\u0061\u0073\u0020\u006eo\u0020\u0062\u006f\u0075\u006e\u0064\u0069\u006e\u0067\u0020\u0062\u006f\u0078\u002e\u0020s\u0070\u0061\u006e\u004d\u0061\u0072\u006b\u0073=\u0025\u0073",_adfg );
};_fdde =matchedBBox {_gdcc :_adcg ,_daa :_fgeg };return _adfg ,_fdde ,nil ;};func _ge (_ac *_g .PdfFont ,_bbb _f .TextMark )float64 {_ccf :=0.001;_cec :=_bbb .Th /100;if _ac .Subtype ()=="\u0054\u0079\u0070e\u0033"{_ccf =1;};_bfd ,_bdee :=_ac .GetRuneMetrics (' ');
if !_bdee {_bfd ,_bdee =_ac .GetCharMetrics (32);};if !_bdee {_bfd ,_ =_g .DefaultFont ().GetRuneMetrics (' ');};_bbd :=_ccf *((_bfd .Wx *_bbb .FontSize +_bbb .Tc +_bbb .Tw )/_cec );return _bbd ;};func _gf (_ccd *_f .TextMarkArray )(_ca .PdfObject ,int ){var _bac _ca .PdfObject ;
_fb :=-1;for _dcg ,_cbf :=range _ccd .Elements (){_bac =_cbf .DirectObject ;_fb =_dcg ;if _bac !=nil {break ;};};return _bac ,_fb ;};func _ggf (_eaa string ,_dec *_g .PdfFont )[]byte {_ccg ,_deca :=_dec .StringToCharcodeBytes (_eaa );if _deca !=0{_df .Log .Debug ("\u0057\u0041\u0052\u004e\u003a\u0020\u0073\u006fm\u0065\u0020\u0072un\u0065\u0073\u0020\u0063\u006f\u0075l\u0064\u0020\u006e\u006f\u0074\u0020\u0062\u0065\u0020\u0065\u006e\u0063\u006f\u0064\u0065d\u002e\u000a\u0009\u0025\u0073\u0020\u002d\u003e \u0025\u0076",_eaa ,_ccg );
};return _ccg ;};func _dgf (_abb *_bg .ContentStreamOperation ,_eab _ca .PdfObject ,_cee []localSpanMarks )error {var _abf *_ca .PdfObjectArray ;_deb ,_dac :=_egeg (_cee );if len (_dac )==1{_deeg :=_dac [0];_dae :=_deb [_deeg ];if len (_dae )==1{_bdb :=_dae [0];
_ebbd :=_bdb ._fcd ;_ceb :=_gbg (_ebbd );_aea ,_dcf :=_agfg (_eab ,_ceb );if _dcf !=nil {return _dcf ;};_cbb ,_dcf :=_cgb (_bdb ,_ebbd ,_ceb ,_aea ,_deeg );if _dcf !=nil {return _dcf ;};_abf =_ca .MakeArray (_cbb ...);}else {_dab :=_dae [0]._fcd ;_bbgg :=_gbg (_dab );
_adgb ,_agc :=_agfg (_eab ,_bbgg );if _agc !=nil {return _agc ;};_cae ,_agc :=_bga (_adgb ,_dae );if _agc !=nil {return _agc ;};_dga :=_dbd (_cae );_cda :=_daba (_adgb ,_dga ,_bbgg );_abf =_ca .MakeArray (_cda ...);};}else if len (_dac )> 1{_gdg :=_cee [0];
_ggd :=_gdg ._fcd ;_ ,_gacf :=_gf (_ggd );_gaa :=_ggd .Elements ()[_gacf ];_ebbf :=_gaa .Font ;_dcff ,_ddf :=_agfg (_eab ,_ebbf );if _ddf !=nil {return _ddf ;};_bee ,_ddf :=_bga (_dcff ,_cee );if _ddf !=nil {return _ddf ;};_eba :=_dbd (_bee );_efa :=_daba (_dcff ,_eba ,_ebbf );
_abf =_ca .MakeArray (_efa ...);};_abb .Params [0]=_abf ;_abb .Operand ="\u0054\u004a";return nil ;};type placeHolders struct{_ba []int ;_adg string ;_gg float64 ;};func _cgb (_daf localSpanMarks ,_bgb *_f .TextMarkArray ,_agf *_g .PdfFont ,_gab ,_cff string )([]_ca .PdfObject ,error ){_cea :=_gbe (_bgb );
Tj ,_bef :=_agba (_bgb );if _bef !=nil {return nil ,_bef ;};_aaa :=len (_gab );_bfag :=len (_cea );_ccb :=-1;_egg :=_ca .MakeFloat (Tj );if _cea !=_cff {_ccfd :=_daf ._dde ;if _ccfd ==0{_ccb =_ad .LastIndex (_gab ,_cea );}else {_ccb =_ad .Index (_gab ,_cea );
};}else {_ccb =_ad .Index (_gab ,_cea );};_dgg :=_ccb +_bfag ;_ebae :=[]_ca .PdfObject {};if _ccb ==0&&_dgg ==_aaa {_ebae =append (_ebae ,_egg );}else if _ccb ==0&&_dgg < _aaa {_bec :=_ggf (_gab [_dgg :],_agf );_bcc :=_ca .MakeStringFromBytes (_bec );_ebae =append (_ebae ,_egg ,_bcc );
}else if _ccb > 0&&_dgg >=_aaa {_add :=_ggf (_gab [:_ccb ],_agf );_eff :=_ca .MakeStringFromBytes (_add );_ebae =append (_ebae ,_eff ,_egg );}else if _ccb > 0&&_dgg < _aaa {_af :=_ggf (_gab [:_ccb ],_agf );_geg :=_ggf (_gab [_dgg :],_agf );_ebfc :=_ca .MakeStringFromBytes (_af );
_dgab :=_ca .MakeString (string (_geg ));_ebae =append (_ebae ,_ebfc ,_egg ,_dgab );};return _ebae ,nil ;};type localSpanMarks struct{_fcd *_f .TextMarkArray ;_dde int ;_ffc string ;};