unipdf/redactor/redactor.go
2024-05-29 17:04:37 +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 (_e "errors";_a "fmt";_aff "github.com/unidoc/unipdf/v3/common";_eg "github.com/unidoc/unipdf/v3/contentstream";_fd "github.com/unidoc/unipdf/v3/core";_f "github.com/unidoc/unipdf/v3/creator";_eb "github.com/unidoc/unipdf/v3/extractor";
_ae "github.com/unidoc/unipdf/v3/model";_ee "io";_ab "regexp";_g "sort";_af "strings";);func _dbdb (_baee *_eb .TextMarkArray )string {_gdbc :="";for _ ,_beaf :=range _baee .Elements (){_gdbc +=_beaf .Text ;};return _gdbc ;};func _cb (_ec *_eg .ContentStreamOperations ,_fdc string ,_gfg int )error {_bf :=_eg .ContentStreamOperations {};
var _ca _eg .ContentStreamOperation ;for _ef ,_fb :=range *_ec {if _ef ==_gfg {if _fdc =="\u0027"{_gc :=_eg .ContentStreamOperation {Operand :"\u0054\u002a"};_bf =append (_bf ,&_gc );_ca .Params =_fb .Params ;_ca .Operand ="\u0054\u006a";_bf =append (_bf ,&_ca );
}else if _fdc =="\u0022"{_gd :=_fb .Params [:2];Tc ,Tw :=_gd [0],_gd [1];_da :=_eg .ContentStreamOperation {Params :[]_fd .PdfObject {Tc },Operand :"\u0054\u0063"};_bf =append (_bf ,&_da );_da =_eg .ContentStreamOperation {Params :[]_fd .PdfObject {Tw },Operand :"\u0054\u0077"};
_bf =append (_bf ,&_da );_ca .Params =[]_fd .PdfObject {_fb .Params [2]};_ca .Operand ="\u0054\u006a";_bf =append (_bf ,&_ca );};};_bf =append (_bf ,_fb );};*_ec =_bf ;return nil ;};type localSpanMarks struct{_fffa *_eb .TextMarkArray ;_fcc int ;_gee string ;
};type regexMatcher struct{_fbcg RedactionTerm };func _bad (_afb _fd .PdfObject ,_faa *_ae .PdfFont )(string ,error ){_fgf ,_ace :=_fd .GetStringBytes (_afb );if !_ace {return "",_fd .ErrTypeError ;};_dfa :=_faa .BytesToCharcodes (_fgf );_cfc ,_ebg ,_fgfe :=_faa .CharcodesToStrings (_dfa );
if _fgfe > 0{_aff .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",_ebg ,_fgfe );};_accb :=_af .Join (_cfc ,"");return _accb ,nil ;
};func _eead (_facbc string )(string ,[][]int ){_caaa :=_ab .MustCompile ("\u005c\u006e");_bcb :=_caaa .FindAllStringIndex (_facbc ,-1);_aaf :=_caaa .ReplaceAllString (_facbc ,"\u0020");return _aaf ,_bcb ;};func _bdaf (_geg ,_becg targetMap )(bool ,[]int ){_ecbeg :=_af .Contains (_geg ._dgb ,_becg ._dgb );
var _gcb []int ;for _ ,_abcc :=range _geg ._gbfb {for _cffb ,_edff :=range _becg ._gbfb {if _edff [0]>=_abcc [0]&&_edff [1]<=_abcc [1]{_gcb =append (_gcb ,_cffb );};};};return _ecbeg ,_gcb ;};
// New instantiates a Redactor object with given PdfReader and `regex` pattern.
func New (reader *_ae .PdfReader ,opts *RedactionOptions ,rectProps *RectangleProps )*Redactor {if rectProps ==nil {rectProps =RedactRectanglePropsNew ();};return &Redactor {_gecd :reader ,_aeb :opts ,_cbf :_f .New (),_dadd :rectProps };};func (_dfeg *Redactor )redactPage (_beg *_eg .ContentStreamOperations ,_abde *_ae .PdfPageResources )([]matchedBBox ,*_eg .ContentStreamOperations ,error ){_aeaa ,_bdde :=_eb .NewFromContents (_beg .String (),_abde );
if _bdde !=nil {return nil ,nil ,_bdde ;};_dbc ,_ ,_ ,_bdde :=_aeaa .ExtractPageText ();if _bdde !=nil {return nil ,nil ,_bdde ;};_beg =_dbc .GetContentStreamOps ();_gfgc :=_dbc .Marks ();_eca :=_dbc .Text ();_eca ,_cdff :=_eead (_eca );_ggd :=[]matchedBBox {};
_afbd :=make (map[_fd .PdfObject ][]localSpanMarks );_bbd :=[]*targetMap {};for _ ,_bce :=range _dfeg ._aeb .Terms {_fedb ,_bfcf :=_cdcc (_bce );if _bfcf !=nil {return nil ,nil ,_bfcf ;};_ffdg ,_bfcf :=_fedb .match (_eca );if _bfcf !=nil {return nil ,nil ,_bfcf ;
};_ffdg =_bgdb (_ffdg ,_cdff );_daf :=_gcga (_ffdg );_bbd =append (_bbd ,_daf ...);};_ade (_bbd );for _ ,_gge :=range _bbd {_egbg :=_gge ._dgb ;_bda :=_gge ._gbfb ;_gad :=[]matchedBBox {};for _ ,_dff :=range _bda {_efe ,_abcf ,_bbbaa :=_gcg (_dff ,_gfgc ,_egbg );
if _bbbaa !=nil {return nil ,nil ,_bbbaa ;};_gdf :=_ccaa (_efe );for _bgb ,_geb :=range _gdf {_dafe :=localSpanMarks {_fffa :_geb ,_fcc :_bgb ,_gee :_egbg };_bbf ,_ :=_be (_geb );if _cfcb ,_bdga :=_afbd [_bbf ];_bdga {_afbd [_bbf ]=append (_cfcb ,_dafe );
}else {_afbd [_bbf ]=[]localSpanMarks {_dafe };};};_gad =append (_gad ,_abcf );};_ggd =append (_ggd ,_gad ...);};_bdde =_d (_beg ,_afbd );if _bdde !=nil {return nil ,nil ,_bdde ;};return _ggd ,_beg ,nil ;};type matchedIndex struct{_bbac int ;_cedff int ;
_eab string ;};func _aga (_ega ,_cda string )[]int {if len (_cda )==0{return nil ;};var _ccf []int ;for _cgb :=0;_cgb < len (_ega );{_ccfd :=_af .Index (_ega [_cgb :],_cda );if _ccfd < 0{return _ccf ;};_ccf =append (_ccf ,_cgb +_ccfd );_cgb +=_ccfd +len (_cda );
};return _ccf ;};
// WriteToFile writes the redacted document to file specified by `outputPath`.
func (_def *Redactor )WriteToFile (outputPath string )error {if _cdc :=_def ._cbf .WriteToFile (outputPath );_cdc !=nil {return _a .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 ;};
// RedactionOptions is a collection of RedactionTerm objects.
type RedactionOptions struct{Terms []RedactionTerm ;};func _bgdb (_faf []*matchedIndex ,_gbece [][]int )[]*matchedIndex {_dbb :=[]*matchedIndex {};for _ ,_agdd :=range _faf {_ebgc ,_efgd :=_fbee (_agdd ,_gbece );if _ebgc {_geba :=_fec (_agdd ,_efgd );_dbb =append (_dbb ,_geba ...);
}else {_dbb =append (_dbb ,_agdd );};};return _dbb ;};type placeHolders struct{_ge []int ;_c string ;_ea float64 ;};func _cac (_efbe *_eb .TextMarkArray )(float64 ,error ){_dbg ,_fefb :=_efbe .BBox ();if !_fefb {return 0.0,_a .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",_efbe );
};_bfcd :=_aeg (_efbe );_dad :=0.0;_ ,_eef :=_be (_efbe );_egc :=_efbe .Elements ()[_eef ];_dge :=_egc .Font ;if _bfcd > 0{_dad =_abe (_dge ,_egc );};_bfdb :=(_dbg .Urx -_dbg .Llx );_bfdb =_bfdb +_dad *float64 (_bfcd );Tj :=_dbdf (_bfdb ,_egc .FontSize ,_egc .Th );
return Tj ,nil ;};func _cgg (_dfe string ,_cea *_ae .PdfFont )[]byte {_fed ,_fef :=_cea .StringToCharcodeBytes (_dfe );if _fef !=0{_aff .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",_dfe ,_fed );
};return _fed ;};
// Write writes the content of `re.creator` to writer of type io.Writer interface.
func (_dada *Redactor )Write (writer _ee .Writer )error {return _dada ._cbf .Write (writer )};func _cdcc (_bca RedactionTerm )(*regexMatcher ,error ){return &regexMatcher {_fbcg :_bca },nil };func _eed (_afe []placeHolders )[]replacement {_dgaf :=[]replacement {};
for _ ,_dgf :=range _afe {_efa :=_dgf ._ge ;_afda :=_dgf ._c ;_dfec :=_dgf ._ea ;for _ ,_ecc :=range _efa {_ccg :=replacement {_ce :_afda ,_fg :_dfec ,_ed :_ecc };_dgaf =append (_dgaf ,_ccg );};};_g .Slice (_dgaf ,func (_cedf ,_bdg int )bool {return _dgaf [_cedf ]._ed < _dgaf [_bdg ]._ed });
return _dgaf ;};func _ffd (_dca *_eg .ContentStreamOperation ,_cbb _fd .PdfObject ,_dcc []localSpanMarks )error {var _gbe *_fd .PdfObjectArray ;_gce ,_fbd :=_fedc (_dcc );if len (_fbd )==1{_dbd :=_fbd [0];_dce :=_gce [_dbd ];if len (_dce )==1{_aba :=_dce [0];
_eee :=_aba ._fffa ;_bgd :=_cge (_eee );_bfd ,_agd :=_bad (_cbb ,_bgd );if _agd !=nil {return _agd ;};_edf ,_agd :=_gfd (_aba ,_eee ,_bgd ,_bfd ,_dbd );if _agd !=nil {return _agd ;};_gbe =_fd .MakeArray (_edf ...);}else {_cgf :=_dce [0]._fffa ;_dde :=_cge (_cgf );
_eff ,_eeb :=_bad (_cbb ,_dde );if _eeb !=nil {return _eeb ;};_ege ,_eeb :=_fff (_eff ,_dce );if _eeb !=nil {return _eeb ;};_fcf :=_eed (_ege );_dg :=_dgag (_eff ,_fcf ,_dde );_gbe =_fd .MakeArray (_dg ...);};}else if len (_fbd )> 1{_fgcb :=_dcc [0];_dcb :=_fgcb ._fffa ;
_ ,_egea :=_be (_dcb );_fag :=_dcb .Elements ()[_egea ];_dccb :=_fag .Font ;_cgd ,_gfeg :=_bad (_cbb ,_dccb );if _gfeg !=nil {return _gfeg ;};_abg ,_gfeg :=_fff (_cgd ,_dcc );if _gfeg !=nil {return _gfeg ;};_dace :=_eed (_abg );_fbc :=_dgag (_cgd ,_dace ,_dccb );
_gbe =_fd .MakeArray (_fbc ...);};_dca .Params [0]=_gbe ;_dca .Operand ="\u0054\u004a";return nil ;};func _gfd (_dbde localSpanMarks ,_fefg *_eb .TextMarkArray ,_deg *_ae .PdfFont ,_bdd ,_cgc string )([]_fd .PdfObject ,error ){_aa :=_dbdb (_fefg );Tj ,_bba :=_cac (_fefg );
if _bba !=nil {return nil ,_bba ;};_eaa :=len (_bdd );_dgg :=len (_aa );_eeed :=-1;_fac :=_fd .MakeFloat (Tj );if _aa !=_cgc {_acf :=_dbde ._fcc ;if _acf ==0{_eeed =_af .LastIndex (_bdd ,_aa );}else {_eeed =_af .Index (_bdd ,_aa );};}else {_eeed =_af .Index (_bdd ,_aa );
};_fgb :=_eeed +_dgg ;_gdb :=[]_fd .PdfObject {};if _eeed ==0&&_fgb ==_eaa {_gdb =append (_gdb ,_fac );}else if _eeed ==0&&_fgb < _eaa {_dab :=_cgg (_bdd [_fgb :],_deg );_dda :=_fd .MakeStringFromBytes (_dab );_gdb =append (_gdb ,_fac ,_dda );}else if _eeed > 0&&_fgb >=_eaa {_ced :=_cgg (_bdd [:_eeed ],_deg );
_egb :=_fd .MakeStringFromBytes (_ced );_gdb =append (_gdb ,_egb ,_fac );}else if _eeed > 0&&_fgb < _eaa {_ceb :=_cgg (_bdd [:_eeed ],_deg );_cag :=_cgg (_bdd [_fgb :],_deg );_gaf :=_fd .MakeStringFromBytes (_ceb );_gdbd :=_fd .MakeString (string (_cag ));
_gdb =append (_gdb ,_gaf ,_fac ,_gdbd );};return _gdb ,nil ;};
// RedactRectanglePropsNew return a new pointer to a default RectangleProps object.
func RedactRectanglePropsNew ()*RectangleProps {return &RectangleProps {FillColor :_f .ColorBlack ,BorderWidth :0.0,FillOpacity :1.0};};func _cge (_afc *_eb .TextMarkArray )*_ae .PdfFont {_ ,_fdb :=_be (_afc );_afcf :=_afc .Elements ()[_fdb ];_ddb :=_afcf .Font ;
return _ddb ;};func _dbdf (_gbc ,_ccac ,_acef float64 )float64 {_acef =_acef /100;_ccd :=(-1000*_gbc )/(_ccac *_acef );return _ccd ;};func _dgag (_eeg string ,_caeg []replacement ,_ddg *_ae .PdfFont )[]_fd .PdfObject {_fbdf :=[]_fd .PdfObject {};_gecc :=0;
_dbe :=_eeg ;for _bfc ,_cba :=range _caeg {_bea :=_cba ._ed ;_fdeb :=_cba ._fg ;_cgeb :=_cba ._ce ;_gab :=_fd .MakeFloat (_fdeb );if _gecc > _bea ||_bea ==-1{continue ;};_aee :=_eeg [_gecc :_bea ];_ggb :=_cgg (_aee ,_ddg );_efb :=_fd .MakeStringFromBytes (_ggb );
_fbdf =append (_fbdf ,_efb );_fbdf =append (_fbdf ,_gab );_dbef :=_bea +len (_cgeb );_dbe =_eeg [_dbef :];_gecc =_dbef ;if _bfc ==len (_caeg )-1{_ggb =_cgg (_dbe ,_ddg );_efb =_fd .MakeStringFromBytes (_ggb );_fbdf =append (_fbdf ,_efb );};};return _fbdf ;
};func _ebe (_bfce *_eg .ContentStreamOperations ,PdfObj _fd .PdfObject )(*_eg .ContentStreamOperation ,int ,bool ){for _gbg ,_degc :=range *_bfce {_eega :=_degc .Operand ;if _eega =="\u0054\u006a"{_dcdb :=_fd .TraceToDirectObject (_degc .Params [0]);if _dcdb ==PdfObj {return _degc ,_gbg ,true ;
};}else if _eega =="\u0054\u004a"{_fga ,_bae :=_fd .GetArray (_degc .Params [0]);if !_bae {return nil ,_gbg ,_bae ;};for _ ,_facc :=range _fga .Elements (){if _facc ==PdfObj {return _degc ,_gbg ,true ;};};}else if _eega =="\u0022"{_cgdb :=_fd .TraceToDirectObject (_degc .Params [2]);
if _cgdb ==PdfObj {return _degc ,_gbg ,true ;};}else if _eega =="\u0027"{_daa :=_fd .TraceToDirectObject (_degc .Params [0]);if _daa ==PdfObj {return _degc ,_gbg ,true ;};};};return nil ,-1,false ;};
// Redact executes the redact operation on a pdf file and updates the content streams of all pages of the file.
func (_ecbe *Redactor )Redact ()error {_acca ,_cdd :=_ecbe ._gecd .GetNumPages ();if _cdd !=nil {return _a .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");
};_fffaf :=_ecbe ._dadd .FillColor ;_gbec :=_ecbe ._dadd .BorderWidth ;_ebgd :=_ecbe ._dadd .FillOpacity ;for _dcdg :=1;_dcdg <=_acca ;_dcdg ++{_eaada ,_eggd :=_ecbe ._gecd .GetPage (_dcdg );if _eggd !=nil {return _eggd ;};_ggff ,_eggd :=_eb .New (_eaada );
if _eggd !=nil {return _eggd ;};_bfa ,_ ,_ ,_eggd :=_ggff .ExtractPageText ();if _eggd !=nil {return _eggd ;};_adg :=_bfa .GetContentStreamOps ();_ebd ,_eea ,_eggd :=_ecbe .redactPage (_adg ,_eaada .Resources );if _eea ==nil {_aff .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");
_eea =_adg ;};_eag :=_eg .ContentStreamOperation {Operand :"\u006e"};*_eea =append (*_eea ,&_eag );_eaada .SetContentStreams ([]string {_eea .String ()},_fd .NewFlateEncoder ());if _eggd !=nil {return _eggd ;};_adc ,_eggd :=_eaada .GetMediaBox ();if _eggd !=nil {return _eggd ;
};if _eaada .MediaBox ==nil {_eaada .MediaBox =_adc ;};if _eeedb :=_ecbe ._cbf .AddPage (_eaada );_eeedb !=nil {return _eeedb ;};_g .Slice (_ebd ,func (_bbg ,_gcfc int )bool {return _ebd [_bbg ]._dccbg < _ebd [_gcfc ]._dccbg });_egbe :=_adc .Ury ;for _ ,_gfc :=range _ebd {_fba :=_gfc ._aed ;
_bde :=_ecbe ._cbf .NewRectangle (_fba .Llx ,_egbe -_fba .Lly ,_fba .Urx -_fba .Llx ,-(_fba .Ury -_fba .Lly ));_bde .SetFillColor (_fffaf );_bde .SetBorderWidth (_gbec );_bde .SetFillOpacity (_ebgd );if _dag :=_ecbe ._cbf .Draw (_bde );_dag !=nil {return nil ;
};};};_ecbe ._cbf .SetOutlineTree (_ecbe ._gecd .GetOutlineTree ());return nil ;};func _fec (_fgac *matchedIndex ,_bfe [][]int )[]*matchedIndex {_aec :=[]*matchedIndex {};_agac :=_fgac ._bbac ;_bfg :=_agac ;_ggdb :=_fgac ._eab ;_ebbc :=0;for _ ,_dggc :=range _bfe {_bbaa :=_dggc [0]-_agac ;
if _ebbc >=_bbaa {continue ;};_afcfc :=_ggdb [_ebbc :_bbaa ];_adca :=&matchedIndex {_eab :_afcfc ,_bbac :_bfg ,_cedff :_dggc [0]};if len (_af .TrimSpace (_afcfc ))!=0{_aec =append (_aec ,_adca );};_ebbc =_dggc [1]-_agac ;_bfg =_agac +_ebbc ;};_ccc :=_ggdb [_ebbc :];
_gadf :=&matchedIndex {_eab :_ccc ,_bbac :_bfg ,_cedff :_fgac ._cedff };if len (_af .TrimSpace (_ccc ))!=0{_aec =append (_aec ,_gadf );};return _aec ;};func (_becf *regexMatcher )match (_afea string )([]*matchedIndex ,error ){_ebgb :=_becf ._fbcg .Pattern ;
if _ebgb ==nil {return nil ,_e .New ("\u006e\u006f\u0020\u0070at\u0074\u0065\u0072\u006e\u0020\u0063\u006f\u006d\u0070\u0069\u006c\u0065\u0064");};var (_gdd =_ebgb .FindAllStringIndex (_afea ,-1);_cace []*matchedIndex ;);for _ ,_bee :=range _gdd {_cace =append (_cace ,&matchedIndex {_bbac :_bee [0],_cedff :_bee [1],_eab :_afea [_bee [0]:_bee [1]]});
};return _cace ,nil ;};func _ade (_facg []*targetMap ){for _aag ,_ecdd :=range _facg {for _abae ,_abf :=range _facg {if _aag !=_abae {_ceag ,_bec :=_bdaf (*_ecdd ,*_abf );if _ceag {_gga (_abf ,_bec );};};};};};func _gcg (_bef []int ,_dgaa *_eb .TextMarkArray ,_eccc string )(*_eb .TextMarkArray ,matchedBBox ,error ){_dfff :=matchedBBox {};
_fbf :=_bef [0];_edd :=_bef [1];_aegf :=len (_eccc )-len (_af .TrimLeft (_eccc ,"\u0020"));_age :=len (_eccc )-len (_af .TrimRight (_eccc ,"\u0020\u000a"));_fbf =_fbf +_aegf ;_edd =_edd -_age ;_eccc =_af .Trim (_eccc ,"\u0020\u000a");_dfef ,_dcac :=_dgaa .RangeOffset (_fbf ,_edd );
if _dcac !=nil {return nil ,_dfff ,_dcac ;};_gdee ,_adf :=_dfef .BBox ();if !_adf {return nil ,_dfff ,_a .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",_dfef );
};_dfff =matchedBBox {_dccbg :_eccc ,_aed :_gdee };return _dfef ,_dfff ,nil ;};func _fbee (_affg *matchedIndex ,_bddb [][]int )(bool ,[][]int ){_ggbe :=[][]int {};for _ ,_fbb :=range _bddb {if _affg ._bbac < _fbb [0]&&_affg ._cedff > _fbb [1]{_ggbe =append (_ggbe ,_fbb );
};};return len (_ggbe )> 0,_ggbe ;};func _gcga (_dcae []*matchedIndex )[]*targetMap {_ece :=make (map[string ][][]int );_bab :=[]*targetMap {};for _ ,_eagb :=range _dcae {_facb :=_eagb ._eab ;_eeeg :=[]int {_eagb ._bbac ,_eagb ._cedff };if _adgg ,_dec :=_ece [_facb ];
_dec {_ece [_facb ]=append (_adgg ,_eeeg );}else {_ece [_facb ]=[][]int {_eeeg };};};for _adcc ,_bfca :=range _ece {_bgc :=&targetMap {_dgb :_adcc ,_gbfb :_bfca };_bab =append (_bab ,_bgc );};return _bab ;};func _aeg (_bg *_eb .TextMarkArray )int {_dc :=0;
_ebb :=_bg .Elements ();if _ebb [0].Text =="\u0020"{_dc ++;};if _ebb [_bg .Len ()-1].Text =="\u0020"{_dc ++;};return _dc ;};
// RedactionTerm holds the regexp pattern and the replacement string for the redaction process.
type RedactionTerm struct{Pattern *_ab .Regexp ;};
// RectangleProps defines properties of the redaction rectangle to be drawn.
type RectangleProps struct{FillColor _f .Color ;BorderWidth float64 ;FillOpacity float64 ;};type targetMap struct{_dgb string ;_gbfb [][]int ;};func _be (_de *_eb .TextMarkArray )(_fd .PdfObject ,int ){var _fde _fd .PdfObject ;_cae :=-1;for _fca ,_ecd :=range _de .Elements (){_fde =_ecd .DirectObject ;
_cae =_fca ;if _fde !=nil {break ;};};return _fde ,_cae ;};type matchedBBox struct{_aed _ae .PdfRectangle ;_dccbg string ;};func _ecb (_dee *_eg .ContentStreamOperation ,_dcg _fd .PdfObject ,_egg []localSpanMarks )error {_ecf ,_gcf :=_fd .GetArray (_dee .Params [0]);
_ff :=[]_fd .PdfObject {};if !_gcf {_aff .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",_dee );return _a .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",_dee );
};_ded ,_cc :=_fedc (_egg );if len (_cc )==1{_abd :=_cc [0];_bd :=_ded [_abd ];if len (_bd )==1{_dac :=_bd [0];_fdcc :=_dac ._fffa ;_dcd :=_cge (_fdcc );_gg ,_fgg :=_bad (_dcg ,_dcd );if _fgg !=nil {return _fgg ;};_df ,_fgg :=_gfd (_dac ,_fdcc ,_dcd ,_gg ,_abd );
if _fgg !=nil {return _fgg ;};for _ ,_cd :=range _ecf .Elements (){if _cd ==_dcg {_ff =append (_ff ,_df ...);}else {_ff =append (_ff ,_cd );};};}else {_eggf :=_bd [0]._fffa ;_gea :=_cge (_eggf );_ac ,_afd :=_bad (_dcg ,_gea );if _afd !=nil {return _afd ;
};_eaf ,_afd :=_fff (_ac ,_bd );if _afd !=nil {return _afd ;};_gbf :=_eed (_eaf );_gef :=_dgag (_ac ,_gbf ,_gea );for _ ,_bb :=range _ecf .Elements (){if _bb ==_dcg {_ff =append (_ff ,_gef ...);}else {_ff =append (_ff ,_bb );};};};_dee .Params [0]=_fd .MakeArray (_ff ...);
}else if len (_cc )> 1{_dd :=_egg [0];_fa :=_dd ._fffa ;_ ,_eac :=_be (_fa );_fad :=_fa .Elements ()[_eac ];_deeb :=_fad .Font ;_ad ,_ggf :=_bad (_dcg ,_deeb );if _ggf !=nil {return _ggf ;};_gcc ,_ggf :=_fff (_ad ,_egg );if _ggf !=nil {return _ggf ;};_ag :=_eed (_gcc );
_fe :=_dgag (_ad ,_ag ,_deeb );for _ ,_cdg :=range _ecf .Elements (){if _cdg ==_dcg {_ff =append (_ff ,_fe ...);}else {_ff =append (_ff ,_cdg );};};_dee .Params [0]=_fd .MakeArray (_ff ...);};return nil ;};type replacement struct{_ce string ;_fg float64 ;
_ed int ;};func _bgdg (_fbe *_eb .TextMarkArray ,_aeef int ,_aad int )int {_ggab :=_fbe .Elements ();_bbbae :=_aeef -1;_ecbg :=_aeef +1;_ggag :=-1;if _bbbae >=0{_afeb :=_ggab [_bbbae ];_fagd :=_afeb .ObjString ;_eggg :=len (_fagd );_cdda :=_afeb .Index ;
if _cdda +1< _eggg {_ggag =_bbbae ;return _ggag ;};};if _ecbg < len (_ggab ){_fceg :=_ggab [_ecbg ];_bded :=_fceg .ObjString ;if _bded [0]!=_fceg .Text {_ggag =_ecbg ;return _ggag ;};};return _ggag ;};
// Redactor represents a Redactor object.
type Redactor struct{_gecd *_ae .PdfReader ;_aeb *RedactionOptions ;_cbf *_f .Creator ;_dadd *RectangleProps ;};func _d (_edc *_eg .ContentStreamOperations ,_ba map[_fd .PdfObject ][]localSpanMarks )error {for _gf ,_cf :=range _ba {if _gf ==nil {continue ;
};_ga ,_fc ,_gag :=_ebe (_edc ,_gf );if !_gag {_aff .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",_gf ,_edc );
return nil ;};if _ga .Operand =="\u0054\u006a"{_gb :=_ffd (_ga ,_gf ,_cf );if _gb !=nil {return _gb ;};}else if _ga .Operand =="\u0054\u004a"{_abc :=_ecb (_ga ,_gf ,_cf );if _abc !=nil {return _abc ;};}else if _ga .Operand =="\u0027"||_ga .Operand =="\u0022"{_eda :=_cb (_edc ,_ga .Operand ,_fc );
if _eda !=nil {return _eda ;};_eda =_ffd (_ga ,_gf ,_cf );if _eda !=nil {return _eda ;};};};return nil ;};func _gga (_efac *targetMap ,_dccf []int ){var _dedb [][]int ;for _bge ,_agb :=range _efac ._gbfb {if _aedf (_bge ,_dccf ){continue ;};_dedb =append (_dedb ,_agb );
};_efac ._gbfb =_dedb ;};func _aedf (_ddd int ,_cfce []int )bool {for _ ,_ebcg :=range _cfce {if _ebcg ==_ddd {return true ;};};return false ;};func _abe (_dacb *_ae .PdfFont ,_fab _eb .TextMark )float64 {_acc :=0.001;_cg :=_fab .Th /100;if _dacb .Subtype ()=="\u0054\u0079\u0070e\u0033"{_acc =1;
};_cdf ,_fgc :=_dacb .GetRuneMetrics (' ');if !_fgc {_cdf ,_fgc =_dacb .GetCharMetrics (32);};if !_fgc {_cdf ,_ =_ae .DefaultFont ().GetRuneMetrics (' ');};_db :=_acc *((_cdf .Wx *_fab .FontSize +_fab .Tc +_fab .Tw )/_cg );return _db ;};func _fedc (_bc []localSpanMarks )(map[string ][]localSpanMarks ,[]string ){_fda :=make (map[string ][]localSpanMarks );
_dfc :=[]string {};for _ ,_ccb :=range _bc {_edg :=_ccb ._gee ;if _gfe ,_gde :=_fda [_edg ];_gde {_fda [_edg ]=append (_gfe ,_ccb );}else {_fda [_edg ]=[]localSpanMarks {_ccb };_dfc =append (_dfc ,_edg );};};return _fda ,_dfc ;};func _ccaa (_gbfe *_eb .TextMarkArray )[]*_eb .TextMarkArray {_faad :=_gbfe .Elements ();
_fdcf :=len (_faad );var _bag _fd .PdfObject ;_cfe :=[]*_eb .TextMarkArray {};_fddc :=&_eb .TextMarkArray {};_egaa :=-1;for _ccfdb ,_cbbb :=range _faad {_gbgg :=_cbbb .DirectObject ;_egaa =_cbbb .Index ;if _gbgg ==nil {_fceb :=_bgdg (_gbfe ,_ccfdb ,_egaa );
if _bag !=nil {if _fceb ==-1||_fceb > _ccfdb {_cfe =append (_cfe ,_fddc );_fddc =&_eb .TextMarkArray {};};};}else if _gbgg !=nil &&_bag ==nil {if _egaa ==0&&_ccfdb > 0{_cfe =append (_cfe ,_fddc );_fddc =&_eb .TextMarkArray {};};}else if _gbgg !=nil &&_bag !=nil {if _gbgg !=_bag {_cfe =append (_cfe ,_fddc );
_fddc =&_eb .TextMarkArray {};};};_bag =_gbgg ;_fddc .Append (_cbbb );if _ccfdb ==(_fdcf -1){_cfe =append (_cfe ,_fddc );};};return _cfe ;};func _fff (_ebc string ,_aae []localSpanMarks )([]placeHolders ,error ){_aca :="";_dga :=[]placeHolders {};for _deeg ,_cged :=range _aae {_cef :=_cged ._fffa ;
_dfb :=_cged ._gee ;_gda :=_dbdb (_cef );_caa ,_ddbd :=_cac (_cef );if _ddbd !=nil {return nil ,_ddbd ;};if _gda !=_aca {var _aef []int ;if _deeg ==0&&_dfb !=_gda {_aea :=_af .Index (_ebc ,_gda );_aef =[]int {_aea };}else if _deeg ==len (_aae )-1{_cdfb :=_af .LastIndex (_ebc ,_gda );
_aef =[]int {_cdfb };}else {_aef =_aga (_ebc ,_gda );};_bbba :=placeHolders {_ge :_aef ,_c :_gda ,_ea :_caa };_dga =append (_dga ,_bbba );};_aca =_gda ;};return _dga ,nil ;};