mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-07 19:29:16 +08:00
101 lines
20 KiB
Go
101 lines
20 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 (_c "errors";_b "fmt";_d "github.com/unidoc/unipdf/v3/common";_bf "github.com/unidoc/unipdf/v3/contentstream";_gg "github.com/unidoc/unipdf/v3/core";_g "github.com/unidoc/unipdf/v3/creator";_ce "github.com/unidoc/unipdf/v3/extractor";
|
|
_fe "github.com/unidoc/unipdf/v3/model";_ba "io";_cc "regexp";_fc "sort";_a "strings";);
|
|
|
|
// RectangleProps defines properties of the redaction rectangle to be drawn.
|
|
type RectangleProps struct{FillColor _g .Color ;BorderWidth float64 ;FillOpacity float64 ;};
|
|
|
|
// New instantiates a Redactor object with given PdfReader and `regex` pattern.
|
|
func New (reader *_fe .PdfReader ,opts *RedactionOptions ,rectProps *RectangleProps )*Redactor {if rectProps ==nil {rectProps =RedactRectanglePropsNew ();};return &Redactor {_efgg :reader ,_bdg :opts ,_ebc :_g .New (),_fea :rectProps };};
|
|
|
|
// Redact executes the redact operation on a pdf file and updates the content streams of all pages of the file.
|
|
func (_egc *Redactor )Redact ()error {_ccec ,_baea :=_egc ._efgg .GetNumPages ();if _baea !=nil {return _b .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");
|
|
};_eba :=_egc ._fea .FillColor ;_bgb :=_egc ._fea .BorderWidth ;_faf :=_egc ._fea .FillOpacity ;for _gfdb :=1;_gfdb <=_ccec ;_gfdb ++{_gda ,_cab :=_egc ._efgg .GetPage (_gfdb );if _cab !=nil {return _cab ;};_abf ,_cab :=_ce .New (_gda );if _cab !=nil {return _cab ;
|
|
};_agf ,_ ,_ ,_cab :=_abf .ExtractPageText ();if _cab !=nil {return _cab ;};_dgf :=_agf .GetContentStreamOps ();_gcba ,_bea ,_cab :=_egc .redactPage (_dgf ,_gda .Resources );if _bea ==nil {_d .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");
|
|
_bea =_dgf ;};_gda .SetContentStreams ([]string {_bea .String ()},_gg .NewFlateEncoder ());if _cab !=nil {return _cab ;};_aeeb ,_cab :=_gda .GetMediaBox ();if _cab !=nil {return _cab ;};if _gda .MediaBox ==nil {_gda .MediaBox =_aeeb ;};if _ebgf :=_egc ._ebc .AddPage (_gda );
|
|
_ebgf !=nil {return _ebgf ;};_adg :=_aeeb .Ury ;for _ ,_eeb :=range _gcba {_gecc :=_eeb ._aeg ;_fagb :=_egc ._ebc .NewRectangle (_gecc .Llx ,_adg -_gecc .Lly ,_gecc .Urx -_gecc .Llx ,-(_gecc .Ury -_gecc .Lly ));_fagb .SetFillColor (_eba );_fagb .SetBorderWidth (_bgb );
|
|
_fagb .SetFillOpacity (_faf );if _fgga :=_egc ._ebc .Draw (_fagb );_fgga !=nil {return nil ;};};};_egc ._ebc .SetOutlineTree (_egc ._efgg .GetOutlineTree ());return nil ;};func _cbee (_dcg *_ce .TextMarkArray )*_fe .PdfFont {_ ,_cff :=_fdd (_dcg );_bbc :=_dcg .Elements ()[_cff ];
|
|
_fbcg :=_bbc .Font ;return _fbcg ;};func _gbd (_cdde *_ce .TextMarkArray )string {_eae :="";for _ ,_ceb :=range _cdde .Elements (){_eae +=_ceb .Text ;};return _eae ;};type matchedBBox struct{_aeg _fe .PdfRectangle ;_fbaa string ;};type placeHolders struct{_cb []int ;
|
|
_ae string ;_df float64 ;};
|
|
|
|
// RedactionOptions is a collection of RedactionTerm objects.
|
|
type RedactionOptions struct{Terms []RedactionTerm ;};func (_caeg *regexMatcher )match (_dad string )([]*matchedIndex ,error ){_fee :=_caeg ._dbe .Pattern ;if _fee ==nil {return nil ,_c .New ("\u006e\u006f\u0020\u0070at\u0074\u0065\u0072\u006e\u0020\u0063\u006f\u006d\u0070\u0069\u006c\u0065\u0064");
|
|
};var (_efcb =_fee .FindAllStringIndex (_dad ,-1);_bbda []*matchedIndex ;);for _ ,_ebcb :=range _efcb {_bbda =append (_bbda ,&matchedIndex {_aag :_ebcb [0],_dfcd :_ebcb [1],_afbd :_dad [_ebcb [0]:_ebcb [1]]});};return _bbda ,nil ;};func _bce (_gegf *_ce .TextMarkArray )[]*_ce .TextMarkArray {_afg :=_gegf .Elements ();
|
|
_aff :=len (_afg );var _bffd _gg .PdfObject ;_cgbdd :=[]*_ce .TextMarkArray {};_cccb :=&_ce .TextMarkArray {};_caac :=-1;for _gcgf ,_ebaf :=range _afg {_gba :=_ebaf .DirectObject ;_caac =_ebaf .Index ;if _gba ==nil {_gce :=_aade (_gegf ,_gcgf ,_caac );
|
|
if _bffd !=nil {if _gce ==-1||_gce > _gcgf {_cgbdd =append (_cgbdd ,_cccb );_cccb =&_ce .TextMarkArray {};};};}else if _gba !=nil &&_bffd ==nil {if _caac ==0&&_gcgf > 0{_cgbdd =append (_cgbdd ,_cccb );_cccb =&_ce .TextMarkArray {};};}else if _gba !=nil &&_bffd !=nil {if _gba !=_bffd {_cgbdd =append (_cgbdd ,_cccb );
|
|
_cccb =&_ce .TextMarkArray {};};};_bffd =_gba ;_cccb .Append (_ebaf );if _gcgf ==(_aff -1){_cgbdd =append (_cgbdd ,_cccb );};};return _cgbdd ;};type matchedIndex struct{_aag int ;_dfcd int ;_afbd string ;};func _caef (_agbd localSpanMarks ,_eff *_ce .TextMarkArray ,_afa *_fe .PdfFont ,_edb ,_bcg string )([]_gg .PdfObject ,error ){_fbd :=_gbd (_eff );
|
|
Tj ,_cfbf :=_gcbc (_eff );if _cfbf !=nil {return nil ,_cfbf ;};_cea :=len (_edb );_bfd :=len (_fbd );_ggb :=-1;_aca :=_gg .MakeFloat (Tj );if _fbd !=_bcg {_gfg :=_agbd ._bgg ;if _gfg ==0{_ggb =_a .LastIndex (_edb ,_fbd );}else {_ggb =_a .Index (_edb ,_fbd );
|
|
};}else {_ggb =_a .Index (_edb ,_fbd );};_ded :=_ggb +_bfd ;_ddbc :=[]_gg .PdfObject {};if _ggb ==0&&_ded ==_cea {_ddbc =append (_ddbc ,_aca );}else if _ggb ==0&&_ded < _cea {_cbc :=_deb (_edb [_ded :],_afa );_ace :=_gg .MakeStringFromBytes (_cbc );_ddbc =append (_ddbc ,_aca ,_ace );
|
|
}else if _ggb > 0&&_ded >=_cea {_ccf :=_deb (_edb [:_ggb ],_afa );_ggdc :=_gg .MakeStringFromBytes (_ccf );_ddbc =append (_ddbc ,_ggdc ,_aca );}else if _ggb > 0&&_ded < _cea {_gcg :=_deb (_edb [:_ggb ],_afa );_dfgc :=_deb (_edb [_ded :],_afa );_dcc :=_gg .MakeStringFromBytes (_gcg );
|
|
_eef :=_gg .MakeString (string (_dfgc ));_ddbc =append (_ddbc ,_dcc ,_aca ,_eef );};return _ddbc ,nil ;};func _ccg (_gac []placeHolders )[]replacement {_dbg :=[]replacement {};for _ ,_gff :=range _gac {_bfdb :=_gff ._cb ;_efgb :=_gff ._ae ;_ad :=_gff ._df ;
|
|
for _ ,_cce :=range _bfdb {_fff :=replacement {_e :_efgb ,_bb :_ad ,_bd :_cce };_dbg =append (_dbg ,_fff );};};_fc .Slice (_dbg ,func (_gfa ,_acc int )bool {return _dbg [_gfa ]._bd < _dbg [_acc ]._bd });return _dbg ;};func _cfd (_ag *_bf .ContentStreamOperation ,_dc _gg .PdfObject ,_aga []localSpanMarks )error {_aab ,_aec :=_gg .GetArray (_ag .Params [0]);
|
|
_gbba :=[]_gg .PdfObject {};if !_aec {_d .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",_ag );return _b .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",_ag );
|
|
};_gde ,_eabb :=_bfe (_aga );if len (_eabb )==1{_cbb :=_eabb [0];_aef :=_gde [_cbb ];if len (_aef )==1{_bbg :=_aef [0];_bba :=_bbg ._ecb ;_fgg :=_cbee (_bba );_fge ,_ca :=_ade (_dc ,_fgg );if _ca !=nil {return _ca ;};_fdb ,_ca :=_caef (_bbg ,_bba ,_fgg ,_fge ,_cbb );
|
|
if _ca !=nil {return _ca ;};for _ ,_aeee :=range _aab .Elements (){if _aeee ==_dc {_gbba =append (_gbba ,_fdb ...);}else {_gbba =append (_gbba ,_aeee );};};}else {_cg :=_aef [0]._ecb ;_aad :=_cbee (_cg );_bbd ,_eg :=_ade (_dc ,_aad );if _eg !=nil {return _eg ;
|
|
};_agb ,_eg :=_agg (_bbd ,_aef );if _eg !=nil {return _eg ;};_db :=_ccg (_agb );_baf :=_fddg (_bbd ,_db ,_aad );for _ ,_bdd :=range _aab .Elements (){if _bdd ==_dc {_gbba =append (_gbba ,_baf ...);}else {_gbba =append (_gbba ,_bdd );};};};_ag .Params [0]=_gg .MakeArray (_gbba ...);
|
|
}else if len (_eabb )> 1{_dfe :=_aga [0];_dd :=_dfe ._ecb ;_ ,_abe :=_fdd (_dd );_abc :=_dd .Elements ()[_abe ];_dfbb :=_abc .Font ;_ggd ,_agd :=_ade (_dc ,_dfbb );if _agd !=nil {return _agd ;};_bab ,_agd :=_agg (_ggd ,_aga );if _agd !=nil {return _agd ;
|
|
};_fda :=_ccg (_bab );_ddc :=_fddg (_ggd ,_fda ,_dfbb );for _ ,_bbgg :=range _aab .Elements (){if _bbgg ==_dc {_gbba =append (_gbba ,_ddc ...);}else {_gbba =append (_gbba ,_bbgg );};};_ag .Params [0]=_gg .MakeArray (_gbba ...);};return nil ;};func _ffe (_cddd ,_efgba string )[]int {if len (_efgba )==0{return nil ;
|
|
};var _acag []int ;for _fbcb :=0;_fbcb < len (_cddd );{_gfc :=_a .Index (_cddd [_fbcb :],_efgba );if _gfc < 0{return _acag ;};_acag =append (_acag ,_fbcb +_gfc );_fbcb +=_gfc +len (_efgba );};return _acag ;};func _adb (_cgbd *_bf .ContentStreamOperations ,PdfObj _gg .PdfObject )(*_bf .ContentStreamOperation ,int ,bool ){for _beg ,_efbb :=range *_cgbd {_bfb :=_efbb .Operand ;
|
|
if _bfb =="\u0054\u006a"{_effc :=_gg .TraceToDirectObject (_efbb .Params [0]);if _effc ==PdfObj {return _efbb ,_beg ,true ;};}else if _bfb =="\u0054\u004a"{_bff ,_eaa :=_gg .GetArray (_efbb .Params [0]);if !_eaa {return nil ,_beg ,_eaa ;};for _ ,_ebg :=range _bff .Elements (){if _ebg ==PdfObj {return _efbb ,_beg ,true ;
|
|
};};}else if _bfb =="\u0022"{_gbeg :=_gg .TraceToDirectObject (_efbb .Params [2]);if _gbeg ==PdfObj {return _efbb ,_beg ,true ;};}else if _bfb =="\u0027"{_dfc :=_gg .TraceToDirectObject (_efbb .Params [0]);if _dfc ==PdfObj {return _efbb ,_beg ,true ;};
|
|
};};return nil ,-1,false ;};func _fdd (_eab *_ce .TextMarkArray )(_gg .PdfObject ,int ){var _gge _gg .PdfObject ;_dfb :=-1;for _aa ,_bc :=range _eab .Elements (){_gge =_bc .DirectObject ;_dfb =_aa ;if _gge !=nil {break ;};};return _gge ,_dfb ;};
|
|
|
|
// RedactionTerm holds the regexp pattern and the replacement string for the redaction process.
|
|
type RedactionTerm struct{Pattern *_cc .Regexp ;};
|
|
|
|
// Redactor represtents a Redactor object.
|
|
type Redactor struct{_efgg *_fe .PdfReader ;_bdg *RedactionOptions ;_ebc *_g .Creator ;_fea *RectangleProps ;};
|
|
|
|
// 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 _aea (_dfad RedactionTerm )(*regexMatcher ,error ){return ®exMatcher {_dbe :_dfad },nil };func _deb (_ge string ,_eea *_fe .PdfFont )[]byte {_cgb ,_feg :=_eea .StringToCharcodeBytes (_ge );
|
|
if _feg !=0{_d .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",_ge ,_cgb );
|
|
};return _cgb ;};func _gca (_dcb []*matchedIndex )map[string ][][]int {_ffd :=make (map[string ][][]int );for _ ,_gaa :=range _dcb {_eafd :=_gaa ._afbd ;_edfb :=[]int {_gaa ._aag ,_gaa ._dfcd };if _abfc ,_adba :=_ffd [_eafd ];_adba {_ffd [_eafd ]=append (_abfc ,_edfb );
|
|
}else {_ffd [_eafd ]=[][]int {_edfb };};};return _ffd ;};type localSpanMarks struct{_ecb *_ce .TextMarkArray ;_bgg int ;_ddfe string ;};func _fddg (_ced string ,_gfd []replacement ,_afe *_fe .PdfFont )[]_gg .PdfObject {_fbdg :=[]_gg .PdfObject {};_gffg :=0;
|
|
_deab :=_ced ;for _age ,_acg :=range _gfd {_gbe :=_acg ._bd ;_agad :=_acg ._bb ;_ggeg :=_acg ._e ;_ccff :=_gg .MakeFloat (_agad );_fba :=_ced [_gffg :_gbe ];_dde :=_deb (_fba ,_afe );_gfab :=_gg .MakeStringFromBytes (_dde );_fbdg =append (_fbdg ,_gfab );
|
|
_fbdg =append (_fbdg ,_ccff );_ddbf :=_gbe +len (_ggeg );_deab =_ced [_ddbf :];_gffg =_ddbf ;if _age ==len (_gfd )-1{_dde =_deb (_deab ,_afe );_gfab =_gg .MakeStringFromBytes (_dde );_fbdg =append (_fbdg ,_gfab );};};return _fbdg ;};
|
|
|
|
// Write writes the content of `re.creator` to writer of type io.Writer interface.
|
|
func (_ddd *Redactor )Write (writer _ba .Writer )error {return _ddd ._ebc .Write (writer )};func _agdd (_bdf ,_dga ,_efbc float64 )float64 {_efbc =_efbc /100;_fegb :=(-1000*_bdf )/(_dga *_efbc );return _fegb ;};func _agg (_acd string ,_ec []localSpanMarks )([]placeHolders ,error ){_fab :="";
|
|
_cgbc :=[]placeHolders {};for _faba ,_edf :=range _ec {_gec :=_edf ._ecb ;_fag :=_edf ._ddfe ;_bae :=_gbd (_gec );_dfd ,_cdd :=_gcbc (_gec );if _cdd !=nil {return nil ,_cdd ;};if _bae !=_fab {var _ggag []int ;if _faba ==0&&_fag !=_bae {_efg :=_a .Index (_acd ,_bae );
|
|
_ggag =[]int {_efg };}else if _faba ==len (_ec )-1{_fbf :=_a .LastIndex (_acd ,_bae );_ggag =[]int {_fbf };}else {_ggag =_ffe (_acd ,_bae );};_beb :=placeHolders {_cb :_ggag ,_ae :_bae ,_df :_dfd };_cgbc =append (_cgbc ,_beb );};_fab =_bae ;};return _cgbc ,nil ;
|
|
};func _ab (_ea *_bf .ContentStreamOperations ,_aee string ,_af int )error {_fgf :=_bf .ContentStreamOperations {};var _fb _bf .ContentStreamOperation ;for _ac ,_gbb :=range *_ea {if _ac ==_af {if _aee =="\u0027"{_fbg :=_bf .ContentStreamOperation {Operand :"\u0054\u002a"};
|
|
_fgf =append (_fgf ,&_fbg );_fb .Params =_gbb .Params ;_fb .Operand ="\u0054\u006a";_fgf =append (_fgf ,&_fb );}else if _aee =="\u0022"{_dg :=_gbb .Params [:2];Tc ,Tw :=_dg [0],_dg [1];_gbg :=_bf .ContentStreamOperation {Params :[]_gg .PdfObject {Tc },Operand :"\u0054\u0063"};
|
|
_fgf =append (_fgf ,&_gbg );_gbg =_bf .ContentStreamOperation {Params :[]_gg .PdfObject {Tw },Operand :"\u0054\u0077"};_fgf =append (_fgf ,&_gbg );_fb .Params =[]_gg .PdfObject {_gbb .Params [2]};_fb .Operand ="\u0054\u006a";_fgf =append (_fgf ,&_fb );
|
|
};};_fgf =append (_fgf ,_gbb );};*_ea =_fgf ;return nil ;};func _aade (_efae *_ce .TextMarkArray ,_edc int ,_bbcg int )int {_ddg :=_efae .Elements ();_bbab :=_edc -1;_gaea :=_edc +1;_cffb :=-1;if _bbab >=0{_gcf :=_ddg [_bbab ];_aaag :=_gcf .ObjString ;
|
|
_gdf :=len (_aaag );_efe :=_gcf .Index ;if _efe +1< _gdf {_cffb =_bbab ;return _cffb ;};};if _gaea < len (_ddg ){_dfbf :=_ddg [_gaea ];_dca :=_dfbf .ObjString ;if _dca [0]!=_dfbf .Text {_cffb =_gaea ;return _cffb ;};};return _cffb ;};func _efc (_gaf []int ,_gcbag *_ce .TextMarkArray ,_bddb string )(*_ce .TextMarkArray ,matchedBBox ,error ){_afag :=matchedBBox {};
|
|
_fef :=_gaf [0];_cac :=_gaf [1];_bebb :=len (_bddb )-len (_a .TrimLeft (_bddb ,"\u0020"));_babg :=len (_bddb )-len (_a .TrimRight (_bddb ,"\u0020\u000a"));_fef =_fef +_bebb ;_cac =_cac -_babg ;_bddb =_a .Trim (_bddb ,"\u0020\u000a");_ecd ,_eaeb :=_gcbag .RangeOffset (_fef ,_cac );
|
|
if _eaeb !=nil {return nil ,_afag ,_eaeb ;};_cgf ,_geg :=_ecd .BBox ();if !_geg {return nil ,_afag ,_b .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",_ecd );
|
|
};_afag =matchedBBox {_fbaa :_bddb ,_aeg :_cgf };return _ecd ,_afag ,nil ;};func _ee (_cbe *_bf .ContentStreamOperations ,_fg map[_gg .PdfObject ][]localSpanMarks )error {for _cf ,_gc :=range _fg {if _cf ==nil {continue ;};_fa ,_gf ,_fd :=_adb (_cbe ,_cf );
|
|
if !_fd {_d .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",_cf ,_cbe );
|
|
return nil ;};if _fa .Operand =="\u0054\u006a"{_ef :=_ege (_fa ,_cf ,_gc );if _ef !=nil {return _ef ;};}else if _fa .Operand =="\u0054\u004a"{_de :=_cfd (_fa ,_cf ,_gc );if _de !=nil {return _de ;};}else if _fa .Operand =="\u0027"||_fa .Operand =="\u0022"{_gb :=_ab (_cbe ,_fa .Operand ,_gf );
|
|
if _gb !=nil {return _gb ;};_gb =_ege (_fa ,_cf ,_gc );if _gb !=nil {return _gb ;};};};return nil ;};func _ade (_afb _gg .PdfObject ,_dbd *_fe .PdfFont )(string ,error ){_ccgd ,_eeg :=_gg .GetStringBytes (_afb );if !_eeg {return "",_gg .ErrTypeError ;};
|
|
_dbb :=_dbd .BytesToCharcodes (_ccgd );_gacb ,_ccc ,_eee :=_dbd .CharcodesToStrings (_dbb );if _eee > 0{_d .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",_ccc ,_eee );
|
|
};_cbf :=_a .Join (_gacb ,"");return _cbf ,nil ;};type replacement struct{_e string ;_bb float64 ;_bd int ;};func _gcbc (_ddee *_ce .TextMarkArray )(float64 ,error ){_aced ,_bdc :=_ddee .BBox ();if !_bdc {return 0.0,_b .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",_ddee );
|
|
};_bdda :=_gd (_ddee );_gbf :=0.0;_ ,_eecb :=_fdd (_ddee );_gbfc :=_ddee .Elements ()[_eecb ];_ddf :=_gbfc .Font ;if _bdda > 0{_gbf =_aeed (_ddf ,_gbfc );};_eag :=(_aced .Urx -_aced .Llx );_eag =_eag +_gbf *float64 (_bdda );Tj :=_agdd (_eag ,_gbfc .FontSize ,_gbfc .Th );
|
|
return Tj ,nil ;};
|
|
|
|
// WriteToFile writes the redacted document to file specified by `outputPath`.
|
|
func (_bfbc *Redactor )WriteToFile (outputPath string )error {if _dfba :=_bfbc ._ebc .WriteToFile (outputPath );_dfba !=nil {return _b .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 _aeed (_be *_fe .PdfFont ,_cga _ce .TextMark )float64 {_egf :=0.001;_ggdd :=_cga .Th /100;if _be .Subtype ()=="\u0054\u0079\u0070e\u0033"{_egf =1;};_efa ,_bef :=_be .GetRuneMetrics (' ');if !_bef {_efa ,_bef =_be .GetCharMetrics (32);
|
|
};if !_bef {_efa ,_ =_fe .DefaultFont ().GetRuneMetrics (' ');};_ddb :=_egf *((_efa .Wx *_cga .FontSize +_cga .Tc +_cga .Tw )/_ggdd );return _ddb ;};func _gd (_eec *_ce .TextMarkArray )int {_ff :=0;_efb :=_eec .Elements ();if _efb [0].Text =="\u0020"{_ff ++;
|
|
};if _efb [_eec .Len ()-1].Text =="\u0020"{_ff ++;};return _ff ;};type regexMatcher struct{_dbe RedactionTerm };func _bfe (_ggdda []localSpanMarks )(map[string ][]localSpanMarks ,[]string ){_bcd :=make (map[string ][]localSpanMarks );_gga :=[]string {};
|
|
for _ ,_cd :=range _ggdda {_agae :=_cd ._ddfe ;if _fbc ,_dff :=_bcd [_agae ];_dff {_bcd [_agae ]=append (_fbc ,_cd );}else {_bcd [_agae ]=[]localSpanMarks {_cd };_gga =append (_gga ,_agae );};};return _bcd ,_gga ;};func (_dcf *Redactor )redactPage (_fdcf *_bf .ContentStreamOperations ,_afbda *_fe .PdfPageResources )([]matchedBBox ,*_bf .ContentStreamOperations ,error ){_agdg ,_gcd :=_ce .NewFromContents (_fdcf .String (),_afbda );
|
|
if _gcd !=nil {return nil ,nil ,_gcd ;};_eefa ,_ ,_ ,_gcd :=_agdg .ExtractPageText ();_fdcf =_eefa .GetContentStreamOps ();if _gcd !=nil {return nil ,nil ,_gcd ;};_adbd :=_eefa .Marks ();_bbad :=_eefa .Text ();_cbcf :=[]matchedBBox {};_fec :=make (map[_gg .PdfObject ][]localSpanMarks );
|
|
for _ ,_afaf :=range _dcf ._bdg .Terms {_fabd ,_fga :=_aea (_afaf );if _fga !=nil {return nil ,nil ,_fga ;};_ddec ,_fga :=_fabd .match (_bbad );if _fga !=nil {return nil ,nil ,_fga ;};_fca :=_gca (_ddec );for _feb ,_cfbfd :=range _fca {_caa :=[]matchedBBox {};
|
|
for _ ,_ged :=range _cfbfd {_dfab ,_bee ,_fbgc :=_efc (_ged ,_adbd ,_feb );if _fbgc !=nil {return nil ,nil ,_fbgc ;};_fgd :=_bce (_dfab );for _gcga ,_fdda :=range _fgd {_cec :=localSpanMarks {_ecb :_fdda ,_bgg :_gcga ,_ddfe :_feb };_ece ,_ :=_fdd (_fdda );
|
|
if _acf ,_aaa :=_fec [_ece ];_aaa {_fec [_ece ]=append (_acf ,_cec );}else {_fec [_ece ]=[]localSpanMarks {_cec };};};_caa =append (_caa ,_bee );};_cbcf =append (_cbcf ,_caa ...);};};_gcd =_ee (_fdcf ,_fec );if _gcd !=nil {return nil ,nil ,_gcd ;};return _cbcf ,_fdcf ,nil ;
|
|
};func _ege (_gad *_bf .ContentStreamOperation ,_deac _gg .PdfObject ,_cfb []localSpanMarks )error {var _bde *_gg .PdfObjectArray ;_da ,_gag :=_bfe (_cfb );if len (_gag )==1{_gcc :=_gag [0];_eaf :=_da [_gcc ];if len (_eaf )==1{_cae :=_eaf [0];_def :=_cae ._ecb ;
|
|
_defc :=_cbee (_def );_eb ,_aba :=_ade (_deac ,_defc );if _aba !=nil {return _aba ;};_fdc ,_aba :=_caef (_cae ,_def ,_defc ,_eb ,_gcc );if _aba !=nil {return _aba ;};_bde =_gg .MakeArray (_fdc ...);}else {_gccb :=_eaf [0]._ecb ;_dfg :=_cbee (_gccb );_baa ,_gcb :=_ade (_deac ,_dfg );
|
|
if _gcb !=nil {return _gcb ;};_dfa ,_gcb :=_agg (_baa ,_eaf );if _gcb !=nil {return _gcb ;};_cfg :=_ccg (_dfa );_afd :=_fddg (_baa ,_cfg ,_dfg );_bde =_gg .MakeArray (_afd ...);};}else if len (_gag )> 1{_ed :=_cfb [0];_aaf :=_ed ._ecb ;_ ,_edd :=_fdd (_aaf );
|
|
_fgb :=_aaf .Elements ()[_edd ];_bafc :=_fgb .Font ;_gae ,_babb :=_ade (_deac ,_bafc );if _babb !=nil {return _babb ;};_ggddb ,_babb :=_agg (_gae ,_cfb );if _babb !=nil {return _babb ;};_bg :=_ccg (_ggddb );_cfa :=_fddg (_gae ,_bg ,_bafc );_bde =_gg .MakeArray (_cfa ...);
|
|
};_gad .Params [0]=_bde ;_gad .Operand ="\u0054\u004a";return nil ;}; |