mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-11 19:29:40 +08:00
110 lines
23 KiB
Go
110 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 (_bd "errors";_e "fmt";_af "github.com/unidoc/unipdf/v3/common";_fg "github.com/unidoc/unipdf/v3/contentstream";_f "github.com/unidoc/unipdf/v3/core";_eg "github.com/unidoc/unipdf/v3/creator";_ef "github.com/unidoc/unipdf/v3/extractor";
|
|
_d "github.com/unidoc/unipdf/v3/model";_c "io";_g "regexp";_cf "sort";_a "strings";);func _acc (_cceb *_fg .ContentStreamOperation ,_dce _f .PdfObject ,_ggc []localSpanMarks )error {_ge ,_dac :=_f .GetArray (_cceb .Params [0]);_fge :=[]_f .PdfObject {};
|
|
if !_dac {_af .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",_cceb );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",_cceb );
|
|
};_beg ,_bac :=_dcf (_ggc );if len (_bac )==1{_fa :=_bac [0];_abf :=_beg [_fa ];if len (_abf )==1{_bagb :=_abf [0];_ae :=_bagb ._cccf ;_cfe :=_bff (_ae );_gd ,_de :=_gga (_dce ,_cfe );if _de !=nil {return _de ;};_aa ,_de :=_afb (_bagb ,_ae ,_cfe ,_gd ,_fa );
|
|
if _de !=nil {return _de ;};for _ ,_daf :=range _ge .Elements (){if _daf ==_dce {_fge =append (_fge ,_aa ...);}else {_fge =append (_fge ,_daf );};};}else {_ee :=_abf [0]._cccf ;_dbd :=_bff (_ee );_dgca ,_fe :=_gga (_dce ,_dbd );if _fe !=nil {return _fe ;
|
|
};_ec ,_fe :=_cdg (_dgca ,_abf );if _fe !=nil {return _fe ;};_effc :=_cac (_ec );_gec :=_bdb (_dgca ,_effc ,_dbd );for _ ,_bgg :=range _ge .Elements (){if _bgg ==_dce {_fge =append (_fge ,_gec ...);}else {_fge =append (_fge ,_bgg );};};};_cceb .Params [0]=_f .MakeArray (_fge ...);
|
|
}else if len (_bac )> 1{_geg :=_ggc [0];_agf :=_geg ._cccf ;_ ,_cfb :=_db (_agf );_fc :=_agf .Elements ()[_cfb ];_dcd :=_fc .Font ;_agg ,_fgf :=_gga (_dce ,_dcd );if _fgf !=nil {return _fgf ;};_gaf ,_fgf :=_cdg (_agg ,_ggc );if _fgf !=nil {return _fgf ;
|
|
};_edd :=_cac (_gaf );_df :=_bdb (_agg ,_edd ,_dcd );for _ ,_edb :=range _ge .Elements (){if _edb ==_dce {_fge =append (_fge ,_df ...);}else {_fge =append (_fge ,_edb );};};_cceb .Params [0]=_f .MakeArray (_fge ...);};return nil ;};func _gga (_fdeg _f .PdfObject ,_afgd *_d .PdfFont )(string ,error ){_bgfe ,_dgde :=_f .GetStringBytes (_fdeg );
|
|
if !_dgde {return "",_f .ErrTypeError ;};_cafe :=_afgd .BytesToCharcodes (_bgfe );_fcc ,_cecg ,_fef :=_afgd .CharcodesToStrings (_cafe );if _fef > 0{_af .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",_cecg ,_fef );
|
|
};_deg :=_a .Join (_fcc ,"");return _deg ,nil ;};func _dgdd (_cee *_ef .TextMarkArray )[]*_ef .TextMarkArray {_ebf :=_cee .Elements ();_ggbd :=len (_ebf );var _eggbb _f .PdfObject ;_bgfg :=[]*_ef .TextMarkArray {};_fggbe :=&_ef .TextMarkArray {};_daaf :=-1;
|
|
for _fdec ,_fgb :=range _ebf {_cgg :=_fgb .DirectObject ;_daaf =_fgb .Index ;if _cgg ==nil {_geaa :=_gdcd (_cee ,_fdec ,_daaf );if _eggbb !=nil {if _geaa ==-1||_geaa > _fdec {_bgfg =append (_bgfg ,_fggbe );_fggbe =&_ef .TextMarkArray {};};};}else if _cgg !=nil &&_eggbb ==nil {if _daaf ==0&&_fdec > 0{_bgfg =append (_bgfg ,_fggbe );
|
|
_fggbe =&_ef .TextMarkArray {};};}else if _cgg !=nil &&_eggbb !=nil {if _cgg !=_eggbb {_bgfg =append (_bgfg ,_fggbe );_fggbe =&_ef .TextMarkArray {};};};_eggbb =_cgg ;_fggbe .Append (_fgb );if _fdec ==(_ggbd -1){_bgfg =append (_bgfg ,_fggbe );};};return _bgfg ;
|
|
};func (_bde *regexMatcher )match (_gfc string )([]*matchedIndex ,error ){_eebf :=_bde ._cfa .Pattern ;if _eebf ==nil {return nil ,_bd .New ("\u006e\u006f\u0020\u0070at\u0074\u0065\u0072\u006e\u0020\u0063\u006f\u006d\u0070\u0069\u006c\u0065\u0064");};var (_dfbdd =_eebf .FindAllStringIndex (_gfc ,-1);
|
|
_ced []*matchedIndex ;);for _ ,_gafd :=range _dfbdd {_ced =append (_ced ,&matchedIndex {_fce :_gafd [0],_fdd :_gafd [1],_acg :_gfc [_gafd [0]:_gafd [1]]});};return _ced ,nil ;};func _bbefg (_dbdd RedactionTerm )(*regexMatcher ,error ){return ®exMatcher {_cfa :_dbdd },nil };
|
|
type replacement struct{_gb string ;_cce float64 ;_bb int ;};func _bdb (_beb string ,_acbg []replacement ,_ggfb *_d .PdfFont )[]_f .PdfObject {_cfc :=[]_f .PdfObject {};_fgaf :=0;_bfb :=_beb ;for _gecc ,_ffcb :=range _acbg {_gca :=_ffcb ._bb ;_afe :=_ffcb ._cce ;
|
|
_ebg :=_ffcb ._gb ;_cbf :=_f .MakeFloat (_afe );if _fgaf > _gca ||_gca ==-1{continue ;};_dga :=_beb [_fgaf :_gca ];_bbc :=_egg (_dga ,_ggfb );_egf :=_f .MakeStringFromBytes (_bbc );_cfc =append (_cfc ,_egf );_cfc =append (_cfc ,_cbf );_gcb :=_gca +len (_ebg );
|
|
_bfb =_beb [_gcb :];_fgaf =_gcb ;if _gecc ==len (_acbg )-1{_bbc =_egg (_bfb ,_ggfb );_egf =_f .MakeStringFromBytes (_bbc );_cfc =append (_cfc ,_egf );};};return _cfc ;};
|
|
|
|
// WriteToFile writes the redacted document to file specified by `outputPath`.
|
|
func (_abee *Redactor )WriteToFile (outputPath string )error {if _bef :=_abee ._fgae .WriteToFile (outputPath );_bef !=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 ;};func _bff (_fga *_ef .TextMarkArray )*_d .PdfFont {_ ,_bea :=_db (_fga );_beaa :=_fga .Elements ()[_bea ];_fde :=_beaa .Font ;return _fde ;};func _fee (_efcc *_fg .ContentStreamOperation ,_egb _f .PdfObject ,_fae []localSpanMarks )error {var _fgg *_f .PdfObjectArray ;
|
|
_ddg ,_bffe :=_dcf (_fae );if len (_bffe )==1{_ebd :=_bffe [0];_dff :=_ddg [_ebd ];if len (_dff )==1{_egc :=_dff [0];_cge :=_egc ._cccf ;_dceg :=_bff (_cge );_aeb ,_fec :=_gga (_egb ,_dceg );if _fec !=nil {return _fec ;};_age ,_fec :=_afb (_egc ,_cge ,_dceg ,_aeb ,_ebd );
|
|
if _fec !=nil {return _fec ;};_fgg =_f .MakeArray (_age ...);}else {_ece :=_dff [0]._cccf ;_fgee :=_bff (_ece );_bgf ,_ffc :=_gga (_egb ,_fgee );if _ffc !=nil {return _ffc ;};_edg ,_ffc :=_cdg (_bgf ,_dff );if _ffc !=nil {return _ffc ;};_accc :=_cac (_edg );
|
|
_dcee :=_bdb (_bgf ,_accc ,_fgee );_fgg =_f .MakeArray (_dcee ...);};}else if len (_bffe )> 1{_gaec :=_fae [0];_gef :=_gaec ._cccf ;_ ,_ggf :=_db (_gef );_dfc :=_gef .Elements ()[_ggf ];_fbf :=_dfc .Font ;_cbb ,_ebc :=_gga (_egb ,_fbf );if _ebc !=nil {return _ebc ;
|
|
};_edf ,_ebc :=_cdg (_cbb ,_fae );if _ebc !=nil {return _ebc ;};_gcd :=_cac (_edf );_daa :=_bdb (_cbb ,_gcd ,_fbf );_fgg =_f .MakeArray (_daa ...);};_efcc .Params [0]=_fgg ;_efcc .Operand ="\u0054\u004a";return nil ;};func _agcc (_dfb *_d .PdfFont ,_ad _ef .TextMark )float64 {_abd :=0.001;
|
|
_eb :=_ad .Th /100;if _dfb .Subtype ()=="\u0054\u0079\u0070e\u0033"{_abd =1;};_fbe ,_fgc :=_dfb .GetRuneMetrics (' ');if !_fgc {_fbe ,_fgc =_dfb .GetCharMetrics (32);};if !_fgc {_fbe ,_ =_d .DefaultFont ().GetRuneMetrics (' ');};_gde :=_abd *((_fbe .Wx *_ad .FontSize +_ad .Tc +_ad .Tw )/_eb );
|
|
return _gde ;};func _db (_be *_ef .TextMarkArray )(_f .PdfObject ,int ){var _bag _f .PdfObject ;_dgc :=-1;for _gc ,_cb :=range _be .Elements (){_bag =_cb .DirectObject ;_dgc =_gc ;if _bag !=nil {break ;};};return _bag ,_dgc ;};func _gdcd (_fcaa *_ef .TextMarkArray ,_eaeg int ,_ddcb int )int {_ebb :=_fcaa .Elements ();
|
|
_ffa :=_eaeg -1;_cbfb :=_eaeg +1;_fcaf :=-1;if _ffa >=0{_dcb :=_ebb [_ffa ];_bbg :=_dcb .ObjString ;_cbfa :=len (_bbg );_fdc :=_dcb .Index ;if _fdc +1< _cbfa {_fcaf =_ffa ;return _fcaf ;};};if _cbfb < len (_ebb ){_ggaa :=_ebb [_cbfb ];_abg :=_ggaa .ObjString ;
|
|
if _abg [0]!=_ggaa .Text {_fcaf =_cbfb ;return _fcaf ;};};return _fcaf ;};
|
|
|
|
// RedactionOptions is a collection of RedactionTerm objects.
|
|
type RedactionOptions struct{Terms []RedactionTerm ;};func _deef (_bgfb ,_aabc targetMap )(bool ,[]int ){_bcff :=_a .Contains (_bgfb ._abed ,_aabc ._abed );var _bfdf []int ;for _ ,_dced :=range _bgfb ._fdg {for _ddc ,_gbf :=range _aabc ._fdg {if _gbf [0]>=_dced [0]&&_gbf [1]<=_dced [1]{_bfdf =append (_bfdf ,_ddc );
|
|
};};};return _bcff ,_bfdf ;};
|
|
|
|
// Redactor represents a Redactor object.
|
|
type Redactor struct{_dfg *_d .PdfReader ;_fgab *RedactionOptions ;_fgae *_eg .Creator ;_fdag *RectangleProps ;};func _dcf (_fdb []localSpanMarks )(map[string ][]localSpanMarks ,[]string ){_fag :=make (map[string ][]localSpanMarks );_dbc :=[]string {};
|
|
for _ ,_dd :=range _fdb {_adc :=_dd ._daag ;if _cde ,_aaf :=_fag [_adc ];_aaf {_fag [_adc ]=append (_cde ,_dd );}else {_fag [_adc ]=[]localSpanMarks {_dd };_dbc =append (_dbc ,_adc );};};return _fag ,_dbc ;};func _afb (_bab localSpanMarks ,_fad *_ef .TextMarkArray ,_agd *_d .PdfFont ,_ce ,_aac string )([]_f .PdfObject ,error ){_edfg :=_dgcd (_fad );
|
|
Tj ,_ebcf :=_geac (_fad );if _ebcf !=nil {return nil ,_ebcf ;};_dbf :=len (_ce );_ebe :=len (_edfg );_gea :=-1;_dee :=_f .MakeFloat (Tj );if _edfg !=_aac {_dacc :=_bab ._dad ;if _dacc ==0{_gea =_a .LastIndex (_ce ,_edfg );}else {_gea =_a .Index (_ce ,_edfg );
|
|
};}else {_gea =_a .Index (_ce ,_edfg );};_cgb :=_gea +_ebe ;_bbd :=[]_f .PdfObject {};if _gea ==0&&_cgb ==_dbf {_bbd =append (_bbd ,_dee );}else if _gea ==0&&_cgb < _dbf {_cgc :=_egg (_ce [_cgb :],_agd );_egaf :=_f .MakeStringFromBytes (_cgc );_bbd =append (_bbd ,_dee ,_egaf );
|
|
}else if _gea > 0&&_cgb >=_dbf {_fbec :=_egg (_ce [:_gea ],_agd );_dfa :=_f .MakeStringFromBytes (_fbec );_bbd =append (_bbd ,_dfa ,_dee );}else if _gea > 0&&_cgb < _dbf {_fcf :=_egg (_ce [:_gea ],_agd );_fggb :=_egg (_ce [_cgb :],_agd );_ea :=_f .MakeStringFromBytes (_fcf );
|
|
_eae :=_f .MakeString (string (_fggb ));_bbd =append (_bbd ,_ea ,_dee ,_eae );};return _bbd ,nil ;};func _eaee (_deb []int ,_dgg *_ef .TextMarkArray ,_bfa string )(*_ef .TextMarkArray ,matchedBBox ,error ){_gdd :=matchedBBox {};_bbef :=_deb [0];_bae :=_deb [1];
|
|
_geae :=len (_bfa )-len (_a .TrimLeft (_bfa ,"\u0020"));_dfd :=len (_bfa )-len (_a .TrimRight (_bfa ,"\u0020\u000a"));_bbef =_bbef +_geae ;_bae =_bae -_dfd ;_bfa =_a .Trim (_bfa ,"\u0020\u000a");_bffc ,_gffa :=_dgg .RangeOffset (_bbef ,_bae );if _gffa !=nil {return nil ,_gdd ,_gffa ;
|
|
};_efda ,_fbgc :=_bffc .BBox ();if !_fbgc {return nil ,_gdd ,_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",_bffc );
|
|
};_gdd =matchedBBox {_cfd :_bfa ,_ccc :_efda };return _bffc ,_gdd ,nil ;};func _fgac (_fbg *targetMap ,_bcac []int ){var _gdec [][]int ;for _dcc ,_cad :=range _fbg ._fdg {if _fecg (_dcc ,_bcac ){continue ;};_gdec =append (_gdec ,_cad );};_fbg ._fdg =_gdec ;
|
|
};func _faea (_gff []*targetMap ){for _cfbc ,_dge :=range _gff {for _beba ,_gabe :=range _gff {if _cfbc !=_beba {_bfc ,_fddd :=_deef (*_dge ,*_gabe );if _bfc {_fgac (_gabe ,_fddd );};};};};};func _cbfd (_ebbd *matchedIndex ,_bgc [][]int )(bool ,[][]int ){_agcg :=[][]int {};
|
|
for _ ,_cfeb :=range _bgc {if _ebbd ._fce < _cfeb [0]&&_ebbd ._fdd > _cfeb [1]{_agcg =append (_agcg ,_cfeb );};};return len (_agcg )> 0,_agcg ;};func _aba (_fdbf ,_cae ,_edfa float64 )float64 {_edfa =_edfa /100;_cea :=(-1000*_fdbf )/(_cae *_edfa );return _cea ;
|
|
};type matchedBBox struct{_ccc _d .PdfRectangle ;_cfd string ;};func _bg (_caa *_ef .TextMarkArray )int {_agc :=0;_ab :=_caa .Elements ();if _ab [0].Text =="\u0020"{_agc ++;};if _ab [_caa .Len ()-1].Text =="\u0020"{_agc ++;};return _agc ;};func _dgcd (_gcdf *_ef .TextMarkArray )string {_bcd :="";
|
|
for _ ,_dfbd :=range _gcdf .Elements (){_bcd +=_dfbd .Text ;};return _bcd ;};func (_bdd *Redactor )redactPage (_aafg *_fg .ContentStreamOperations ,_ebdg *_d .PdfPageResources )([]matchedBBox ,*_fg .ContentStreamOperations ,error ){_bca ,_gdc :=_ef .NewFromContents (_aafg .String (),_ebdg );
|
|
if _gdc !=nil {return nil ,nil ,_gdc ;};_geacg ,_ ,_ ,_gdc :=_bca .ExtractPageText ();if _gdc !=nil {return nil ,nil ,_gdc ;};_aafg =_geacg .GetContentStreamOps ();_eggb :=_geacg .Marks ();_fdgd :=_geacg .Text ();_fdgd ,_ddd :=_bcab (_fdgd );_eaa :=[]matchedBBox {};
|
|
_efd :=make (map[_f .PdfObject ][]localSpanMarks );_bacd :=[]*targetMap {};for _ ,_fbb :=range _bdd ._fgab .Terms {_aab ,_ead :=_bbefg (_fbb );if _ead !=nil {return nil ,nil ,_ead ;};_gbd ,_ead :=_aab .match (_fdgd );if _ead !=nil {return nil ,nil ,_ead ;
|
|
};_gbd =_bgaa (_gbd ,_ddd );_eeb :=_edfgb (_gbd );_bacd =append (_bacd ,_eeb ...);};_faea (_bacd );for _ ,_fggg :=range _bacd {_cfdg :=_fggg ._abed ;_dgbf :=_fggg ._fdg ;_fdbfg :=[]matchedBBox {};for _ ,_cda :=range _dgbf {_ffcg ,_bbb ,_fcb :=_eaee (_cda ,_eggb ,_cfdg );
|
|
if _fcb !=nil {return nil ,nil ,_fcb ;};_dedc :=_dgdd (_ffcg );for _ege ,_eba :=range _dedc {_adf :=localSpanMarks {_cccf :_eba ,_dad :_ege ,_daag :_cfdg };_dfcf ,_ :=_db (_eba );if _bdbf ,_afbc :=_efd [_dfcf ];_afbc {_efd [_dfcf ]=append (_bdbf ,_adf );
|
|
}else {_efd [_dfcf ]=[]localSpanMarks {_adf };};};_fdbfg =append (_fdbfg ,_bbb );};_eaa =append (_eaa ,_fdbfg ...);};_gdc =_bbe (_aafg ,_efd );if _gdc !=nil {return nil ,nil ,_gdc ;};return _eaa ,_aafg ,nil ;};
|
|
|
|
// Redact executes the redact operation on a pdf file and updates the content streams of all pages of the file.
|
|
func (_ebge *Redactor )Redact ()error {_bcdd ,_aee :=_ebge ._dfg .GetNumPages ();if _aee !=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");
|
|
};_ecf :=_ebge ._fdag .FillColor ;_ded :=_ebge ._fdag .BorderWidth ;_ageb :=_ebge ._fdag .FillOpacity ;for _bee :=1;_bee <=_bcdd ;_bee ++{_bfbd ,_ffd :=_ebge ._dfg .GetPage (_bee );if _ffd !=nil {return _ffd ;};_bccb ,_ffd :=_ef .New (_bfbd );if _ffd !=nil {return _ffd ;
|
|
};_ebde ,_ ,_ ,_ffd :=_bccb .ExtractPageText ();if _ffd !=nil {return _ffd ;};_dedf :=_ebde .GetContentStreamOps ();_bga ,_gaef ,_ffd :=_ebge .redactPage (_dedf ,_bfbd .Resources );if _gaef ==nil {_af .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");
|
|
_gaef =_dedf ;};_beaae :=_fg .ContentStreamOperation {Operand :"\u006e"};*_gaef =append (*_gaef ,&_beaae );_bfbd .SetContentStreams ([]string {_gaef .String ()},_f .NewFlateEncoder ());if _ffd !=nil {return _ffd ;};_gce ,_ffd :=_bfbd .GetMediaBox ();if _ffd !=nil {return _ffd ;
|
|
};if _bfbd .MediaBox ==nil {_bfbd .MediaBox =_gce ;};if _fdaa :=_ebge ._fgae .AddPage (_bfbd );_fdaa !=nil {return _fdaa ;};_cf .Slice (_bga ,func (_bcf ,_dab int )bool {return _bga [_bcf ]._cfd < _bga [_dab ]._cfd });_ccec :=_gce .Ury ;for _ ,_cab :=range _bga {_fca :=_cab ._ccc ;
|
|
_aad :=_ebge ._fgae .NewRectangle (_fca .Llx ,_ccec -_fca .Lly ,_fca .Urx -_fca .Llx ,-(_fca .Ury -_fca .Lly ));_aad .SetFillColor (_ecf );_aad .SetBorderWidth (_ded );_aad .SetFillOpacity (_ageb );if _bgb :=_ebge ._fgae .Draw (_aad );_bgb !=nil {return nil ;
|
|
};};};_ebge ._fgae .SetOutlineTree (_ebge ._dfg .GetOutlineTree ());return nil ;};func _geac (_fgfd *_ef .TextMarkArray )(float64 ,error ){_ggb ,_cbc :=_fgfd .BBox ();if !_cbc {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",_fgfd );
|
|
};_cbfg :=_bg (_fgfd );_gfd :=0.0;_ ,_fda :=_db (_fgfd );_cff :=_fgfd .Elements ()[_fda ];_efce :=_cff .Font ;if _cbfg > 0{_gfd =_agcc (_efce ,_cff );};_aea :=(_ggb .Urx -_ggb .Llx );_aea =_aea +_gfd *float64 (_cbfg );Tj :=_aba (_aea ,_cff .FontSize ,_cff .Th );
|
|
return Tj ,nil ;};func _bcab (_efa string )(string ,[][]int ){_fcff :=_g .MustCompile ("\u005c\u006e");_cbcd :=_fcff .FindAllStringIndex (_efa ,-1);_cca :=_fcff .ReplaceAllString (_efa ,"\u0020");return _cca ,_cbcd ;};
|
|
|
|
// RedactRectanglePropsNew return a new pointer to a default RectangleProps object.
|
|
func RedactRectanglePropsNew ()*RectangleProps {return &RectangleProps {FillColor :_eg .ColorBlack ,BorderWidth :0.0,FillOpacity :1.0};};
|
|
|
|
// RectangleProps defines properties of the redaction rectangle to be drawn.
|
|
type RectangleProps struct{FillColor _eg .Color ;BorderWidth float64 ;FillOpacity float64 ;};func _cac (_fbff []placeHolders )[]replacement {_ffff :=[]replacement {};for _ ,_eaf :=range _fbff {_cgec :=_eaf ._efc ;_faeb :=_eaf ._cc ;_gge :=_eaf ._ga ;for _ ,_dgd :=range _cgec {_fbfb :=replacement {_gb :_faeb ,_cce :_gge ,_bb :_dgd };
|
|
_ffff =append (_ffff ,_fbfb );};};_cf .Slice (_ffff ,func (_afg ,_dgcg int )bool {return _ffff [_afg ]._bb < _ffff [_dgcg ]._bb });return _ffff ;};func _fecg (_cfg int ,_deec []int )bool {for _ ,_dbce :=range _deec {if _dbce ==_cfg {return true ;};};return false ;
|
|
};type targetMap struct{_abed string ;_fdg [][]int ;};type matchedIndex struct{_fce int ;_fdd int ;_acg string ;};func _bbe (_ac *_fg .ContentStreamOperations ,_ff map[_f .PdfObject ][]localSpanMarks )error {for _fd ,_dg :=range _ff {if _fd ==nil {continue ;
|
|
};_fb ,_ag ,_ca :=_fafe (_ac ,_fd );if !_ca {_af .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",_fd ,_ac );
|
|
return nil ;};if _fb .Operand =="\u0054\u006a"{_bf :=_fee (_fb ,_fd ,_dg );if _bf !=nil {return _bf ;};}else if _fb .Operand =="\u0054\u004a"{_gg :=_acc (_fb ,_fd ,_dg );if _gg !=nil {return _gg ;};}else if _fb .Operand =="\u0027"||_fb .Operand =="\u0022"{_da :=_bc (_ac ,_fb .Operand ,_ag );
|
|
if _da !=nil {return _da ;};_da =_fee (_fb ,_fd ,_dg );if _da !=nil {return _da ;};};};return nil ;};func _bgaa (_dacg []*matchedIndex ,_gba [][]int )[]*matchedIndex {_fba :=[]*matchedIndex {};for _ ,_cggg :=range _dacg {_gcae ,_dgcf :=_cbfd (_cggg ,_gba );
|
|
if _gcae {_fdga :=_ada (_cggg ,_dgcf );_fba =append (_fba ,_fdga ...);}else {_fba =append (_fba ,_cggg );};};return _fba ;};
|
|
|
|
// RedactionTerm holds the regexp pattern and the replacement string for the redaction process.
|
|
type RedactionTerm struct{Pattern *_g .Regexp ;};func _ada (_feb *matchedIndex ,_gebf [][]int )[]*matchedIndex {_deed :=[]*matchedIndex {};_cbd :=_feb ._fce ;_ddf :=_cbd ;_fgd :=_feb ._acg ;_bbbe :=0;for _ ,_ecg :=range _gebf {_ceeb :=_ecg [0]-_cbd ;if _bbbe >=_ceeb {continue ;
|
|
};_efe :=_fgd [_bbbe :_ceeb ];_dbcf :=&matchedIndex {_acg :_efe ,_fce :_ddf ,_fdd :_ecg [0]};if len (_a .TrimSpace (_efe ))!=0{_deed =append (_deed ,_dbcf );};_bbbe =_ecg [1]-_cbd ;_ddf =_cbd +_bbbe ;};_ebfa :=_fgd [_bbbe :];_fccc :=&matchedIndex {_acg :_ebfa ,_fce :_ddf ,_fdd :_feb ._fdd };
|
|
if len (_a .TrimSpace (_ebfa ))!=0{_deed =append (_deed ,_fccc );};return _deed ;};type localSpanMarks struct{_cccf *_ef .TextMarkArray ;_dad int ;_daag string ;};func _cdg (_baf string ,_ede []localSpanMarks )([]placeHolders ,error ){_ace :="";_caf :=[]placeHolders {};
|
|
for _ccd ,_faf :=range _ede {_aeba :=_faf ._cccf ;_dec :=_faf ._daag ;_gda :=_dgcd (_aeba );_cag ,_eef :=_geac (_aeba );if _eef !=nil {return nil ,_eef ;};if _gda !=_ace {var _abe []int ;if _ccd ==0&&_dec !=_gda {_gab :=_a .Index (_baf ,_gda );_abe =[]int {_gab };
|
|
}else if _ccd ==len (_ede )-1{_gcf :=_a .LastIndex (_baf ,_gda );_abe =[]int {_gcf };}else {_abe =_eeg (_baf ,_gda );};_bfd :=placeHolders {_efc :_abe ,_cc :_gda ,_ga :_cag };_caf =append (_caf ,_bfd );};_ace =_gda ;};return _caf ,nil ;};func _bc (_afc *_fg .ContentStreamOperations ,_gae string ,_fff int )error {_cg :=_fg .ContentStreamOperations {};
|
|
var _ed _fg .ContentStreamOperation ;for _gf ,_dc :=range *_afc {if _gf ==_fff {if _gae =="\u0027"{_eff :=_fg .ContentStreamOperation {Operand :"\u0054\u002a"};_cg =append (_cg ,&_eff );_ed .Params =_dc .Params ;_ed .Operand ="\u0054\u006a";_cg =append (_cg ,&_ed );
|
|
}else if _gae =="\u0022"{_bcc :=_dc .Params [:2];Tc ,Tw :=_bcc [0],_bcc [1];_ba :=_fg .ContentStreamOperation {Params :[]_f .PdfObject {Tc },Operand :"\u0054\u0063"};_cg =append (_cg ,&_ba );_ba =_fg .ContentStreamOperation {Params :[]_f .PdfObject {Tw },Operand :"\u0054\u0077"};
|
|
_cg =append (_cg ,&_ba );_ed .Params =[]_f .PdfObject {_dc .Params [2]};_ed .Operand ="\u0054\u006a";_cg =append (_cg ,&_ed );};};_cg =append (_cg ,_dc );};*_afc =_cg ;return nil ;};type regexMatcher struct{_cfa RedactionTerm };func _fafe (_dfbf *_fg .ContentStreamOperations ,PdfObj _f .PdfObject )(*_fg .ContentStreamOperation ,int ,bool ){for _edgf ,_ebeb :=range *_dfbf {_gegg :=_ebeb .Operand ;
|
|
if _gegg =="\u0054\u006a"{_gfe :=_f .TraceToDirectObject (_ebeb .Params [0]);if _gfe ==PdfObj {return _ebeb ,_edgf ,true ;};}else if _gegg =="\u0054\u004a"{_cec ,_gcbf :=_f .GetArray (_ebeb .Params [0]);if !_gcbf {return nil ,_edgf ,_gcbf ;};for _ ,_bdf :=range _cec .Elements (){if _bdf ==PdfObj {return _ebeb ,_edgf ,true ;
|
|
};};}else if _gegg =="\u0022"{_cdf :=_f .TraceToDirectObject (_ebeb .Params [2]);if _cdf ==PdfObj {return _ebeb ,_edgf ,true ;};}else if _gegg =="\u0027"{_edc :=_f .TraceToDirectObject (_ebeb .Params [0]);if _edc ==PdfObj {return _ebeb ,_edgf ,true ;};
|
|
};};return nil ,-1,false ;};func _eeg (_ecb ,_ceaa string )[]int {if len (_ceaa )==0{return nil ;};var _dag []int ;for _gead :=0;_gead < len (_ecb );{_eda :=_a .Index (_ecb [_gead :],_ceaa );if _eda < 0{return _dag ;};_dag =append (_dag ,_gead +_eda );
|
|
_gead +=_eda +len (_ceaa );};return _dag ;};func _edfgb (_bgde []*matchedIndex )[]*targetMap {_cdaa :=make (map[string ][][]int );_ecc :=[]*targetMap {};for _ ,_daga :=range _bgde {_bcb :=_daga ._acg ;_gdcde :=[]int {_daga ._fce ,_daga ._fdd };if _ddb ,_dba :=_cdaa [_bcb ];
|
|
_dba {_cdaa [_bcb ]=append (_ddb ,_gdcde );}else {_cdaa [_bcb ]=[][]int {_gdcde };};};for _cba ,_egga :=range _cdaa {_daagd :=&targetMap {_abed :_cba ,_fdg :_egga };_ecc =append (_ecc ,_daagd );};return _ecc ;};
|
|
|
|
// Write writes the content of `re.creator` to writer of type io.Writer interface.
|
|
func (_cfgd *Redactor )Write (writer _c .Writer )error {return _cfgd ._fgae .Write (writer )};
|
|
|
|
// New instantiates a Redactor object with given PdfReader and `regex` pattern.
|
|
func New (reader *_d .PdfReader ,opts *RedactionOptions ,rectProps *RectangleProps )*Redactor {if rectProps ==nil {rectProps =RedactRectanglePropsNew ();};return &Redactor {_dfg :reader ,_fgab :opts ,_fgae :_eg .New (),_fdag :rectProps };};func _egg (_fcd string ,_gegd *_d .PdfFont )[]byte {_ega ,_geb :=_gegd .StringToCharcodeBytes (_fcd );
|
|
if _geb !=0{_af .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",_fcd ,_ega );
|
|
};return _ega ;};type placeHolders struct{_efc []int ;_cc string ;_ga float64 ;}; |