aboutsummaryrefslogtreecommitdiff
path: root/unipdf/redactor/redactor.go
blob: a925968237884b90d01c1c778cda9603d334ad97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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 &regexMatcher {_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 ;};