unipdf/redactor/redactor.go

103 lines
20 KiB
Go
Raw Normal View History

2022-07-13 21:28:43 +00:00
//
// 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/
2022-12-15 21:59:56 +00:00
package redactor ;import (_d "errors";_e "fmt";_dd "github.com/unidoc/unipdf/v3/common";_fef "github.com/unidoc/unipdf/v3/contentstream";_fe "github.com/unidoc/unipdf/v3/core";_cfg "github.com/unidoc/unipdf/v3/creator";_g "github.com/unidoc/unipdf/v3/extractor";
_f "github.com/unidoc/unipdf/v3/model";_cf "io";_c "regexp";_ca "sort";_cb "strings";);func _cfb (_afa *_fef .ContentStreamOperations ,_cfa string ,_afaa int )error {_ea :=_fef .ContentStreamOperations {};var _ab _fef .ContentStreamOperation ;for _eeg ,_ade :=range *_afa {if _eeg ==_afaa {if _cfa =="\u0027"{_afg :=_fef .ContentStreamOperation {Operand :"\u0054\u002a"};
_ea =append (_ea ,&_afg );_ab .Params =_ade .Params ;_ab .Operand ="\u0054\u006a";_ea =append (_ea ,&_ab );}else if _cfa =="\u0022"{_fb :=_ade .Params [:2];Tc ,Tw :=_fb [0],_fb [1];_aa :=_fef .ContentStreamOperation {Params :[]_fe .PdfObject {Tc },Operand :"\u0054\u0063"};
_ea =append (_ea ,&_aa );_aa =_fef .ContentStreamOperation {Params :[]_fe .PdfObject {Tw },Operand :"\u0054\u0077"};_ea =append (_ea ,&_aa );_ab .Params =[]_fe .PdfObject {_ade .Params [2]};_ab .Operand ="\u0054\u006a";_ea =append (_ea ,&_ab );};};_ea =append (_ea ,_ade );
};*_afa =_ea ;return nil ;};type matchedIndex struct{_gfb int ;_fda int ;_ggbb string ;};func _df (_dfe *_g .TextMarkArray )int {_fg :=0;_gdf :=_dfe .Elements ();if _gdf [0].Text =="\u0020"{_fg ++;};if _gdf [_dfe .Len ()-1].Text =="\u0020"{_fg ++;};return _fg ;
};func _cde (_gee string ,_edb []replacement ,_bcd *_f .PdfFont )[]_fe .PdfObject {_bee :=[]_fe .PdfObject {};_aca :=0;_eebc :=_gee ;for _ffef ,_dfa :=range _edb {_edaa :=_dfa ._ad ;_dcf :=_dfa ._a ;_fggd :=_dfa ._da ;_gcd :=_fe .MakeFloat (_dcf );_agc :=_gee [_aca :_edaa ];
_eead :=_gge (_agc ,_bcd );_gef :=_fe .MakeStringFromBytes (_eead );_bee =append (_bee ,_gef );_bee =append (_bee ,_gcd );_fca :=_edaa +len (_fggd );_eebc =_gee [_fca :];_aca =_fca ;if _ffef ==len (_edb )-1{_eead =_gge (_eebc ,_bcd );_gef =_fe .MakeStringFromBytes (_eead );
_bee =append (_bee ,_gef );};};return _bee ;};func _fed (_cag localSpanMarks ,_edgb *_g .TextMarkArray ,_dddd *_f .PdfFont ,_aeb ,_agg string )([]_fe .PdfObject ,error ){_eddc :=_edgf (_edgb );Tj ,_aec :=_ce (_edgb );if _aec !=nil {return nil ,_aec ;};
_efa :=len (_aeb );_fea :=len (_eddc );_ggeg :=-1;_gcb :=_fe .MakeFloat (Tj );if _eddc !=_agg {_bde :=_cag ._bcc ;if _bde ==0{_ggeg =_cb .LastIndex (_aeb ,_eddc );}else {_ggeg =_cb .Index (_aeb ,_eddc );};}else {_ggeg =_cb .Index (_aeb ,_eddc );};_bcbe :=_ggeg +_fea ;
_gf :=[]_fe .PdfObject {};if _ggeg ==0&&_bcbe ==_efa {_gf =append (_gf ,_gcb );}else if _ggeg ==0&&_bcbe < _efa {_egf :=_gge (_aeb [_bcbe :],_dddd );_ffg :=_fe .MakeStringFromBytes (_egf );_gf =append (_gf ,_gcb ,_ffg );}else if _ggeg > 0&&_bcbe >=_efa {_eba :=_gge (_aeb [:_ggeg ],_dddd );
_bbb :=_fe .MakeStringFromBytes (_eba );_gf =append (_gf ,_bbb ,_gcb );}else if _ggeg > 0&&_bcbe < _efa {_fba :=_gge (_aeb [:_ggeg ],_dddd );_dcc :=_gge (_aeb [_bcbe :],_dddd );_aab :=_fe .MakeStringFromBytes (_fba );_abe :=_fe .MakeString (string (_dcc ));
_gf =append (_gf ,_aab ,_gcb ,_abe );};return _gf ,nil ;};
2022-07-13 21:28:43 +00:00
2022-10-27 19:04:58 +00:00
// RedactRectanglePropsNew return a new pointer to a default RectangleProps object.
2022-12-15 21:59:56 +00:00
func RedactRectanglePropsNew ()*RectangleProps {return &RectangleProps {FillColor :_cfg .ColorBlack ,BorderWidth :0.0,FillOpacity :1.0};};type matchedBBox struct{_dggc _f .PdfRectangle ;_ede string ;};func _ce (_beg *_g .TextMarkArray )(float64 ,error ){_eebd ,_caf :=_beg .BBox ();
if !_caf {return 0.0,_e .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",_beg );
};_eace :=_df (_beg );_aeca :=0.0;_ ,_abf :=_ff (_beg );_fac :=_beg .Elements ()[_abf ];_gab :=_fac .Font ;if _eace > 0{_aeca =_ebce (_gab ,_fac );};_fdd :=(_eebd .Urx -_eebd .Llx );_fdd =_fdd +_aeca *float64 (_eace );Tj :=_aeba (_fdd ,_fac .FontSize ,_fac .Th );
return Tj ,nil ;};func _abfd (_ddbf ,_ccbb string )[]int {if len (_ccbb )==0{return nil ;};var _eff []int ;for _gbe :=0;_gbe < len (_ddbf );{_fcaf :=_cb .Index (_ddbf [_gbe :],_ccbb );if _fcaf < 0{return _eff ;};_eff =append (_eff ,_gbe +_fcaf );_gbe +=_fcaf +len (_ccbb );
};return _eff ;};type replacement struct{_da string ;_a float64 ;_ad int ;};
2022-07-13 21:28:43 +00:00
2022-12-15 21:59:56 +00:00
// WriteToFile writes the redacted document to file specified by `outputPath`.
func (_cfgf *Redactor )WriteToFile (outputPath string )error {if _ged :=_cfgf ._fcc .WriteToFile (outputPath );_ged !=nil {return _e .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 ;};type placeHolders struct{_fc []int ;_bb string ;_bd float64 ;};func _ffea (_dbba RedactionTerm )(*regexMatcher ,error ){return &regexMatcher {_aaa :_dbba },nil };func _dfc (_dda *_fef .ContentStreamOperation ,_edg _fe .PdfObject ,_aae []localSpanMarks )error {_bdf ,_dgg :=_fe .GetArray (_dda .Params [0]);
_gb :=[]_fe .PdfObject {};if !_dgg {_dd .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",_dda );return _e .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",_dda );
};_dbg ,_be :=_aaf (_aae );if len (_be )==1{_ae :=_be [0];_bdd :=_dbg [_ae ];if len (_bdd )==1{_eg :=_bdd [0];_ebb :=_eg ._dde ;_gg :=_edd (_ebb );_ggf ,_fd :=_cadg (_edg ,_gg );if _fd !=nil {return _fd ;};_fdg ,_fd :=_fed (_eg ,_ebb ,_gg ,_ggf ,_ae );
if _fd !=nil {return _fd ;};for _ ,_ffc :=range _bdf .Elements (){if _ffc ==_edg {_gb =append (_gb ,_fdg ...);}else {_gb =append (_gb ,_ffc );};};}else {_ebbe :=_bdd [0]._dde ;_ebc :=_edd (_ebbe );_cc ,_fdgg :=_cadg (_edg ,_ebc );if _fdgg !=nil {return _fdgg ;
};_cab ,_fdgg :=_afd (_cc ,_bdd );if _fdgg !=nil {return _fdgg ;};_dge :=_acfg (_cab );_cd :=_cde (_cc ,_dge ,_ebc );for _ ,_dgef :=range _bdf .Elements (){if _dgef ==_edg {_gb =append (_gb ,_cd ...);}else {_gb =append (_gb ,_dgef );};};};_dda .Params [0]=_fe .MakeArray (_gb ...);
}else if len (_be )> 1{_ga :=_aae [0];_eeb :=_ga ._dde ;_ ,_gde :=_ff (_eeb );_daa :=_eeb .Elements ()[_gde ];_ccf :=_daa .Font ;_ebdf ,_bf :=_cadg (_edg ,_ccf );if _bf !=nil {return _bf ;};_bfa ,_bf :=_afd (_ebdf ,_aae );if _bf !=nil {return _bf ;};_gaf :=_acfg (_bfa );
_dcd :=_cde (_ebdf ,_gaf ,_ccf );for _ ,_efe :=range _bdf .Elements (){if _efe ==_edg {_gb =append (_gb ,_dcd ...);}else {_gb =append (_gb ,_efe );};};_dda .Params [0]=_fe .MakeArray (_gb ...);};return nil ;};
2022-07-13 21:28:43 +00:00
2022-10-27 19:04:58 +00:00
// RectangleProps defines properties of the redaction rectangle to be drawn.
2022-12-15 21:59:56 +00:00
type RectangleProps struct{FillColor _cfg .Color ;BorderWidth float64 ;FillOpacity float64 ;};func _edgf (_bfc *_g .TextMarkArray )string {_cafg :="";for _ ,_gcf :=range _bfc .Elements (){_cafg +=_gcf .Text ;};return _cafg ;};func _aeba (_dbf ,_gaff ,_degd float64 )float64 {_degd =_degd /100;
_ecb :=(-1000*_dbf )/(_gaff *_degd );return _ecb ;};
2022-07-13 21:28:43 +00:00
// Redact executes the redact operation on a pdf file and updates the content streams of all pages of the file.
2022-12-15 21:59:56 +00:00
func (_bacb *Redactor )Redact ()error {_bab ,_cca :=_bacb ._gda .GetNumPages ();if _cca !=nil {return _e .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");
};_ccd :=_bacb ._acgg .FillColor ;_edac :=_bacb ._acgg .BorderWidth ;_eddf :=_bacb ._acgg .FillOpacity ;for _eaeg :=1;_eaeg <=_bab ;_eaeg ++{_cg ,_ggg :=_bacb ._gda .GetPage (_eaeg );if _ggg !=nil {return _ggg ;};_dbga ,_ggg :=_g .New (_cg );if _ggg !=nil {return _ggg ;
};_aaff ,_ ,_ ,_ggg :=_dbga .ExtractPageText ();if _ggg !=nil {return _ggg ;};_bae :=_aaff .GetContentStreamOps ();_ebdb ,_ceg ,_ggg :=_bacb .redactPage (_bae ,_cg .Resources );if _ceg ==nil {_dd .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");
_ceg =_bae ;};_cg .SetContentStreams ([]string {_ceg .String ()},_fe .NewFlateEncoder ());if _ggg !=nil {return _ggg ;};_aabd ,_ggg :=_cg .GetMediaBox ();if _ggg !=nil {return _ggg ;};if _cg .MediaBox ==nil {_cg .MediaBox =_aabd ;};if _eacb :=_bacb ._fcc .AddPage (_cg );
_eacb !=nil {return _eacb ;};_aecg :=_aabd .Ury ;for _ ,_def :=range _ebdb {_cfe :=_def ._dggc ;_cdfg :=_bacb ._fcc .NewRectangle (_cfe .Llx ,_aecg -_cfe .Lly ,_cfe .Urx -_cfe .Llx ,-(_cfe .Ury -_cfe .Lly ));_cdfg .SetFillColor (_ccd );_cdfg .SetBorderWidth (_edac );
_cdfg .SetFillOpacity (_eddf );if _ebbc :=_bacb ._fcc .Draw (_cdfg );_ebbc !=nil {return nil ;};};};_bacb ._fcc .SetOutlineTree (_bacb ._gda .GetOutlineTree ());return nil ;};func (_accgf *regexMatcher )match (_gaa string )([]*matchedIndex ,error ){_fae :=_accgf ._aaa .Pattern ;
if _fae ==nil {return nil ,_d .New ("\u006e\u006f\u0020\u0070at\u0074\u0065\u0072\u006e\u0020\u0063\u006f\u006d\u0070\u0069\u006c\u0065\u0064");};var (_cbeg =_fae .FindAllStringIndex (_gaa ,-1);_dbca []*matchedIndex ;);for _ ,_bebe :=range _cbeg {_dbca =append (_dbca ,&matchedIndex {_gfb :_bebe [0],_fda :_bebe [1],_ggbb :_gaa [_bebe [0]:_bebe [1]]});
};return _dbca ,nil ;};func _acf (_bad *_fef .ContentStreamOperation ,_bgd _fe .PdfObject ,_gce []localSpanMarks )error {var _gag *_fe .PdfObjectArray ;_abg ,_cdf :=_aaf (_gce );if len (_cdf )==1{_caa :=_cdf [0];_ace :=_abg [_caa ];if len (_ace )==1{_ddd :=_ace [0];
_dfcf :=_ddd ._dde ;_bef :=_edd (_dfcf );_ddb ,_cbe :=_cadg (_bgd ,_bef );if _cbe !=nil {return _cbe ;};_fcd ,_cbe :=_fed (_ddd ,_dfcf ,_bef ,_ddb ,_caa );if _cbe !=nil {return _cbe ;};_gag =_fe .MakeArray (_fcd ...);}else {_bcb :=_ace [0]._dde ;_efg :=_edd (_bcb );
_acg ,_feg :=_cadg (_bgd ,_efg );if _feg !=nil {return _feg ;};_dad ,_feg :=_afd (_acg ,_ace );if _feg !=nil {return _feg ;};_bcg :=_acfg (_dad );_ggb :=_cde (_acg ,_bcg ,_efg );_gag =_fe .MakeArray (_ggb ...);};}else if len (_cdf )> 1{_cfbb :=_gce [0];
_aaeb :=_cfbb ._dde ;_ ,_eddg :=_ff (_aaeb );_abgg :=_aaeb .Elements ()[_eddg ];_aff :=_abgg .Font ;_cda ,_deag :=_cadg (_bgd ,_aff );if _deag !=nil {return _deag ;};_fge ,_deag :=_afd (_cda ,_gce );if _deag !=nil {return _deag ;};_eda :=_acfg (_fge );
_ecc :=_cde (_cda ,_eda ,_aff );_gag =_fe .MakeArray (_ecc ...);};_bad .Params [0]=_gag ;_bad .Operand ="\u0054\u004a";return nil ;};
2022-09-23 18:05:51 +00:00
2022-12-15 21:59:56 +00:00
// RedactionOptions is a collection of RedactionTerm objects.
type RedactionOptions struct{Terms []RedactionTerm ;};func _abed (_cfege []int ,_aee *_g .TextMarkArray ,_afaf string )(*_g .TextMarkArray ,matchedBBox ,error ){_gfd :=matchedBBox {};_geg :=_cfege [0];_bbfg :=_cfege [1];_dbc :=len (_afaf )-len (_cb .TrimLeft (_afaf ,"\u0020"));
_daca :=len (_afaf )-len (_cb .TrimRight (_afaf ,"\u0020\u000a"));_geg =_geg +_dbc ;_bbfg =_bbfg -_daca ;_afaf =_cb .Trim (_afaf ,"\u0020\u000a");_dgb ,_adf :=_aee .RangeOffset (_geg ,_bbfg );if _adf !=nil {return nil ,_gfd ,_adf ;};_age ,_bbcd :=_dgb .BBox ();
if !_bbcd {return nil ,_gfd ,_e .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",_dgb );
};_gfd =matchedBBox {_ede :_afaf ,_dggc :_age };return _dgb ,_gfd ,nil ;};func _fbee (_bacf *_fef .ContentStreamOperations ,PdfObj _fe .PdfObject )(*_fef .ContentStreamOperation ,int ,bool ){for _ebcg ,_daab :=range *_bacf {_eag :=_daab .Operand ;if _eag =="\u0054\u006a"{_efec :=_fe .TraceToDirectObject (_daab .Params [0]);
if _efec ==PdfObj {return _daab ,_ebcg ,true ;};}else if _eag =="\u0054\u004a"{_acc ,_cac :=_fe .GetArray (_daab .Params [0]);if !_cac {return nil ,_ebcg ,_cac ;};for _ ,_bga :=range _acc .Elements (){if _bga ==PdfObj {return _daab ,_ebcg ,true ;};};}else if _eag =="\u0022"{_gdeb :=_fe .TraceToDirectObject (_daab .Params [2]);
if _gdeb ==PdfObj {return _daab ,_ebcg ,true ;};}else if _eag =="\u0027"{_ffa :=_fe .TraceToDirectObject (_daab .Params [0]);if _ffa ==PdfObj {return _daab ,_ebcg ,true ;};};};return nil ,-1,false ;};func _ff (_cfab *_g .TextMarkArray )(_fe .PdfObject ,int ){var _ed _fe .PdfObject ;
_fbe :=-1;for _db ,_bag :=range _cfab .Elements (){_ed =_bag .DirectObject ;_fbe =_db ;if _ed !=nil {break ;};};return _ed ,_fbe ;};
2022-09-23 18:05:51 +00:00
// Redactor represtents a Redactor object.
2022-12-15 21:59:56 +00:00
type Redactor struct{_gda *_f .PdfReader ;_acgd *RedactionOptions ;_fcc *_cfg .Creator ;_acgg *RectangleProps ;};func _gec (_fgea *_g .TextMarkArray ,_ccfd int ,_gcba int )int {_eccd :=_fgea .Elements ();_ebg :=_ccfd -1;_fad :=_ccfd +1;_dfb :=-1;if _ebg >=0{_acd :=_eccd [_ebg ];
_aed :=_acd .ObjString ;_aafa :=len (_aed );_gbeb :=_acd .Index ;if _gbeb +1< _aafa {_dfb =_ebg ;return _dfb ;};};if _fad < len (_eccd ){_eec :=_eccd [_fad ];_fggdf :=_eec .ObjString ;if _fggdf [0]!=_eec .Text {_dfb =_fad ;return _dfb ;};};return _dfb ;
};func _afd (_bbd string ,_bbde []localSpanMarks )([]placeHolders ,error ){_fgg :="";_cad :=[]placeHolders {};for _gbf ,_egd :=range _bbde {_efc :=_egd ._dde ;_faa :=_egd ._dec ;_dfg :=_edgf (_efc );_bba ,_ddddb :=_ce (_efc );if _ddddb !=nil {return nil ,_ddddb ;
};if _dfg !=_fgg {var _bbe []int ;if _gbf ==0&&_faa !=_dfg {_gcbc :=_cb .Index (_bbd ,_dfg );_bbe =[]int {_gcbc };}else if _gbf ==len (_bbde )-1{_bff :=_cb .LastIndex (_bbd ,_dfg );_bbe =[]int {_bff };}else {_bbe =_abfd (_bbd ,_dfg );};_beb :=placeHolders {_fc :_bbe ,_bb :_dfg ,_bd :_bba };
_cad =append (_cad ,_beb );};_fgg =_dfg ;};return _cad ,nil ;};func _edd (_ec *_g .TextMarkArray )*_f .PdfFont {_ ,_dea :=_ff (_ec );_fdgb :=_ec .Elements ()[_dea ];_aag :=_fdgb .Font ;return _aag ;};type localSpanMarks struct{_dde *_g .TextMarkArray ;
_bcc int ;_dec string ;};func _cadg (_eadf _fe .PdfObject ,_ded *_f .PdfFont )(string ,error ){_fbac ,_bgg :=_fe .GetStringBytes (_eadf );if !_bgg {return "",_fe .ErrTypeError ;};_eeaf :=_ded .BytesToCharcodes (_fbac );_dfcd ,_eae ,_fag :=_ded .CharcodesToStrings (_eeaf );
if _fag > 0{_dd .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",_eae ,_fag );};_dace :=_cb .Join (_dfcd ,"");return _dace ,nil ;
};func _acfg (_eadg []placeHolders )[]replacement {_bbef :=[]replacement {};for _ ,_fgc :=range _eadg {_fedd :=_fgc ._fc ;_dgeg :=_fgc ._bb ;_bgdg :=_fgc ._bd ;for _ ,_dac :=range _fedd {_gdc :=replacement {_da :_dgeg ,_a :_bgdg ,_ad :_dac };_bbef =append (_bbef ,_gdc );
};};_ca .Slice (_bbef ,func (_eea ,_dacf int )bool {return _bbef [_eea ]._ad < _bbef [_dacf ]._ad });return _bbef ;};
2022-10-27 19:04:58 +00:00
// Write writes the content of `re.creator` to writer of type io.Writer interface.
2022-12-15 21:59:56 +00:00
func (_faf *Redactor )Write (writer _cf .Writer )error {return _faf ._fcc .Write (writer )};func _aaf (_eed []localSpanMarks )(map[string ][]localSpanMarks ,[]string ){_agd :=make (map[string ][]localSpanMarks );_ddaf :=[]string {};for _ ,_edgc :=range _eed {_bbc :=_edgc ._dec ;
if _ge ,_eac :=_agd [_bbc ];_eac {_agd [_bbc ]=append (_ge ,_edgc );}else {_agd [_bbc ]=[]localSpanMarks {_edgc };_ddaf =append (_ddaf ,_bbc );};};return _agd ,_ddaf ;};func _ebce (_ccb *_f .PdfFont ,_baac _g .TextMark )float64 {_bc :=0.001;_dcg :=_baac .Th /100;
if _ccb .Subtype ()=="\u0054\u0079\u0070e\u0033"{_bc =1;};_ead ,_efb :=_ccb .GetRuneMetrics (' ');if !_efb {_ead ,_efb =_ccb .GetCharMetrics (32);};if !_efb {_ead ,_ =_f .DefaultFont ().GetRuneMetrics (' ');};_gc :=_bc *((_ead .Wx *_baac .FontSize +_baac .Tc +_baac .Tw )/_dcg );
return _gc ;};
// New instantiates a Redactor object with given PdfReader and `regex` pattern.
func New (reader *_f .PdfReader ,opts *RedactionOptions ,rectProps *RectangleProps )*Redactor {if rectProps ==nil {rectProps =RedactRectanglePropsNew ();};return &Redactor {_gda :reader ,_acgd :opts ,_fcc :_cfg .New (),_acgg :rectProps };};type regexMatcher struct{_aaa RedactionTerm };
func _dae (_cgf *_g .TextMarkArray )[]*_g .TextMarkArray {_degg :=_cgf .Elements ();_dfac :=len (_degg );var _cdff _fe .PdfObject ;_dfce :=[]*_g .TextMarkArray {};_cdaf :=&_g .TextMarkArray {};_faab :=-1;for _accg ,_fgge :=range _degg {_dfbd :=_fgge .DirectObject ;
_faab =_fgge .Index ;if _dfbd ==nil {_gcef :=_gec (_cgf ,_accg ,_faab );if _cdff !=nil {if _gcef ==-1||_gcef > _accg {_dfce =append (_dfce ,_cdaf );_cdaf =&_g .TextMarkArray {};};};}else if _dfbd !=nil &&_cdff ==nil {if _faab ==0&&_accg > 0{_dfce =append (_dfce ,_cdaf );
_cdaf =&_g .TextMarkArray {};};}else if _dfbd !=nil &&_cdff !=nil {if _dfbd !=_cdff {_dfce =append (_dfce ,_cdaf );_cdaf =&_g .TextMarkArray {};};};_cdff =_dfbd ;_cdaf .Append (_fgge );if _accg ==(_dfac -1){_dfce =append (_dfce ,_cdaf );};};return _dfce ;
};
// RedactionTerm holds the regexp pattern and the replacement string for the redaction process.
type RedactionTerm struct{Pattern *_c .Regexp ;};func _gge (_afe string ,_ac *_f .PdfFont )[]byte {_bg ,_bac :=_ac .StringToCharcodeBytes (_afe );if _bac !=0{_dd .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",_afe ,_bg );
};return _bg ;};func _ee (_ba *_fef .ContentStreamOperations ,_ef map[_fe .PdfObject ][]localSpanMarks )error {for _baa ,_eb :=range _ef {if _baa ==nil {continue ;};_ag ,_cbd ,_gd :=_fbee (_ba ,_baa );if !_gd {_dd .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",_baa ,_ba );
return nil ;};if _ag .Operand =="\u0054\u006a"{_dc :=_acf (_ag ,_baa ,_eb );if _dc !=nil {return _dc ;};}else if _ag .Operand =="\u0054\u004a"{_af :=_dfc (_ag ,_baa ,_eb );if _af !=nil {return _af ;};}else if _ag .Operand =="\u0027"||_ag .Operand =="\u0022"{_dg :=_cfb (_ba ,_ag .Operand ,_cbd );
if _dg !=nil {return _dg ;};_dg =_acf (_ag ,_baa ,_eb );if _dg !=nil {return _dg ;};};};return nil ;};func _faae (_baed []*matchedIndex )map[string ][][]int {_ggfd :=make (map[string ][][]int );for _ ,_bffe :=range _baed {_eca :=_bffe ._ggbb ;_gfg :=[]int {_bffe ._gfb ,_bffe ._fda };
if _dcde ,_fgd :=_ggfd [_eca ];_fgd {_ggfd [_eca ]=append (_dcde ,_gfg );}else {_ggfd [_eca ]=[][]int {_gfg };};};return _ggfd ;};func (_efbf *Redactor )redactPage (_cdea *_fef .ContentStreamOperations ,_ced *_f .PdfPageResources )([]matchedBBox ,*_fef .ContentStreamOperations ,error ){_cgd ,_dddg :=_g .NewFromContents (_cdea .String (),_ced );
if _dddg !=nil {return nil ,nil ,_dddg ;};_feaa ,_ ,_ ,_dddg :=_cgd .ExtractPageText ();_cdea =_feaa .GetContentStreamOps ();if _dddg !=nil {return nil ,nil ,_dddg ;};_ebe :=_feaa .Marks ();_fdae :=_feaa .Text ();_deb :=[]matchedBBox {};_fcdc :=make (map[_fe .PdfObject ][]localSpanMarks );
for _ ,_fccg :=range _efbf ._acgd .Terms {_cfeg ,_agcb :=_ffea (_fccg );if _agcb !=nil {return nil ,nil ,_agcb ;};_fefd ,_agcb :=_cfeg .match (_fdae );if _agcb !=nil {return nil ,nil ,_agcb ;};_bbba :=_faae (_fefd );for _afad ,_bcdf :=range _bbba {_dbb :=[]matchedBBox {};
for _ ,_eddd :=range _bcdf {_dab ,_bacfg ,_eaga :=_abed (_eddd ,_ebe ,_afad );if _eaga !=nil {return nil ,nil ,_eaga ;};_cfed :=_dae (_dab );for _bbdd ,_ggc :=range _cfed {_deba :=localSpanMarks {_dde :_ggc ,_bcc :_bbdd ,_dec :_afad };_befc ,_ :=_ff (_ggc );
if _fede ,_cfabc :=_fcdc [_befc ];_cfabc {_fcdc [_befc ]=append (_fede ,_deba );}else {_fcdc [_befc ]=[]localSpanMarks {_deba };};};_dbb =append (_dbb ,_bacfg );};_deb =append (_deb ,_dbb ...);};};_dddg =_ee (_cdea ,_fcdc );if _dddg !=nil {return nil ,nil ,_dddg ;
};return _deb ,_cdea ,nil ;};