mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-04 22:17:22 +08:00
112 lines
23 KiB
Go
112 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";_e "fmt";_gf "github.com/unidoc/unipdf/v3/common";_bf "github.com/unidoc/unipdf/v3/contentstream";_c "github.com/unidoc/unipdf/v3/core";_eb "github.com/unidoc/unipdf/v3/creator";_b "github.com/unidoc/unipdf/v3/extractor";
|
|
_dc "github.com/unidoc/unipdf/v3/model";_g "io";_f "regexp";_de "sort";_dd "strings";);
|
|
|
|
// New instantiates a Redactor object with given PdfReader and `regex` pattern.
|
|
func New (reader *_dc .PdfReader ,opts *RedactionOptions ,rectProps *RectangleProps )*Redactor {if rectProps ==nil {rectProps =RedactRectanglePropsNew ();};return &Redactor {_efe :reader ,_adb :opts ,_ecb :_eb .New (),_bccc :rectProps };};func _eed (_accg []*matchedIndex )[]*targetMap {_caea :=make (map[string ][][]int );
|
|
_acda :=[]*targetMap {};for _ ,_edc :=range _accg {_bbdb :=_edc ._fcda ;_gage :=[]int {_edc ._aadc ,_edc ._daa };if _edgg ,_dga :=_caea [_bbdb ];_dga {_caea [_bbdb ]=append (_edgg ,_gage );}else {_caea [_bbdb ]=[][]int {_gage };};};for _ebgd ,_cafb :=range _caea {_baf :=&targetMap {_daae :_ebgd ,_cgef :_cafb };
|
|
_acda =append (_acda ,_baf );};return _acda ;};func _edag (_aaab string )(string ,[][]int ){_gca :=_f .MustCompile ("\u005c\u006e");_ffbc :=_gca .FindAllStringIndex (_aaab ,-1);_eabc :=_gca .ReplaceAllString (_aaab ,"\u0020");return _eabc ,_ffbc ;};func _bffg (_cad ,_decc targetMap )(bool ,[]int ){_deg :=_dd .Contains (_cad ._daae ,_decc ._daae );
|
|
var _cbg []int ;for _ ,_babg :=range _cad ._cgef {for _befb ,_aag :=range _decc ._cgef {if _aag [0]>=_babg [0]&&_aag [1]<=_babg [1]{_cbg =append (_cbg ,_befb );};};};return _deg ,_cbg ;};func _ef (_ebd *_b .TextMarkArray )(_c .PdfObject ,int ){var _ffc _c .PdfObject ;
|
|
_dea :=-1;for _ebf ,_fff :=range _ebd .Elements (){_ffc =_fff .DirectObject ;_dea =_ebf ;if _ffc !=nil {break ;};};return _ffc ,_dea ;};func _cfd (_edb localSpanMarks ,_decd *_b .TextMarkArray ,_fga *_dc .PdfFont ,_abb ,_ggg string )([]_c .PdfObject ,error ){_ce :=_cccb (_decd );
|
|
Tj ,_ee :=_bgfg (_decd );if _ee !=nil {return nil ,_ee ;};_aed :=len (_abb );_cfdf :=len (_ce );_cab :=-1;_gbd :=_c .MakeFloat (Tj );if _ce !=_ggg {_fbg :=_edb ._bfd ;if _fbg ==0{_cab =_dd .LastIndex (_abb ,_ce );}else {_cab =_dd .Index (_abb ,_ce );};
|
|
}else {_cab =_dd .Index (_abb ,_ce );};_ddd :=_cab +_cfdf ;_bga :=[]_c .PdfObject {};if _cab ==0&&_ddd ==_aed {_bga =append (_bga ,_gbd );}else if _cab ==0&&_ddd < _aed {_fae :=_accc (_abb [_ddd :],_fga );_fe :=_c .MakeStringFromBytes (_fae );_bga =append (_bga ,_gbd ,_fe );
|
|
}else if _cab > 0&&_ddd >=_aed {_ccdc :=_accc (_abb [:_cab ],_fga );_cge :=_c .MakeStringFromBytes (_ccdc );_bga =append (_bga ,_cge ,_gbd );}else if _cab > 0&&_ddd < _aed {_edg :=_accc (_abb [:_cab ],_fga );_gcgd :=_accc (_abb [_ddd :],_fga );_ece :=_c .MakeStringFromBytes (_edg );
|
|
_gafb :=_c .MakeString (string (_gcgd ));_bga =append (_bga ,_ece ,_gbd ,_gafb );};return _bga ,nil ;};type placeHolders struct{_ga []int ;_ag string ;_gad float64 ;};func (_cfdb *regexMatcher )match (_eeg string )([]*matchedIndex ,error ){_eaba :=_cfdb ._geee .Pattern ;
|
|
if _eaba ==nil {return nil ,_d .New ("\u006e\u006f\u0020\u0070at\u0074\u0065\u0072\u006e\u0020\u0063\u006f\u006d\u0070\u0069\u006c\u0065\u0064");};var (_bdec =_eaba .FindAllStringIndex (_eeg ,-1);_ggge []*matchedIndex ;);for _ ,_agf :=range _bdec {_ggge =append (_ggge ,&matchedIndex {_aadc :_agf [0],_daa :_agf [1],_fcda :_eeg [_agf [0]:_agf [1]]});
|
|
};return _ggge ,nil ;};func _cffb (_fed *_bf .ContentStreamOperations ,PdfObj _c .PdfObject )(*_bf .ContentStreamOperation ,int ,bool ){for _cdb ,_gfcf :=range *_fed {_dag :=_gfcf .Operand ;if _dag =="\u0054\u006a"{_dgdf :=_c .TraceToDirectObject (_gfcf .Params [0]);
|
|
if _dgdf ==PdfObj {return _gfcf ,_cdb ,true ;};}else if _dag =="\u0054\u004a"{_aga ,_fffcb :=_c .GetArray (_gfcf .Params [0]);if !_fffcb {return nil ,_cdb ,_fffcb ;};for _ ,_abbb :=range _aga .Elements (){if _abbb ==PdfObj {return _gfcf ,_cdb ,true ;};
|
|
};}else if _dag =="\u0022"{_adg :=_c .TraceToDirectObject (_gfcf .Params [2]);if _adg ==PdfObj {return _gfcf ,_cdb ,true ;};}else if _dag =="\u0027"{_dee :=_c .TraceToDirectObject (_gfcf .Params [0]);if _dee ==PdfObj {return _gfcf ,_cdb ,true ;};};};return nil ,-1,false ;
|
|
};type regexMatcher struct{_geee RedactionTerm };type localSpanMarks struct{_fbfd *_b .TextMarkArray ;_bfd int ;_eddb string ;};func _bcb (_eg *_bf .ContentStreamOperations ,_bfb string ,_fd int )error {_ac :=_bf .ContentStreamOperations {};var _aad _bf .ContentStreamOperation ;
|
|
for _ggd ,_bcc :=range *_eg {if _ggd ==_fd {if _bfb =="\u0027"{_fgg :=_bf .ContentStreamOperation {Operand :"\u0054\u002a"};_ac =append (_ac ,&_fgg );_aad .Params =_bcc .Params ;_aad .Operand ="\u0054\u006a";_ac =append (_ac ,&_aad );}else if _bfb =="\u0022"{_ca :=_bcc .Params [:2];
|
|
Tc ,Tw :=_ca [0],_ca [1];_fb :=_bf .ContentStreamOperation {Params :[]_c .PdfObject {Tc },Operand :"\u0054\u0063"};_ac =append (_ac ,&_fb );_fb =_bf .ContentStreamOperation {Params :[]_c .PdfObject {Tw },Operand :"\u0054\u0077"};_ac =append (_ac ,&_fb );
|
|
_aad .Params =[]_c .PdfObject {_bcc .Params [2]};_aad .Operand ="\u0054\u006a";_ac =append (_ac ,&_aad );};};_ac =append (_ac ,_bcc );};*_eg =_ac ;return nil ;};func _aae (_gcbf *_dc .PdfFont ,_ace _b .TextMark )float64 {_ege :=0.001;_gfg :=_ace .Th /100;
|
|
if _gcbf .Subtype ()=="\u0054\u0079\u0070e\u0033"{_ege =1;};_acc ,_fad :=_gcbf .GetRuneMetrics (' ');if !_fad {_acc ,_fad =_gcbf .GetCharMetrics (32);};if !_fad {_acc ,_ =_dc .DefaultFont ().GetRuneMetrics (' ');};_gaf :=_ege *((_acc .Wx *_ace .FontSize +_ace .Tc +_ace .Tw )/_gfg );
|
|
return _gaf ;};
|
|
|
|
// Redact executes the redact operation on a pdf file and updates the content streams of all pages of the file.
|
|
func (_abba *Redactor )Redact ()error {_fab ,_bbf :=_abba ._efe .GetNumPages ();if _bbf !=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");
|
|
};_aefd :=_abba ._bccc .FillColor ;_beca :=_abba ._bccc .BorderWidth ;_deee :=_abba ._bccc .FillOpacity ;for _cce :=1;_cce <=_fab ;_cce ++{_cbf ,_baab :=_abba ._efe .GetPage (_cce );if _baab !=nil {return _baab ;};_cde ,_baab :=_b .New (_cbf );if _baab !=nil {return _baab ;
|
|
};_daf ,_ ,_ ,_baab :=_cde .ExtractPageText ();if _baab !=nil {return _baab ;};_ecc :=_daf .GetContentStreamOps ();_eabb ,_agae ,_baab :=_abba .redactPage (_ecc ,_cbf .Resources );if _agae ==nil {_gf .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");
|
|
_agae =_ecc ;};_eaa :=_bf .ContentStreamOperation {Operand :"\u006e"};*_agae =append (*_agae ,&_eaa );_cbf .SetContentStreams ([]string {_agae .String ()},_c .NewFlateEncoder ());if _baab !=nil {return _baab ;};_bed ,_baab :=_cbf .GetMediaBox ();if _baab !=nil {return _baab ;
|
|
};if _cbf .MediaBox ==nil {_cbf .MediaBox =_bed ;};if _accb :=_abba ._ecb .AddPage (_cbf );_accb !=nil {return _accb ;};_de .Slice (_eabb ,func (_ffd ,_faea int )bool {return _eabb [_ffd ]._gade < _eabb [_faea ]._gade });_cac :=_bed .Ury ;for _ ,_aba :=range _eabb {_aedc :=_aba ._dgdfc ;
|
|
_ade :=_abba ._ecb .NewRectangle (_aedc .Llx ,_cac -_aedc .Lly ,_aedc .Urx -_aedc .Llx ,-(_aedc .Ury -_aedc .Lly ));_ade .SetFillColor (_aefd );_ade .SetBorderWidth (_beca );_ade .SetFillOpacity (_deee );if _ada :=_abba ._ecb .Draw (_ade );_ada !=nil {return nil ;
|
|
};};};_abba ._ecb .SetOutlineTree (_abba ._efe .GetOutlineTree ());return nil ;};func _fde (_ecg ,_fgb ,_dfaa float64 )float64 {_dfaa =_dfaa /100;_cea :=(-1000*_ecg )/(_fgb *_dfaa );return _cea ;};
|
|
|
|
// RectangleProps defines properties of the redaction rectangle to be drawn.
|
|
type RectangleProps struct{FillColor _eb .Color ;BorderWidth float64 ;FillOpacity float64 ;};func _acd (_db []localSpanMarks )(map[string ][]localSpanMarks ,[]string ){_dec :=make (map[string ][]localSpanMarks );_aaa :=[]string {};for _ ,_egg :=range _db {_dfa :=_egg ._eddb ;
|
|
if _caa ,_eggg :=_dec [_dfa ];_eggg {_dec [_dfa ]=append (_caa ,_egg );}else {_dec [_dfa ]=[]localSpanMarks {_egg };_aaa =append (_aaa ,_dfa );};};return _dec ,_aaa ;};
|
|
|
|
// Redactor represents a Redactor object.
|
|
type Redactor struct{_efe *_dc .PdfReader ;_adb *RedactionOptions ;_ecb *_eb .Creator ;_bccc *RectangleProps ;};func (_fbc *Redactor )redactPage (_dagde *_bf .ContentStreamOperations ,_egd *_dc .PdfPageResources )([]matchedBBox ,*_bf .ContentStreamOperations ,error ){_egga ,_fbbe :=_b .NewFromContents (_dagde .String (),_egd );
|
|
if _fbbe !=nil {return nil ,nil ,_fbbe ;};_gcee ,_ ,_ ,_fbbe :=_egga .ExtractPageText ();if _fbbe !=nil {return nil ,nil ,_fbbe ;};_dagde =_gcee .GetContentStreamOps ();_fcbe :=_gcee .Marks ();_ceaa :=_gcee .Text ();_ceaa ,_dbfe :=_edag (_ceaa );_bbfd :=[]matchedBBox {};
|
|
_gga :=make (map[_c .PdfObject ][]localSpanMarks );_gdcc :=[]*targetMap {};for _ ,_gaa :=range _fbc ._adb .Terms {_gfdf ,_edbg :=_bfcg (_gaa );if _edbg !=nil {return nil ,nil ,_edbg ;};_adaa ,_edbg :=_gfdf .match (_ceaa );if _edbg !=nil {return nil ,nil ,_edbg ;
|
|
};_adaa =_eca (_adaa ,_dbfe );_fcc :=_eed (_adaa );_gdcc =append (_gdcc ,_fcc ...);};_bgc (_gdcc );for _ ,_dff :=range _gdcc {_afg :=_dff ._daae ;_fef :=_dff ._cgef ;_bac :=[]matchedBBox {};for _ ,_cfdd :=range _fef {_edda ,_ggeb ,_agec :=_gafd (_cfdd ,_fcbe ,_afg );
|
|
if _agec !=nil {return nil ,nil ,_agec ;};_eeb :=_edba (_edda );for _fgbf ,_gbga :=range _eeb {_geae :=localSpanMarks {_fbfd :_gbga ,_bfd :_fgbf ,_eddb :_afg };_caag ,_ :=_ef (_gbga );if _ggac ,_fffg :=_gga [_caag ];_fffg {_gga [_caag ]=append (_ggac ,_geae );
|
|
}else {_gga [_caag ]=[]localSpanMarks {_geae };};};_bac =append (_bac ,_ggeb );};_bbfd =append (_bbfd ,_bac ...);};_fbbe =_edd (_dagde ,_gga );if _fbbe !=nil {return nil ,nil ,_fbbe ;};return _bbfd ,_dagde ,nil ;};func _gea (_bab ,_ebfe string )[]int {if len (_ebfe )==0{return nil ;
|
|
};var _fcbg []int ;for _cda :=0;_cda < len (_bab );{_gefb :=_dd .Index (_bab [_cda :],_ebfe );if _gefb < 0{return _fcbg ;};_fcbg =append (_fcbg ,_cda +_gefb );_cda +=_gefb +len (_ebfe );};return _fcbg ;};func _bgc (_cggf []*targetMap ){for _gde ,_eccb :=range _cggf {for _fca ,_abd :=range _cggf {if _gde !=_fca {_ggdf ,_agc :=_bffg (*_eccb ,*_abd );
|
|
if _ggdf {_ggf (_abd ,_agc );};};};};};type matchedBBox struct{_dgdfc _dc .PdfRectangle ;_gade string ;};func _ae (_cg *_b .TextMarkArray )int {_cd :=0;_bg :=_cg .Elements ();if _bg [0].Text =="\u0020"{_cd ++;};if _bg [_cg .Len ()-1].Text =="\u0020"{_cd ++;
|
|
};return _cd ;};func _gcgc (_bgb int ,_gcga []int )bool {for _ ,_bfca :=range _gcga {if _bfca ==_bgb {return true ;};};return false ;};
|
|
|
|
// RedactionOptions is a collection of RedactionTerm objects.
|
|
type RedactionOptions struct{Terms []RedactionTerm ;};func _edba (_gdec *_b .TextMarkArray )[]*_b .TextMarkArray {_geb :=_gdec .Elements ();_efd :=len (_geb );var _gebc _c .PdfObject ;_cffbc :=[]*_b .TextMarkArray {};_fdf :=&_b .TextMarkArray {};_agg :=-1;
|
|
for _bcg ,_bfad :=range _geb {_bffc :=_bfad .DirectObject ;_agg =_bfad .Index ;if _bffc ==nil {_caba :=_degc (_gdec ,_bcg ,_agg );if _gebc !=nil {if _caba ==-1||_caba > _bcg {_cffbc =append (_cffbc ,_fdf );_fdf =&_b .TextMarkArray {};};};}else if _bffc !=nil &&_gebc ==nil {if _agg ==0&&_bcg > 0{_cffbc =append (_cffbc ,_fdf );
|
|
_fdf =&_b .TextMarkArray {};};}else if _bffc !=nil &&_gebc !=nil {if _bffc !=_gebc {_cffbc =append (_cffbc ,_fdf );_fdf =&_b .TextMarkArray {};};};_gebc =_bffc ;_fdf .Append (_bfad );if _bcg ==(_efd -1){_cffbc =append (_cffbc ,_fdf );};};return _cffbc ;
|
|
};func _accc (_afc string ,_ffe *_dc .PdfFont )[]byte {_gd ,_faa :=_ffe .StringToCharcodeBytes (_afc );if _faa !=0{_gf .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",_afc ,_gd );
|
|
};return _gd ;};func _bfg (_fc *_bf .ContentStreamOperation ,_be _c .PdfObject ,_eba []localSpanMarks )error {_fcd ,_gb :=_c .GetArray (_fc .Params [0]);_df :=[]_c .PdfObject {};if !_gb {_gf .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",_fc );
|
|
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",_fc );
|
|
};_gbg ,_dcg :=_acd (_eba );if len (_dcg )==1{_ebg :=_dcg [0];_ede :=_gbg [_ebg ];if len (_ede )==1{_fbb :=_ede [0];_bfba :=_fbb ._fbfd ;_gbb :=_gge (_bfba );_efg ,_bb :=_dfd (_be ,_gbb );if _bb !=nil {return _bb ;};_af ,_bb :=_cfd (_fbb ,_bfba ,_gbb ,_efg ,_ebg );
|
|
if _bb !=nil {return _bb ;};for _ ,_cgd :=range _fcd .Elements (){if _cgd ==_be {_df =append (_df ,_af ...);}else {_df =append (_df ,_cgd );};};}else {_bfc :=_ede [0]._fbfd ;_ec :=_gge (_bfc );_dde ,_bd :=_dfd (_be ,_ec );if _bd !=nil {return _bd ;};_egf ,_bd :=_efa (_dde ,_ede );
|
|
if _bd !=nil {return _bd ;};_ea :=_cdc (_egf );_edef :=_cfae (_dde ,_ea ,_ec );for _ ,_bec :=range _fcd .Elements (){if _bec ==_be {_df =append (_df ,_edef ...);}else {_df =append (_df ,_bec );};};};_fc .Params [0]=_c .MakeArray (_df ...);}else if len (_dcg )> 1{_fcb :=_eba [0];
|
|
_edf :=_fcb ._fbfd ;_ ,_gfd :=_ef (_edf );_gfdg :=_edf .Elements ()[_gfd ];_dg :=_gfdg .Font ;_caf ,_fa :=_dfd (_be ,_dg );if _fa !=nil {return _fa ;};_bff ,_fa :=_efa (_caf ,_eba );if _fa !=nil {return _fa ;};_eda :=_cdc (_bff );_fbe :=_cfae (_caf ,_eda ,_dg );
|
|
for _ ,_aff :=range _fcd .Elements (){if _aff ==_be {_df =append (_df ,_fbe ...);}else {_df =append (_df ,_aff );};};_fc .Params [0]=_c .MakeArray (_df ...);};return nil ;};func _edd (_gg *_bf .ContentStreamOperations ,_ab map[_c .PdfObject ][]localSpanMarks )error {for _gac ,_aa :=range _ab {if _gac ==nil {continue ;
|
|
};_ff ,_cc ,_cf :=_cffb (_gg ,_gac );if !_cf {_gf .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",_gac ,_gg );
|
|
return nil ;};if _ff .Operand =="\u0054\u006a"{_fg :=_ccf (_ff ,_gac ,_aa );if _fg !=nil {return _fg ;};}else if _ff .Operand =="\u0054\u004a"{_gcb :=_bfg (_ff ,_gac ,_aa );if _gcb !=nil {return _gcb ;};}else if _ff .Operand =="\u0027"||_ff .Operand =="\u0022"{_gfb :=_bcb (_gg ,_ff .Operand ,_cc );
|
|
if _gfb !=nil {return _gfb ;};_gfb =_ccf (_ff ,_gac ,_aa );if _gfb !=nil {return _gfb ;};};};return nil ;};
|
|
|
|
// RedactionTerm holds the regexp pattern and the replacement string for the redaction process.
|
|
type RedactionTerm struct{Pattern *_f .Regexp ;};func _gafd (_cdcb []int ,_beb *_b .TextMarkArray ,_ddda string )(*_b .TextMarkArray ,matchedBBox ,error ){_cgdd :=matchedBBox {};_edbge :=_cdcb [0];_cbb :=_cdcb [1];_bace :=len (_ddda )-len (_dd .TrimLeft (_ddda ,"\u0020"));
|
|
_dgcb :=len (_ddda )-len (_dd .TrimRight (_ddda ,"\u0020\u000a"));_edbge =_edbge +_bace ;_cbb =_cbb -_dgcb ;_ddda =_dd .Trim (_ddda ,"\u0020\u000a");_abea ,_fcfd :=_beb .RangeOffset (_edbge ,_cbb );if _fcfd !=nil {return nil ,_cgdd ,_fcfd ;};_dbbc ,_gff :=_abea .BBox ();
|
|
if !_gff {return nil ,_cgdd ,_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",_abea );
|
|
};_cgdd =matchedBBox {_gade :_ddda ,_dgdfc :_dbbc };return _abea ,_cgdd ,nil ;};func _gge (_afe *_b .TextMarkArray )*_dc .PdfFont {_ ,_aec :=_ef (_afe );_fcf :=_afe .Elements ()[_aec ];_ccd :=_fcf .Font ;return _ccd ;};func _cdc (_ddef []placeHolders )[]replacement {_dgde :=[]replacement {};
|
|
for _ ,_aeed :=range _ddef {_ad :=_aeed ._ga ;_cfff :=_aeed ._ag ;_bfa :=_aeed ._gad ;for _ ,_fffc :=range _ad {_gbda :=replacement {_gc :_cfff ,_ed :_bfa ,_bc :_fffc };_dgde =append (_dgde ,_gbda );};};_de .Slice (_dgde ,func (_ddg ,_abe int )bool {return _dgde [_ddg ]._bc < _dgde [_abe ]._bc });
|
|
return _dgde ;};func _eca (_bce []*matchedIndex ,_cba [][]int )[]*matchedIndex {_adc :=[]*matchedIndex {};for _ ,_gcbc :=range _bce {_abc ,_agd :=_bdg (_gcbc ,_cba );if _abc {_ega :=_bbc (_gcbc ,_agd );_adc =append (_adc ,_ega ...);}else {_adc =append (_adc ,_gcbc );
|
|
};};return _adc ;};type replacement struct{_gc string ;_ed float64 ;_bc int ;};func _bdg (_adae *matchedIndex ,_caead [][]int )(bool ,[][]int ){_bbba :=[][]int {};for _ ,_bcfa :=range _caead {if _adae ._aadc < _bcfa [0]&&_adae ._daa > _bcfa [1]{_bbba =append (_bbba ,_bcfa );
|
|
};};return len (_bbba )> 0,_bbba ;};func _ccf (_fag *_bf .ContentStreamOperation ,_eab _c .PdfObject ,_dge []localSpanMarks )error {var _gae *_c .PdfObjectArray ;_fffb ,_gag :=_acd (_dge );if len (_gag )==1{_cae :=_gag [0];_fbf :=_fffb [_cae ];if len (_fbf )==1{_cga :=_fbf [0];
|
|
_cfe :=_cga ._fbfd ;_dbf :=_gge (_cfe );_gcg ,_cfa :=_dfd (_eab ,_dbf );if _cfa !=nil {return _cfa ;};_ge ,_cfa :=_cfd (_cga ,_cfe ,_dbf ,_gcg ,_cae );if _cfa !=nil {return _cfa ;};_gae =_c .MakeArray (_ge ...);}else {_ba :=_fbf [0]._fbfd ;_bgf :=_gge (_ba );
|
|
_dbb ,_ffg :=_dfd (_eab ,_bgf );if _ffg !=nil {return _ffg ;};_dda ,_ffg :=_efa (_dbb ,_fbf );if _ffg !=nil {return _ffg ;};_cff :=_cdc (_dda );_aaea :=_cfae (_dbb ,_cff ,_bgf );_gae =_c .MakeArray (_aaea ...);};}else if len (_gag )> 1{_bbd :=_dge [0];
|
|
_bgg :=_bbd ._fbfd ;_ ,_cgg :=_ef (_bgg );_cccg :=_bgg .Elements ()[_cgg ];_dgd :=_cccg .Font ;_fge ,_ecd :=_dfd (_eab ,_dgd );if _ecd !=nil {return _ecd ;};_age ,_ecd :=_efa (_fge ,_dge );if _ecd !=nil {return _ecd ;};_gfc :=_cdc (_age );_ccb :=_cfae (_fge ,_gfc ,_dgd );
|
|
_gae =_c .MakeArray (_ccb ...);};_fag .Params [0]=_gae ;_fag .Operand ="\u0054\u004a";return nil ;};type matchedIndex struct{_aadc int ;_daa int ;_fcda string ;};func _cfae (_cca string ,_ffb []replacement ,_dgc *_dc .PdfFont )[]_c .PdfObject {_ccdcd :=[]_c .PdfObject {};
|
|
_ffcg :=0;_bee :=_cca ;for _da ,_fage :=range _ffb {_efga :=_fage ._bc ;_faf :=_fage ._ed ;_gbdc :=_fage ._gc ;_gee :=_c .MakeFloat (_faf );if _ffcg > _efga ||_efga ==-1{continue ;};_ddgb :=_cca [_ffcg :_efga ];_dcdb :=_accc (_ddgb ,_dgc );_egc :=_c .MakeStringFromBytes (_dcdb );
|
|
_ccdcd =append (_ccdcd ,_egc );_ccdcd =append (_ccdcd ,_gee );_gdc :=_efga +len (_gbdc );_bee =_cca [_gdc :];_ffcg =_gdc ;if _da ==len (_ffb )-1{_dcdb =_accc (_bee ,_dgc );_egc =_c .MakeStringFromBytes (_dcdb );_ccdcd =append (_ccdcd ,_egc );};};return _ccdcd ;
|
|
};func _cccb (_bgga *_b .TextMarkArray )string {_eeae :="";for _ ,_dagd :=range _bgga .Elements (){_eeae +=_dagd .Text ;};return _eeae ;};func _ggf (_fbgg *targetMap ,_daab []int ){var _eeec [][]int ;for _cbe ,_fagee :=range _fbgg ._cgef {if _gcgc (_cbe ,_daab ){continue ;
|
|
};_eeec =append (_eeec ,_fagee );};_fbgg ._cgef =_eeec ;};func _efa (_ccfc string ,_fec []localSpanMarks )([]placeHolders ,error ){_aef :="";_ggef :=[]placeHolders {};for _cged ,_eff :=range _fec {_fgga :=_eff ._fbfd ;_eea :=_eff ._eddb ;_decdb :=_cccb (_fgga );
|
|
_faef ,_eee :=_bgfg (_fgga );if _eee !=nil {return nil ,_eee ;};if _decdb !=_aef {var _afff []int ;if _cged ==0&&_eea !=_decdb {_aab :=_dd .Index (_ccfc ,_decdb );_afff =[]int {_aab };}else if _cged ==len (_fec )-1{_cgdg :=_dd .LastIndex (_ccfc ,_decdb );
|
|
_afff =[]int {_cgdg };}else {_afff =_gea (_ccfc ,_decdb );};_aee :=placeHolders {_ga :_afff ,_ag :_decdb ,_gad :_faef };_ggef =append (_ggef ,_aee );};_aef =_decdb ;};return _ggef ,nil ;};func _bfcg (_bede RedactionTerm )(*regexMatcher ,error ){return ®exMatcher {_geee :_bede },nil };
|
|
|
|
|
|
// RedactRectanglePropsNew return a new pointer to a default RectangleProps object.
|
|
func RedactRectanglePropsNew ()*RectangleProps {return &RectangleProps {FillColor :_eb .ColorBlack ,BorderWidth :0.0,FillOpacity :1.0};};type targetMap struct{_daae string ;_cgef [][]int ;};func _dfd (_gcbfe _c .PdfObject ,_dbe *_dc .PdfFont )(string ,error ){_gagf ,_ceg :=_c .GetStringBytes (_gcbfe );
|
|
if !_ceg {return "",_c .ErrTypeError ;};_baa :=_dbe .BytesToCharcodes (_gagf );_efb ,_bca ,_eeeb :=_dbe .CharcodesToStrings (_baa );if _eeeb > 0{_gf .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",_bca ,_eeeb );
|
|
};_fgc :=_dd .Join (_efb ,"");return _fgc ,nil ;};
|
|
|
|
// Write writes the content of `re.creator` to writer of type io.Writer interface.
|
|
func (_gced *Redactor )Write (writer _g .Writer )error {return _gced ._ecb .Write (writer )};func _bbc (_cfg *matchedIndex ,_cef [][]int )[]*matchedIndex {_ccdg :=[]*matchedIndex {};_eac :=_cfg ._aadc ;_cgb :=_eac ;_ggde :=_cfg ._fcda ;_dgg :=0;for _ ,_eggf :=range _cef {_fafd :=_eggf [0]-_eac ;
|
|
if _dgg >=_fafd {continue ;};_aecc :=_ggde [_dgg :_fafd ];_deec :=&matchedIndex {_fcda :_aecc ,_aadc :_cgb ,_daa :_eggf [0]};if len (_dd .TrimSpace (_aecc ))!=0{_ccdg =append (_ccdg ,_deec );};_dgg =_eggf [1]-_eac ;_cgb =_eac +_dgg ;};_cbgd :=_ggde [_dgg :];
|
|
_fdc :=&matchedIndex {_fcda :_cbgd ,_aadc :_cgb ,_daa :_cfg ._daa };if len (_dd .TrimSpace (_cbgd ))!=0{_ccdg =append (_ccdg ,_fdc );};return _ccdg ;};
|
|
|
|
// WriteToFile writes the redacted document to file specified by `outputPath`.
|
|
func (_efbg *Redactor )WriteToFile (outputPath string )error {if _gcc :=_efbg ._ecb .WriteToFile (outputPath );_gcc !=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 _bgfg (_ffbg *_b .TextMarkArray )(float64 ,error ){_ddde ,_ffec :=_ffbg .BBox ();if !_ffec {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",_ffbg );
|
|
};_acf :=_ae (_ffbg );_bcf :=0.0;_ ,_gbgc :=_ef (_ffbg );_gef :=_ffbg .Elements ()[_gbgc ];_dgdd :=_gef .Font ;if _acf > 0{_bcf =_aae (_dgdd ,_gef );};_dac :=(_ddde .Urx -_ddde .Llx );_dac =_dac +_bcf *float64 (_acf );Tj :=_fde (_dac ,_gef .FontSize ,_gef .Th );
|
|
return Tj ,nil ;};func _degc (_acb *_b .TextMarkArray ,_bda int ,_eccf int )int {_faae :=_acb .Elements ();_abac :=_bda -1;_acddg :=_bda +1;_cbea :=-1;if _abac >=0{_fgfd :=_faae [_abac ];_bde :=_fgfd .ObjString ;_gfdd :=len (_bde );_ddf :=_fgfd .Index ;
|
|
if _ddf +1< _gfdd {_cbea =_abac ;return _cbea ;};};if _acddg < len (_faae ){_ebgb :=_faae [_acddg ];_acddb :=_ebgb .ObjString ;if _acddb [0]!=_ebgb .Text {_cbea =_acddg ;return _cbea ;};};return _cbea ;}; |