diff options
Diffstat (limited to 'unipdf/redactor')
| -rw-r--r-- | unipdf/redactor/redactor.go | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/unipdf/redactor/redactor.go b/unipdf/redactor/redactor.go new file mode 100644 index 0000000..a925968 --- /dev/null +++ b/unipdf/redactor/redactor.go @@ -0,0 +1,124 @@ +// +// 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 (_a "errors";_e "fmt";_ab "github.com/unidoc/unipdf/v4/common";_be "github.com/unidoc/unipdf/v4/contentstream";_acc "github.com/unidoc/unipdf/v4/core";_g "github.com/unidoc/unipdf/v4/creator";_ed "github.com/unidoc/unipdf/v4/extractor"; +_ac "github.com/unidoc/unipdf/v4/model";_f "io";_ef "regexp";_ag "slices";_age "sort";_ad "strings";);func _fadf (_aaaf ,_cbab string )[]int {if len (_cbab )==0{return nil ;};var _ddbf []int ;for _bef :=0;_bef < len (_aaaf );{_dce :=_ad .Index (_aaaf [_bef :],_cbab ); +if _dce < 0{return _ddbf ;};_ddbf =append (_ddbf ,_bef +_dce );_bef +=_dce +len (_cbab );};return _ddbf ;};func _dbb (_ffgd []placeHolders )[]replacement {_aagg :=[]replacement {};for _ ,_dga :=range _ffgd {_bedf :=_dga ._bf ;_eccb :=_dga ._c ;_ebg :=_dga ._gd ; +for _ ,_caab :=range _bedf {_dcbg :=replacement {_fa :_eccb ,_d :_ebg ,_cc :_caab };_aagg =append (_aagg ,_dcbg );};};_age .Slice (_aagg ,func (_dbdb ,_dcba int )bool {return _aagg [_dbdb ]._cc < _aagg [_dcba ]._cc });return _aagg ;};func _gea (_baf string ,_bcf []replacement ,_eae *_ac .PdfFont )[]_acc .PdfObject {_acfeb :=[]_acc .PdfObject {}; +_efg :=0;_dcae :=_baf ;for _eagf ,_afb :=range _bcf {_dcg :=_afb ._cc ;_fac :=_afb ._d ;_egg :=_afb ._fa ;_cgc :=_acc .MakeFloat (_fac );if _efg > _dcg ||_dcg ==-1{continue ;};_bgb :=_baf [_efg :_dcg ];_gefd :=_fec (_bgb ,_eae );_abbd :=_acc .MakeStringFromBytes (_gefd ); +_acfeb =append (_acfeb ,_abbd );_acfeb =append (_acfeb ,_cgc );_aee :=_dcg +len (_egg );_dcae =_baf [_aee :];_efg =_aee ;if _eagf ==len (_bcf )-1{_gefd =_fec (_dcae ,_eae );_abbd =_acc .MakeStringFromBytes (_gefd );_acfeb =append (_acfeb ,_abbd );};};return _acfeb ; +};func _aga (_eg *_ed .TextMarkArray )*_ac .PdfFont {_ ,_da :=_cae (_eg );_cad :=_eg .Elements ()[_da ];_dbcc :=_cad .Font ;return _dbcc ;}; + +// Redactor represents a Redactor object. +type Redactor struct{_cagb *_ac .PdfReader ;_bgc *RedactionOptions ;_fdgg *_g .Creator ;_fadb *RectangleProps ;_cbb []RedactionTerm ;};func _dgce (_gdbc []int ,_eec *_ed .TextMarkArray ,_aggc string )(*_ed .TextMarkArray ,matchedBBox ,error ){_gad :=matchedBBox {}; +_caag :=_gdbc [0];_aea :=_gdbc [1];_aeff :=len (_aggc )-len (_ad .TrimLeft (_aggc ,"\u0020"));_daee :=len (_aggc )-len (_ad .TrimRight (_aggc ,"\u0020\u000a"));_caag =_caag +_aeff ;_aea =_aea -_daee ;_aggc =_ad .Trim (_aggc ,"\u0020\u000a");_bad ,_agc :=_eec .RangeOffset (_caag ,_aea ); +if _agc !=nil {return nil ,_gad ,_agc ;};_bcfc ,_agce :=_bad .BBox ();if !_agce {return nil ,_gad ,_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",_bad ); +};_gad =matchedBBox {_fca :_aggc ,_gdaf :_bcfc };return _bad ,_gad ,nil ;};func _gfg (_gacc []*targetMap ){for _ddgg ,_gagf :=range _gacc {for _cbeee ,_cfdf :=range _gacc {if _ddgg !=_cbeee {_aedab ,_beadea :=_cebe (*_gagf ,*_cfdf );if _aedab {_dfge (_cfdf ,_beadea ); +};};};};};func _acb (_fae *_be .ContentStreamOperations ,_gda map[_acc .PdfObject ][]localSpanMarks )error {for _eb ,_acf :=range _gda {if _eb ==nil {continue ;};_adg ,_gg ,_bc :=_bff (_fae ,_eb );if !_bc {_ab .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",_eb ,_fae ); +return nil ;};if _adg .Operand =="\u0054\u006a"{_ff :=_fda (_adg ,_eb ,_acf );if _ff !=nil {return _ff ;};}else if _adg .Operand =="\u0054\u004a"{_fc :=_bd (_adg ,_eb ,_acf );if _fc !=nil {return _fc ;};}else if _adg .Operand =="\u0027"||_adg .Operand =="\u0022"{_fe :=_ea (_fae ,_adg .Operand ,_gg ); +if _fe !=nil {return _fe ;};_fe =_fda (_adg ,_eb ,_acf );if _fe !=nil {return _fe ;};};};return nil ;}; + +// Redact executes the redact operation on a pdf file and updates the content streams of all pages of the file. +func (_aac *Redactor )Redact ()error {_bgdf ,_gba :=_aac ._cagb .GetNumPages ();if _gba !=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"); +};if _aac ._bgc .UseStandardPatterns {for _ ,_dbca :=range StandardRegexPatterns {_gab ,_gde :=_ef .Compile (_dbca );if _gde !=nil {return _gde ;};_aac ._cbb =append (_aac ._cbb ,RedactionTerm {Pattern :_gab });};};_afdd :=_aac ._fadb .FillColor ;_gce :=_aac ._fadb .BorderWidth ; +_gdb :=_aac ._fadb .FillOpacity ;for _ggd :=1;_ggd <=_bgdf ;_ggd ++{_eaa ,_ggb :=_aac ._cagb .GetPage (_ggd );if _ggb !=nil {return _ggb ;};_bbd ,_ggb :=_ed .New (_eaa );if _ggb !=nil {return _ggb ;};_fbce ,_ ,_ ,_ggb :=_bbd .ExtractPageText ();if _ggb !=nil {return _ggb ; +};_bfd :=_fbce .GetContentStreamOps ();_cdag ,_fbf ,_ggb :=_aac .redactPage (_bfd ,_eaa .Resources );if _fbf ==nil {_ab .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"); +_fbf =_bfd ;};_feaf :=_be .ContentStreamOperation {Operand :"\u006e"};*_fbf =append (*_fbf ,&_feaf );_eaa .SetContentStreams ([]string {_fbf .String ()},_acc .NewFlateEncoder ());if _ggb !=nil {return _ggb ;};_gbb ,_ggb :=_eaa .GetMediaBox ();if _ggb !=nil {return _ggb ; +};if _eaa .MediaBox ==nil {_eaa .MediaBox =_gbb ;};if _dbf :=_aac ._fdgg .AddPage (_eaa );_dbf !=nil {return _dbf ;};_age .Slice (_cdag ,func (_dbdd ,_bfc int )bool {return _cdag [_dbdd ]._fca < _cdag [_bfc ]._fca });_dfa :=_gbb .Ury ;for _ ,_efe :=range _cdag {_fddg :=_efe ._gdaf ; +_bbdf :=_aac ._fdgg .NewRectangle (_fddg .Llx ,_dfa -_fddg .Lly ,_fddg .Urx -_fddg .Llx ,-(_fddg .Ury -_fddg .Lly ));_bbdf .SetFillColor (_afdd );_bbdf .SetBorderWidth (_gce );_bbdf .SetFillOpacity (_gdb );if _bfg :=_aac ._fdgg .Draw (_bbdf );_bfg !=nil {return nil ; +};};};_aac ._fdgg .SetOutlineTree (_aac ._cagb .GetOutlineTree ());return nil ;};type localSpanMarks struct{_dgaf *_ed .TextMarkArray ;_dbac int ;_baaf string ;}; + +// RectangleProps defines properties of the redaction rectangle to be drawn. +type RectangleProps struct{FillColor _g .Color ;BorderWidth float64 ;FillOpacity float64 ;};type targetMap struct{_gcfe string ;_aeg [][]int ;};func _ea (_abb *_be .ContentStreamOperations ,_dd string ,_fad int )error {_bb :=_be .ContentStreamOperations {}; +var _ca _be .ContentStreamOperation ;for _db ,_ae :=range *_abb {if _db ==_fad {if _dd =="\u0027"{_gdag :=_be .ContentStreamOperation {Operand :"\u0054\u002a"};_bb =append (_bb ,&_gdag );_ca .Params =_ae .Params ;_ca .Operand ="\u0054\u006a";_bb =append (_bb ,&_ca ); +}else if _dd =="\u0022"{_efa :=_ae .Params [:2];Tc ,Tw :=_efa [0],_efa [1];_acbg :=_be .ContentStreamOperation {Params :[]_acc .PdfObject {Tc },Operand :"\u0054\u0063"};_bb =append (_bb ,&_acbg );_acbg =_be .ContentStreamOperation {Params :[]_acc .PdfObject {Tw },Operand :"\u0054\u0077"}; +_bb =append (_bb ,&_acbg );_ca .Params =[]_acc .PdfObject {_ae .Params [2]};_ca .Operand ="\u0054\u006a";_bb =append (_bb ,&_ca );};};_bb =append (_bb ,_ae );};*_abb =_bb ;return nil ;}; + +// WriteToFile writes the redacted document to file specified by `outputPath`. +func (_ccb *Redactor )WriteToFile (outputPath string )error {if _cfb :=_ccb ._fdgg .WriteToFile (outputPath );_cfb !=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 _gebb (_gaf ,_gag ,_fbg float64 )float64 {_fbg =_fbg /100;_agg :=(-1000*_gaf )/(_gag *_fbg );return _agg ;};func (_gdda *Redactor )redactPage (_cabf *_be .ContentStreamOperations ,_gead *_ac .PdfPageResources )([]matchedBBox ,*_be .ContentStreamOperations ,error ){_dbaf ,_agab :=_ed .NewFromContents (_cabf .String (),_gead ); +if _agab !=nil {return nil ,nil ,_agab ;};_bedg ,_ ,_ ,_agab :=_dbaf .ExtractPageText ();if _agab !=nil {return nil ,nil ,_agab ;};_cabf =_bedg .GetContentStreamOps ();_bac :=_bedg .Marks ();_fcf :=_bedg .Text ();_fcf ,_dcee :=_befb (_fcf );_dfdgb :=[]matchedBBox {}; +_cbd :=make (map[_acc .PdfObject ][]localSpanMarks );_eca :=[]*targetMap {};_addg :=_gdda ._bgc .Terms ;if _gdda ._bgc .UseStandardPatterns {_addg =append (_addg ,_gdda ._cbb ...);};for _ ,_ede :=range _addg {_dece ,_cgf :=_abc (_ede );if _cgf !=nil {return nil ,nil ,_cgf ; +};_cdf ,_cgf :=_dece .match (_fcf );if _cgf !=nil {return nil ,nil ,_cgf ;};_cdf =_faf (_cdf ,_dcee );_gfa :=_gfbg (_cdf );_eca =append (_eca ,_gfa ...);};_gfg (_eca );for _ ,_bgea :=range _eca {_agd :=_bgea ._gcfe ;_cde :=_bgea ._aeg ;_ebd :=[]matchedBBox {}; +for _ ,_cee :=range _cde {_gdbd ,_gcg ,_bba :=_dgce (_cee ,_bac ,_agd );if _bba !=nil {return nil ,nil ,_bba ;};_fgd :=_afa (_gdbd );for _gfb ,_cbba :=range _fgd {_agdb :=localSpanMarks {_dgaf :_cbba ,_dbac :_gfb ,_baaf :_agd };_dcca ,_ :=_cae (_cbba ); +if _aegb ,_cdae :=_cbd [_dcca ];_cdae {_cbd [_dcca ]=append (_aegb ,_agdb );}else {_cbd [_dcca ]=[]localSpanMarks {_agdb };};};_ebd =append (_ebd ,_gcg );};_dfdgb =append (_dfdgb ,_ebd ...);};_agab =_acb (_cabf ,_cbd );if _agab !=nil {return nil ,nil ,_agab ; +};return _dfdgb ,_cabf ,nil ;};func _faf (_dfgd []*matchedIndex ,_ecd [][]int )[]*matchedIndex {_eaf :=[]*matchedIndex {};for _ ,_fge :=range _dfgd {_bcda ,_bdc :=_bbcc (_fge ,_ecd );if _bcda {_dbde :=_ggdf (_fge ,_bdc );_eaf =append (_eaf ,_dbde ...); +}else {_eaf =append (_eaf ,_fge );};};return _eaf ;};func _ee (_efb *_ed .TextMarkArray )int {_fd :=0;_edc :=_efb .Elements ();if _edc [0].Text =="\u0020"{_fd ++;};if _edc [_efb .Len ()-1].Text =="\u0020"{_fd ++;};return _fd ;};func _ggdf (_dcgg *matchedIndex ,_cfe [][]int )[]*matchedIndex {_bacf :=[]*matchedIndex {}; +_efbg :=_dcgg ._cdad ;_defa :=_efbg ;_cce :=_dcgg ._ecf ;_cbdc :=0;for _ ,_ebe :=range _cfe {_egb :=_ebe [0]-_efbg ;if _cbdc >=_egb {continue ;};_adaa :=_cce [_cbdc :_egb ];_gaaa :=&matchedIndex {_ecf :_adaa ,_cdad :_defa ,_fdage :_ebe [0]};if len (_ad .TrimSpace (_adaa ))!=0{_bacf =append (_bacf ,_gaaa ); +};_cbdc =_ebe [1]-_efbg ;_defa =_efbg +_cbdc ;};_ffgc :=_cce [_cbdc :];_gdc :=&matchedIndex {_ecf :_ffgc ,_cdad :_defa ,_fdage :_dcgg ._fdage };if len (_ad .TrimSpace (_ffgc ))!=0{_bacf =append (_bacf ,_gdc );};return _bacf ;};func _afc (_edg *_ed .TextMarkArray ,_efgd int )int {_bgdb :=_edg .Elements (); +_eeg :=_efgd -1;_bcd :=_efgd +1;_cgb :=-1;if _eeg >=0{_geg :=_bgdb [_eeg ];_dcge :=_geg .ObjString ;_dfga :=len (_dcge );_gcab :=_geg .Index ;if _gcab +1< _dfga {_cgb =_eeg ;return _cgb ;};};if _bcd < len (_bgdb ){_def :=_bgdb [_bcd ];_cdg :=_def .ObjString ; +if _cdg [0]!=_def .Text {_cgb =_bcd ;return _cgb ;};};return _cgb ;}; + +// New instantiates a Redactor object with given PdfReader and `regex` pattern. +func New (reader *_ac .PdfReader ,opts *RedactionOptions ,rectProps *RectangleProps )*Redactor {if rectProps ==nil {rectProps =RedactRectanglePropsNew ();};return &Redactor {_cagb :reader ,_bgc :opts ,_fdgg :_g .New (),_fadb :rectProps };};type placeHolders struct{_bf []int ; +_c string ;_gd float64 ;};func _fda (_bgd *_be .ContentStreamOperation ,_dcab _acc .PdfObject ,_agf []localSpanMarks )error {var _bfe *_acc .PdfObjectArray ;_fdd ,_fdag :=_dfc (_agf );if len (_fdag )==1{_cfd :=_fdag [0];_bed :=_fdd [_cfd ];if len (_bed )==1{_ffe :=_bed [0]; +_cge :=_ffe ._dgaf ;_agfa :=_aga (_cge );_fgf ,_acg :=_cea (_dcab ,_agfa );if _acg !=nil {return _acg ;};_gaa ,_acg :=_acfe (_ffe ,_cge ,_agfa ,_fgf ,_cfd );if _acg !=nil {return _acg ;};_bfe =_acc .MakeArray (_gaa ...);}else {_gac :=_bed [0]._dgaf ;_bgdd :=_aga (_gac ); +_ada ,_caf :=_cea (_dcab ,_bgdd );if _caf !=nil {return _caf ;};_ddd ,_caf :=_ggf (_ada ,_bed );if _caf !=nil {return _caf ;};_fab :=_dbb (_ddd );_gbdg :=_gea (_ada ,_fab ,_bgdd );_bfe =_acc .MakeArray (_gbdg ...);};}else if len (_fdag )> 1{_abab :=_agf [0]; +_egd :=_abab ._dgaf ;_ ,_aae :=_cae (_egd );_ebb :=_egd .Elements ()[_aae ];_fdb :=_ebb .Font ;_dfg ,_gef :=_cea (_dcab ,_fdb );if _gef !=nil {return _gef ;};_fdg ,_gef :=_ggf (_dfg ,_agf );if _gef !=nil {return _gef ;};_ceg :=_dbb (_fdg );_dbd :=_gea (_dfg ,_ceg ,_fdb ); +_bfe =_acc .MakeArray (_dbd ...);};_bgd .Params [0]=_bfe ;_bgd .Operand ="\u0054\u004a";return nil ;};type matchedIndex struct{_cdad int ;_fdage int ;_ecf string ;};type replacement struct{_fa string ;_d float64 ;_cc int ;};func _cae (_ge *_ed .TextMarkArray )(_acc .PdfObject ,int ){var _aba _acc .PdfObject ; +_ddg :=-1;for _ade ,_aed :=range _ge .Elements (){_aba =_aed .DirectObject ;_ddg =_ade ;if _aba !=nil {break ;};};return _aba ,_ddg ;};func _bd (_cb *_be .ContentStreamOperation ,_fff _acc .PdfObject ,_fef []localSpanMarks )error {_cf ,_ga :=_acc .GetArray (_cb .Params [0]); +_df :=[]_acc .PdfObject {};if !_ga {_ab .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",_cb );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",_cb ); +};_ba ,_dg :=_dfc (_fef );if len (_dg )==1{_cg :=_dg [0];_dc :=_ba [_cg ];if len (_dc )==1{_fb :=_dc [0];_baa :=_fb ._dgaf ;_eea :=_aga (_baa );_ec ,_cbe :=_cea (_fff ,_eea );if _cbe !=nil {return _cbe ;};_caee ,_cbe :=_acfe (_fb ,_baa ,_eea ,_ec ,_cg ); +if _cbe !=nil {return _cbe ;};for _ ,_ecc :=range _cf .Elements (){if _ecc ==_fff {_df =append (_df ,_caee ...);}else {_df =append (_df ,_ecc );};};}else {_dca :=_dc [0]._dgaf ;_gb :=_aga (_dca );_cba ,_ggc :=_cea (_fff ,_gb );if _ggc !=nil {return _ggc ; +};_beg ,_ggc :=_ggf (_cba ,_dc );if _ggc !=nil {return _ggc ;};_gae :=_dbb (_beg );_dbe :=_gea (_cba ,_gae ,_gb );for _ ,_gc :=range _cf .Elements (){if _gc ==_fff {_df =append (_df ,_dbe ...);}else {_df =append (_df ,_gc );};};};_cb .Params [0]=_acc .MakeArray (_df ...); +}else if len (_dg )> 1{_ffg :=_fef [0];_ccc :=_ffg ._dgaf ;_ ,_aa :=_cae (_ccc );_adc :=_ccc .Elements ()[_aa ];_ace :=_adc .Font ;_cd ,_aeda :=_cea (_fff ,_ace );if _aeda !=nil {return _aeda ;};_cbee ,_aeda :=_ggf (_cd ,_fef );if _aeda !=nil {return _aeda ; +};_gbd :=_dbb (_cbee );_bg :=_gea (_cd ,_gbd ,_ace );for _ ,_cca :=range _cf .Elements (){if _cca ==_fff {_df =append (_df ,_bg ...);}else {_df =append (_df ,_cca );};};_cb .Params [0]=_acc .MakeArray (_df ...);};return nil ;};func (_gbdd *regexMatcher )match (_ffb string )([]*matchedIndex ,error ){_acgf :=_gbdd ._bbdb .Pattern ; +if _acgf ==nil {return nil ,_a .New ("\u006e\u006f\u0020\u0070at\u0074\u0065\u0072\u006e\u0020\u0063\u006f\u006d\u0070\u0069\u006c\u0065\u0064");};var (_cgbe =_acgf .FindAllStringIndex (_ffb ,-1);_cccb []*matchedIndex ;);for _ ,_gaac :=range _cgbe {_cccb =append (_cccb ,&matchedIndex {_cdad :_gaac [0],_fdage :_gaac [1],_ecf :_ffb [_gaac [0]:_gaac [1]]}); +};return _cccb ,nil ;};func _cac (_afd *_ed .TextMarkArray )(float64 ,error ){_aagf ,_ded :=_afd .BBox ();if !_ded {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",_afd ); +};_acfg :=_ee (_afd );_efc :=0.0;_ ,_aabg :=_cae (_afd );_fbed :=_afd .Elements ()[_aabg ];_afg :=_fbed .Font ;if _acfg > 0{_efc =_af (_afg ,_fbed );};_ebbd :=(_aagf .Urx -_aagf .Llx );_ebbd =_ebbd +_efc *float64 (_acfg );Tj :=_gebb (_ebbd ,_fbed .FontSize ,_fbed .Th ); +return Tj ,nil ;};func _bff (_agef *_be .ContentStreamOperations ,PdfObj _acc .PdfObject )(*_be .ContentStreamOperation ,int ,bool ){for _cfc ,_cab :=range *_agef {_bead :=_cab .Operand ;if _bead =="\u0054\u006a"{_dfdg :=_acc .TraceToDirectObject (_cab .Params [0]); +if _dfdg ==PdfObj {return _cab ,_cfc ,true ;};}else if _bead =="\u0054\u004a"{_fdf ,_fea :=_acc .GetArray (_cab .Params [0]);if !_fea {return nil ,_cfc ,_fea ;};for _ ,_aaf :=range _fdf .Elements (){if _aaf ==PdfObj {return _cab ,_cfc ,true ;};};}else if _bead =="\u0022"{_ddge :=_acc .TraceToDirectObject (_cab .Params [2]); +if _ddge ==PdfObj {return _cab ,_cfc ,true ;};}else if _bead =="\u0027"{_cag :=_acc .TraceToDirectObject (_cab .Params [0]);if _cag ==PdfObj {return _cab ,_cfc ,true ;};};};return nil ,-1,false ;}; + +// Write writes the content of `re.creator` to writer of type io.Writer interface. +func (_gfd *Redactor )Write (writer _f .Writer )error {return _gfd ._fdgg .Write (writer )};func _afa (_fdfg *_ed .TextMarkArray )[]*_ed .TextMarkArray {_aad :=_fdfg .Elements ();_cdgb :=len (_aad );var _faa _acc .PdfObject ;_gdgd :=[]*_ed .TextMarkArray {}; +_cgfe :=&_ed .TextMarkArray {};_abbc :=-1;for _fbcc ,_bfaa :=range _aad {_cffe :=_bfaa .DirectObject ;_abbc =_bfaa .Index ;if _cffe ==nil {_aabge :=_afc (_fdfg ,_fbcc );if _faa !=nil {if _aabge ==-1||_aabge > _fbcc {_gdgd =append (_gdgd ,_cgfe );_cgfe =&_ed .TextMarkArray {}; +};};}else if _faa ==nil {if _abbc ==0&&_fbcc > 0{_gdgd =append (_gdgd ,_cgfe );_cgfe =&_ed .TextMarkArray {};};}else {if _cffe !=_faa {_gdgd =append (_gdgd ,_cgfe );_cgfe =&_ed .TextMarkArray {};};};_faa =_cffe ;_cgfe .Append (_bfaa );if _fbcc ==(_cdgb -1){_gdgd =append (_gdgd ,_cgfe ); +};};return _gdgd ;};func _dfc (_eada []localSpanMarks )(map[string ][]localSpanMarks ,[]string ){_aagd :=make (map[string ][]localSpanMarks );_ecb :=[]string {};for _ ,_gcb :=range _eada {_dbc :=_gcb ._baaf ;if _caa ,_acef :=_aagd [_dbc ];_acef {_aagd [_dbc ]=append (_caa ,_gcb ); +}else {_aagd [_dbc ]=[]localSpanMarks {_gcb };_ecb =append (_ecb ,_dbc );};};return _aagd ,_ecb ;};type regexMatcher struct{_bbdb RedactionTerm };func _bbcc (_bdcd *matchedIndex ,_edf [][]int )(bool ,[][]int ){_bafb :=[][]int {};for _ ,_eee :=range _edf {if _bdcd ._cdad < _eee [0]&&_bdcd ._fdage > _eee [1]{_bafb =append (_bafb ,_eee ); +};};return len (_bafb )> 0,_bafb ;};func _af (_ead *_ac .PdfFont ,_eed _ed .TextMark )float64 {_fg :=0.001;_baab :=_eed .Th /100;if _ead .Subtype ()=="\u0054\u0079\u0070e\u0033"{_fg =1;};_ebc ,_geb :=_ead .GetRuneMetrics (' ');if !_geb {_ebc ,_geb =_ead .GetCharMetrics (32); +};if !_geb {_ebc ,_ =_ac .DefaultFont ().GetRuneMetrics (' ');};_gca :=_fg *((_ebc .Wx *_eed .FontSize +_eed .Tc +_eed .Tw )/_baab );return _gca ;};func _acfe (_eeb localSpanMarks ,_aab *_ed .TextMarkArray ,_bea *_ac .PdfFont ,_dcc ,_dfd string )([]_acc .PdfObject ,error ){_abad :=_fgc (_aab ); +Tj ,_gdg :=_cac (_aab );if _gdg !=nil {return nil ,_gdg ;};_fbe :=len (_dcc );_cgg :=len (_abad );_gfc :=-1;_bbc :=_acc .MakeFloat (Tj );if _abad !=_dfd {_ffc :=_eeb ._dbac ;if _ffc ==0{_gfc =_ad .LastIndex (_dcc ,_abad );}else {_gfc =_ad .Index (_dcc ,_abad ); +};}else {_gfc =_ad .Index (_dcc ,_abad );};_gdf :=_gfc +_cgg ;_cbaf :=[]_acc .PdfObject {};if _gfc ==0&&_gdf ==_fbe {_cbaf =append (_cbaf ,_bbc );}else if _gfc ==0&&_gdf < _fbe {_bfa :=_fec (_dcc [_gdf :],_bea );_dcd :=_acc .MakeStringFromBytes (_bfa ); +_cbaf =append (_cbaf ,_bbc ,_dcd );}else if _gfc > 0&&_gdf >=_fbe {_gcf :=_fec (_dcc [:_gfc ],_bea );_eebb :=_acc .MakeStringFromBytes (_gcf );_cbaf =append (_cbaf ,_eebb ,_bbc );}else if _gfc > 0&&_gdf < _fbe {_fgb :=_fec (_dcc [:_gfc ],_bea );_cff :=_fec (_dcc [_gdf :],_bea ); +_ggcd :=_acc .MakeStringFromBytes (_fgb );_bcb :=_acc .MakeString (string (_cff ));_cbaf =append (_cbaf ,_ggcd ,_bbc ,_bcb );};return _cbaf ,nil ;};func _gfbg (_bedfd []*matchedIndex )[]*targetMap {_gcba :=make (map[string ][][]int );_afe :=[]*targetMap {}; +for _ ,_cfdb :=range _bedfd {_dgee :=_cfdb ._ecf ;_fecd :=[]int {_cfdb ._cdad ,_cfdb ._fdage };if _cdgd ,_ebaf :=_gcba [_dgee ];_ebaf {_gcba [_dgee ]=append (_cdgd ,_fecd );}else {_gcba [_dgee ]=[][]int {_fecd };};};for _acbb ,_dde :=range _gcba {_bgef :=&targetMap {_gcfe :_acbb ,_aeg :_dde }; +_afe =append (_afe ,_bgef );};return _afe ;};type matchedBBox struct{_gdaf _ac .PdfRectangle ;_fca string ;}; + +// RedactionTerm holds the regexp pattern and the replacement string for the redaction process. +type RedactionTerm struct{Pattern *_ef .Regexp ;};func _abc (_egdg RedactionTerm )(*regexMatcher ,error ){return ®exMatcher {_bbdb :_egdg },nil };func _befb (_bce string )(string ,[][]int ){_bede :=_ef .MustCompile ("\u005c\u006e");_dgdf :=_bede .FindAllStringIndex (_bce ,-1); +_dgfc :=_bede .ReplaceAllString (_bce ,"\u0020");return _dgfc ,_dgdf ;};func _dfge (_cfae *targetMap ,_ceb []int ){var _acd [][]int ;for _deb ,_bafg :=range _cfae ._aeg {if _ag .Contains (_ceb ,_deb ){continue ;};_acd =append (_acd ,_bafg );};_cfae ._aeg =_acd ; +}; + +// RedactRectanglePropsNew return a new pointer to a default RectangleProps object. +func RedactRectanglePropsNew ()*RectangleProps {return &RectangleProps {FillColor :_g .ColorBlack ,BorderWidth :0.0,FillOpacity :1.0};};func _cea (_dgf _acc .PdfObject ,_agb *_ac .PdfFont )(string ,error ){_aef ,_beade :=_acc .GetStringBytes (_dgf );if !_beade {return "",_acc .ErrTypeError ; +};_fbc :=_agb .BytesToCharcodes (_aef );_eagd ,_efcd ,_abge :=_agb .CharcodesToStrings (_fbc ,"");if _abge > 0{_ab .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",_efcd ,_abge ); +};_fgg :=_ad .Join (_eagd ,"");return _fgg ,nil ;};func _fgc (_dad *_ed .TextMarkArray )string {_ccf :="";for _ ,_abaf :=range _dad .Elements (){_ccf +=_abaf .Text ;};return _ccf ;}; + +// RedactionOptions is a collection of RedactionTerm objects. +type RedactionOptions struct{Terms []RedactionTerm ;UseStandardPatterns bool ;};func _ggf (_adgb string ,_abg []localSpanMarks )([]placeHolders ,error ){_dcb :="";_ddf :=[]placeHolders {};for _fbd ,_bfed :=range _abg {_ffca :=_bfed ._dgaf ;_eag :=_bfed ._baaf ; +_dcaa :=_fgc (_ffca );_ddb ,_eba :=_cac (_ffca );if _eba !=nil {return nil ,_eba ;};if _dcaa !=_dcb {var _bbf []int ;if _fbd ==0&&_eag !=_dcaa {_add :=_ad .Index (_adgb ,_dcaa );_bbf =[]int {_add };}else if _fbd ==len (_abg )-1{_dfe :=_ad .LastIndex (_adgb ,_dcaa ); +_bbf =[]int {_dfe };}else {_bbf =_fadf (_adgb ,_dcaa );};_dba :=placeHolders {_bf :_bbf ,_c :_dcaa ,_gd :_ddb };_ddf =append (_ddf ,_dba );};_dcb =_dcaa ;};return _ddf ,nil ;};const (RegexSSN ="\u0028?\u0069\u0029\u005c\u0062\\\u0064\u007b\u0033\u007d\u002d\\\u0064{\u0032}\u002d\u005c\u0064\u007b\u0034\u007d\u005cb"; +RegexCreditCard ="\u005c\u0062\u0028?:\u005c\u0064\u005b\u0020\u002d\u005d\u002a\u003f\u0029\u007b\u0031\u0033\u002c\u0031\u0036\u007d\u005c\u0062";RegexEmail ="\u005c\u0062\u005b\u0041\u002d\u005a\u0061\u002d\u007a\u0030\u002d\u0039\u002e\u005f\u0025\u002b\u002d\u005d+\u0040\u005b\u0041\u002d\u005a\u0061\u002dz\u0030\u002d\u0039\u002e\u002d\u005d\u002b\u005c\u002e\u005b\u0041-\u005a\u0061\u002d\u007a\u005d\u007b\u0032\u002c\u007d\u005c\u0062"; +RegexPhone ="\u0028\u003f\u003a\u005c\u002b\u0031\u005b\u002d\u002e\u005c\u0073\u005d\u003f\u0029\u003f\u005c\u0028\u003f\\\u0064\u007b\u0033\u007d\u005c\u0029\u003f[\u002d\u002e\u005c\u0073\u005d\u003f\u005c\u0064\u007b\u0033\u007d[\u002d\u002e\u005c\u0073\u005d\u003f\u005c\u0064\u007b\u0034\u007d"; +RegexIPv4 ="\u005c\u0062\u0028\u003f\u003a\u0028\u003f\u003a\u0032\u0035\u005b\u0030\u002d5\u005d\u007c\u0032\u005b\u0030\u002d\u0034\u005d\u005cd\u007c\u0031\u005c\u0064\u007b\u0032\u007d\u007c\u005b\u0031\u002d\u0039\u005d\u003f\\\u0064\u0029\u005c\u002e\u0029\u007b\u0033\u007d\u0028\u003f\u003a\u0032\u0035\u005b\u0030\u002d\u0035\u005d\u007c\u0032\u005b\u0030\u002d\u0034\u005d\u005c\u0064\u007c\u0031\u005cd\u007b\u0032\u007d\u007c\u005b\u0031\u002d\u0039\u005d?\u005c\u0064)\u005c\u0062"; +RegexIPv6 ="\u005c\u0062\u0028[\u0030\u002d\u0039\u0061\u002d\u0066\u0041\u002d\u0046\u005d\u007b\u0031\u002c\u0034\u007d\u003a\u0029\u007b\u0037\u007d\u005b\u0030\u002d\u0039\u0061\u002d\u0066\u0041\u002dF\u005d\u007b\u0031\u002c\u0034\u007d\u005c\u0062"; +RegexPassport ="\u005c\u0062\u005b\u0041\u002d\u005a\u0030\u002d\u0039\u005d\u007b\u0036,\u0039\u007d\u005c\u0062";RegexDriversLicense ="\u005cb\u005bA\u002d\u005a\u0030\u002d\u0039]\u007b\u0035,\u0031\u0035\u007d\u005c\u0062";RegexDate ="\u005cb\u0028\u003f\u003a\u005c\u0064\u007b\u0031,2\u007d\u005b\u002f\u002e\u002d\u005d\u005c\u0064\u007b\u0031\u002c\u0032\u007d\u005b/\u002e\u002d]\u005c\u0064\u007b2\u002c\u0034\u007d\u007c\u005c\u0064\u007b\u0034\u007d\u005b\u002d\u002f\u005d\u005c\u0064\u007b2\u007d\u005b-/\u005d\u005c\u0064{\u0032\u007d\u0029\u005c\u0062"; +RegexPostalCode ="\\\u0062\\\u0064\u007b\u0035\u007d\u0028\u003f\u003a\u002d\\\u0064\u007b\u0034\u007d)?\u005c\u0062";RegexMAC ="\u005c\u0062\u0028\u003f\u003a\u005b\u0030-\u0039\u0041\u002dF\u0061\u002d\u0066\u005d{\u0032\u007d\u005b\u003a\u002d\u005d\u0029\u007b\u0035\u007d\u005b\u0030\u002d\u0039\u0041\u002d\u0046\u0061\u002d\u0066\u005d\u007b\u0032\u007d\u005c\u0062"; +RegexBankRouting ="\u005cb\u005c\u0064\u007b\u0039\u007d\u005cb";RegexIBAN ="\u005c\u0062\u005b\u0041\u002d\u005a\u005d\u007b\u0032\u007d\u005c\u0064\u007b\u0032\u007d[\u0041-\u005a\u0030\u002d\u0039\u005d\u007b\u0031\u0031\u002c\u0033\u0030\u007d\u005c\u0062"; +RegexAWSAccessKeyID ="\\\u0062A\u004b\u0049\u0041\u005b\u0030\u002d\u0039\u0041-\u005a\u005d\u007b\u00316}\u005c\u0062";RegexAWSSecretAccessKey ="\\\u0062\u005b\u0030\u002d9a\u002dz\u0041\u002d\u005a\u002f\u002b]\u007b\u0034\u0030\u007d\u005c\u0062";RegexGoogleAPIKey ="\u005c\u0062\u0041\u0049\u007a\u0061\u005b\u0030\u002d\u0039\u0041-\u005a\u0061\u002d\u007a\u005c\u002d\u005f\u005d\u007b\u00335\u007d\u005c\u0062"; +RegexJWT ="\\b\u0065\u0079J\u005b\u0041\u002d\u005a\u0061\u002d\u007a\u0030\u002d9\u005f\u005c\u002d\u005d\u002b\u005c\u002e\u0065\u0079\u004a\u005b\u0041\u002d\u005a\u0061\u002d\u007a\u0030\u002d\u0039\u005f\u005c\u002d\u005d\u002b\u005c\u002e\u003f[\u0041-\u005a\u0061\u002d\u007a\u0030\u002d\u0039\u005f\\\u002d]\u002a\u005cb"; +RegexCardExpirationDate ="\\\u0062\u0028\u0030\u005b\u0031\u002d9\u005d\u007c\u0031\u005b\u0030\u002d2\u005d\u0029\u002f\u0028\u003f\u003a\u005cd\u007b\u0032\u007d\u007c\u005c\u0064\u007b\u0034\u007d\u0029\\\u0062";RegexSWIFTCode ="\u005cb\u005b\u0041-\u005a\u005d\u007b4\u007d\u005b\u0041\u002d\u005a\u005d\u007b2\u007d\u005b\u0041\u002d\u005a\u0030-\u0039\u005d\u007b\u0032\u007d\u0028\u005b\u0041\u002d\u005a\u0030-\u0039\u005d\u007b\u0033\u007d\u0029\u003f\u005c\u0062"; +RegexStripeAPIKey ="\u0073\u006b\u005fli\u0076\u0065\u005f\u005b\u0030\u002d\u0039\u0061\u002d\u007a\u0041\u002d\u005a\u005d\u007b\u0032\u0034\u007d";);func _fec (_gga string ,_baaa *_ac .PdfFont )[]byte {_aag ,_bge :=_baaa .StringToCharcodeBytes (_gga ); +if _bge !=0{_ab .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",_gga ,_aag ); +};return _aag ;};var StandardRegexPatterns =[]string {RegexSSN ,RegexCreditCard ,RegexEmail ,RegexPhone ,RegexIPv4 ,RegexIPv6 ,RegexPassport ,RegexDriversLicense ,RegexDate ,RegexPostalCode ,RegexMAC ,RegexBankRouting ,RegexIBAN ,RegexAWSAccessKeyID ,RegexAWSSecretAccessKey ,RegexGoogleAPIKey ,RegexJWT ,RegexCardExpirationDate ,RegexSWIFTCode ,RegexStripeAPIKey }; +func _cebe (_cec ,_abe targetMap )(bool ,[]int ){_beaf :=_ad .Contains (_cec ._gcfe ,_abe ._gcfe );var _ffgdd []int ;for _ ,_eaaf :=range _cec ._aeg {for _efga ,_cegd :=range _abe ._aeg {if _cegd [0]>=_eaaf [0]&&_cegd [1]<=_eaaf [1]{_ffgdd =append (_ffgdd ,_efga ); +};};};return _beaf ,_ffgdd ;};
\ No newline at end of file |
