mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-27 13:48:51 +08:00
361 lines
56 KiB
Go
361 lines
56 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 annotator provides an interface for creating annotations with appearance
|
|
// streams. It goes beyond the models package which includes definitions of basic annotation models, in that it
|
|
// can create the appearance streams which specify the exact appearance as needed by many pdf viewers for consistent
|
|
// appearance of the annotations.
|
|
// It also contains methods for generating appearance streams for fields via widget annotations.
|
|
package annotator ;import (_b "bytes";_aa "errors";_a "github.com/unidoc/unipdf/v3/common";_d "github.com/unidoc/unipdf/v3/contentstream";_f "github.com/unidoc/unipdf/v3/contentstream/draw";_cf "github.com/unidoc/unipdf/v3/core";_e "github.com/unidoc/unipdf/v3/internal/textencoding";
|
|
_cb "github.com/unidoc/unipdf/v3/model";_cg "image";_cd "math";_g "strings";_ad "unicode";);func _ccfd (_gbe *_cb .PdfAcroForm ,_cfb *_cb .PdfAnnotationWidget ,_dcde *_cb .PdfFieldChoice ,_eaeg AppearanceStyle )(*_cf .PdfObjectDictionary ,error ){_edac ,_ebe :=_cf .GetArray (_cfb .Rect );
|
|
if !_ebe {return nil ,_aa .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_ccc ,_feg :=_cb .NewPdfRectangle (*_edac );if _feg !=nil {return nil ,_feg ;};_ffa ,_fdc :=_ccc .Width (),_ccc .Height ();_a .Log .Debug ("\u0043\u0068\u006f\u0069\u0063\u0065\u002c\u0020\u0077\u0061\u0020\u0042S\u003a\u0020\u0025\u0076",_cfb .BS );
|
|
_eegb ,_feg :=_d .NewContentStreamParser (_fae (_dcde .PdfField )).Parse ();if _feg !=nil {return nil ,_feg ;};_gff ,_efa :=_cf .GetDict (_cfb .MK );if _efa {_bgb ,_ :=_cf .GetDict (_cfb .BS );_dec :=_eaeg .applyAppearanceCharacteristics (_gff ,_bgb ,nil );
|
|
if _dec !=nil {return nil ,_dec ;};};_efg :=_cf .MakeDict ();for _ ,_bced :=range _dcde .Opt .Elements (){if _be ,_afg :=_cf .GetArray (_bced );_afg &&_be .Len ()==2{_bced =_be .Get (1);};var _ccffg string ;if _geac ,_bddg :=_cf .GetString (_bced );_bddg {_ccffg =_geac .Decoded ();
|
|
}else if _acf ,_efe :=_cf .GetName (_bced );_efe {_ccffg =_acf .String ();}else {_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u003a \u004f\u0070\u0074\u0020\u006e\u006f\u0074\u0020\u0061\u0020\u006e\u0061\u006de\u002f\u0073\u0074\u0072\u0069\u006e\u0067 \u002d\u0020\u0025\u0054",_bced );
|
|
return nil ,_aa .New ("\u006e\u006f\u0074\u0020\u0061\u0020\u006e\u0061\u006d\u0065\u002f\u0073t\u0072\u0069\u006e\u0067");};if len (_ccffg )> 0{_cdf ,_dbba :=_cede (_dcde .PdfField ,_ffa ,_fdc ,_ccffg ,_eaeg ,_eegb ,_gbe .DR ,_gff );if _dbba !=nil {return nil ,_dbba ;
|
|
};_efg .Set (*_cf .MakeName (_ccffg ),_cdf .ToPdfObject ());};};_fcg :=_cf .MakeDict ();_fcg .Set ("\u004e",_efg );return _fcg ,nil ;};func _gegc (_aaaf *_cb .PdfAnnotationWidget ,_addg *_cb .PdfFieldText ,_de *_cb .PdfPageResources ,_ecf AppearanceStyle )(*_cf .PdfObjectDictionary ,error ){_eggc :=_cb .NewPdfPageResources ();
|
|
_gce ,_eaef :=_cf .GetArray (_aaaf .Rect );if !_eaef {return nil ,_aa .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_eda ,_bce :=_cb .NewPdfRectangle (*_gce );if _bce !=nil {return nil ,_bce ;};_cgec ,_bgea :=_eda .Width (),_eda .Height ();
|
|
_gdec ,_dbb :=_cgec ,_bgea ;_fdd ,_gfaf :=_cf .GetDict (_aaaf .MK );if _gfaf {_gfef ,_ :=_cf .GetDict (_aaaf .BS );_ceb :=_ecf .applyAppearanceCharacteristics (_fdd ,_gfef ,nil );if _ceb !=nil {return nil ,_ceb ;};};_feb ,_gfaf :=_cf .GetIntVal (_addg .MaxLen );
|
|
if !_gfaf {return nil ,_aa .New ("\u006d\u0061\u0078\u006c\u0065\u006e\u0020\u006e\u006ft\u0020\u0073\u0065\u0074");};if _feb <=0{return nil ,_aa .New ("\u006d\u0061\u0078\u004c\u0065\u006e\u0020\u0069\u006ev\u0061\u006c\u0069\u0064");};_fec :=_cgec /float64 (_feb );
|
|
_gdc ,_bce :=_d .NewContentStreamParser (_fae (_addg .PdfField )).Parse ();if _bce !=nil {return nil ,_bce ;};_bcd :=_d .NewContentCreator ();if _ecf .BorderSize > 0{_dgc (_bcd ,_ecf ,_cgec ,_bgea );};if _ecf .DrawAlignmentReticle {_ba :=_ecf ;_ba .BorderSize =0.2;
|
|
_eaff (_bcd ,_ba ,_cgec ,_bgea );};_bcd .Add_BMC ("\u0054\u0078");_bcd .Add_q ();_ ,_bgea =_ecf .applyRotation (_fdd ,_cgec ,_bgea ,_bcd );_bcd .Add_BT ();_acg ,_bdg ,_bce :=_ecf .processDA (_addg .PdfField ,_gdc ,_de ,_eggc ,_bcd );if _bce !=nil {return nil ,_bce ;
|
|
};_edcg :=_acg .Font ;_aga :=_cf .MakeName (_acg .Name );_bdf :=_acg .Size ;_abee :=_bdf ==0;if _abee &&_bdg {_bdf =_bgea *_ecf .AutoFontSizeFraction ;};_ff :=_edcg .Encoder ();if _ff ==nil {_a .Log .Debug ("\u0057\u0041RN\u003a\u0020\u0066\u006f\u006e\u0074\u0020\u0065\u006e\u0063\u006f\u0064\u0065\u0072\u0020\u0069\u0073\u0020\u006e\u0069l\u002e\u0020\u0041\u0073s\u0075\u006d\u0069\u006eg \u0069\u0064e\u006et\u0069\u0074\u0079\u0020\u0065\u006ec\u006f\u0064\u0065r\u002e\u0020O\u0075\u0074\u0070\u0075\u0074\u0020\u006d\u0061\u0079\u0020\u0062\u0065\u0020\u0069n\u0063\u006f\u0072\u0072\u0065\u0063\u0074\u002e");
|
|
_ff =_e .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};var _afd string ;if _acb ,_abc :=_cf .GetString (_addg .V );_abc {_afd =_acb .Decoded ();};_bcd .Add_Tf (*_aga ,_bdf );var _efcg float64 ;for _ ,_efce :=range _afd {_bfd ,_fcbb :=_edcg .GetRuneMetrics (_efce );
|
|
if !_fcbb {_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u003a \u0052\u0075\u006e\u0065\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064\u0020\u0069\u006e\u0020\u0066\u006fn\u0074\u003a\u0020\u0025\u0076\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067 \u006f\u0076\u0065\u0072",_efce );
|
|
continue ;};_bdc :=_bfd .Wy ;if int (_bdc )<=0{_bdc =_bfd .Wx ;};if _bdc > _efcg {_efcg =_bdc ;};};if int (_efcg )==0{_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u003a\u0020\u0055\u006e\u0061\u0062\u006c\u0065\u0020\u0074o\u0020\u0064\u0065\u0074\u0065\u0072\u006d\u0069\u006e\u0065\u0020\u006d\u0061x\u0020\u0067\u006c\u0079\u0070\u0068\u0020\u0073\u0069\u007a\u0065\u0020- \u0075\u0073\u0069\u006e\u0067\u0020\u0031\u0030\u0030\u0030");
|
|
_efcg =1000;};_cceg ,_bce :=_edcg .GetFontDescriptor ();if _bce !=nil {_a .Log .Debug ("\u0045\u0072ro\u0072\u003a\u0020U\u006e\u0061\u0062\u006ce t\u006f g\u0065\u0074\u0020\u0066\u006f\u006e\u0074 d\u0065\u0073\u0063\u0072\u0069\u0070\u0074o\u0072");
|
|
};var _ebg float64 ;if _cceg !=nil {_ebg ,_bce =_cceg .GetCapHeight ();if _bce !=nil {_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u003a\u0020\u0055\u006e\u0061\u0062\u006c\u0065 \u0074\u006f\u0020\u0067\u0065\u0074 \u0066\u006f\u006e\u0074\u0020\u0043\u0061\u0070\u0048\u0065\u0069\u0067\u0068t\u003a\u0020\u0025\u0076",_bce );
|
|
};};if int (_ebg )<=0{_a .Log .Debug ("W\u0041\u0052\u004e\u003a\u0020\u0043\u0061\u0070\u0048e\u0069\u0067\u0068\u0074\u0020\u006e\u006ft \u0061\u0076\u0061\u0069l\u0061\u0062\u006c\u0065\u0020\u002d\u0020\u0073\u0065tt\u0069\u006eg\u0020\u0074\u006f\u0020\u0031\u0030\u0030\u0030");
|
|
_ebg =1000.0;};_ege :=_ebg /1000.0*_bdf ;_edce :=0.0;_geag :=1.0*_bdf *(_efcg /1000.0);{_fgdg :=_geag ;if _abee &&_edce +_fgdg > _bgea {_bdf =0.95*(_bgea -_edce );_ege =_ebg /1000.0*_bdf ;};if _bgea > _ege {_edce =(_bgea -_ege )/2.0;};};_bcd .Add_Td (0,_edce );
|
|
if _fb ,_bfc :=_cf .GetIntVal (_addg .Q );_bfc {switch _fb {case 2:if len (_afd )< _feb {_bdd :=float64 (_feb -len (_afd ))*_fec ;_bcd .Add_Td (_bdd ,0);};};};for _bfce ,_aadg :=range _afd {_edf :=2.0;_eafg :=string (_aadg );if _ff !=nil {_edcc ,_bbf :=_edcg .GetRuneMetrics (_aadg );
|
|
if !_bbf {_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u003a \u0052\u0075\u006e\u0065\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064\u0020\u0069\u006e\u0020\u0066\u006fn\u0074\u003a\u0020\u0025\u0076\u0020\u002d\u0020\u0073\u006b\u0069\u0070\u0070\u0069n\u0067 \u006f\u0076\u0065\u0072",_aadg );
|
|
continue ;};_eafg =string (_ff .Encode (_eafg ));_eef :=_bdf *_edcc .Wx /1000.0;_aee :=(_fec -_eef )/2;_edf =_aee ;};_bcd .Add_Td (_edf ,0);_bcd .Add_Tj (*_cf .MakeString (_eafg ));if _bfce !=len (_afd )-1{_bcd .Add_Td (_fec -_edf ,0);};};_bcd .Add_ET ();
|
|
_bcd .Add_Q ();_bcd .Add_EMC ();_dcd :=_cb .NewXObjectForm ();_dcd .Resources =_eggc ;_dcd .BBox =_cf .MakeArrayFromFloats ([]float64 {0,0,_gdec ,_dbb });_dcd .SetContentStream (_bcd .Bytes (),_beea ());_baf :=_cf .MakeDict ();_baf .Set ("\u004e",_dcd .ToPdfObject ());
|
|
return _baf ,nil ;};func (_agec *AppearanceStyle )applyRotation (_ccd *_cf .PdfObjectDictionary ,_aaec ,_adb float64 ,_fbba *_d .ContentCreator )(float64 ,float64 ){if !_agec .AllowMK {return _aaec ,_adb ;};if _ccd ==nil {return _aaec ,_adb ;};_cgee ,_ :=_cf .GetNumberAsFloat (_ccd .Get ("\u0052"));
|
|
if _cgee ==0{return _aaec ,_adb ;};_gab :=-_cgee ;_fdf :=_f .Path {Points :[]_f .Point {_f .NewPoint (0,0).Rotate (_gab ),_f .NewPoint (_aaec ,0).Rotate (_gab ),_f .NewPoint (0,_adb ).Rotate (_gab ),_f .NewPoint (_aaec ,_adb ).Rotate (_gab )}}.GetBoundingBox ();
|
|
_fbba .RotateDeg (_cgee );_fbba .Translate (_fdf .X ,_fdf .Y );return _fdf .Width ,_fdf .Height ;};
|
|
|
|
// NewSignatureField returns a new signature field with a visible appearance
|
|
// containing the specified signature lines and styled according to the
|
|
// specified options.
|
|
func NewSignatureField (signature *_cb .PdfSignature ,lines []*SignatureLine ,opts *SignatureFieldOpts )(*_cb .PdfFieldSignature ,error ){if signature ==nil {return nil ,_aa .New ("\u0073\u0069\u0067na\u0074\u0075\u0072\u0065\u0020\u0063\u0061\u006e\u006e\u006f\u0074\u0020\u0062\u0065\u0020\u006e\u0069\u006c");
|
|
};_feea ,_dcgg :=_gca (lines ,opts );if _dcgg !=nil {return nil ,_dcgg ;};_dgd :=_cb .NewPdfFieldSignature (signature );_dgd .Rect =_cf .MakeArrayFromFloats (opts .Rect );_dgd .AP =_feea ;return _dgd ,nil ;};
|
|
|
|
// NewTextField generates a new text field with partial name `name` at location
|
|
// specified by `rect` on given `page` and with field specific options `opt`.
|
|
func NewTextField (page *_cb .PdfPage ,name string ,rect []float64 ,opt TextFieldOptions )(*_cb .PdfFieldText ,error ){if page ==nil {return nil ,_aa .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");};if len (name )<=0{return nil ,_aa .New ("\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0064\u0020\u0061\u0074\u0074\u0072\u0069\u0062u\u0074e\u0020\u006e\u006f\u0074\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064");
|
|
};if len (rect )!=4{return nil ,_aa .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");};_ecfa :=_cb .NewPdfField ();_gdab :=&_cb .PdfFieldText {};_ecfa .SetContext (_gdab );_gdab .PdfField =_ecfa ;_gdab .T =_cf .MakeString (name );
|
|
if opt .MaxLen > 0{_gdab .MaxLen =_cf .MakeInteger (int64 (opt .MaxLen ));};if len (opt .Value )> 0{_gdab .V =_cf .MakeString (opt .Value );};_eabc :=_cb .NewPdfAnnotationWidget ();_eabc .Rect =_cf .MakeArrayFromFloats (rect );_eabc .P =page .ToPdfObject ();
|
|
_eabc .F =_cf .MakeInteger (4);_eabc .Parent =_gdab .ToPdfObject ();_gdab .Annotations =append (_gdab .Annotations ,_eabc );return _gdab ,nil ;};func _dgc (_faeb *_d .ContentCreator ,_bfa AppearanceStyle ,_fbae ,_bgde float64 ){_faeb .Add_q ().Add_re (0,0,_fbae ,_bgde ).Add_w (_bfa .BorderSize ).SetStrokingColor (_bfa .BorderColor ).SetNonStrokingColor (_bfa .FillColor ).Add_B ().Add_Q ();
|
|
};
|
|
|
|
// SignatureFieldOpts represents a set of options used to configure
|
|
// an appearance widget dictionary.
|
|
type SignatureFieldOpts struct{
|
|
|
|
// Rect represents the area the signature annotation is displayed on.
|
|
Rect []float64 ;
|
|
|
|
// AutoSize specifies if the content of the appearance should be
|
|
// scaled to fit in the annotation rectangle.
|
|
AutoSize bool ;
|
|
|
|
// Font specifies the font of the text content.
|
|
Font *_cb .PdfFont ;
|
|
|
|
// FontSize specifies the size of the text content.
|
|
FontSize float64 ;
|
|
|
|
// LineHeight specifies the height of a line of text in the appearance annotation.
|
|
LineHeight float64 ;
|
|
|
|
// TextColor represents the color of the text content displayed.
|
|
TextColor _cb .PdfColor ;
|
|
|
|
// FillColor represents the background color of the appearance annotation area.
|
|
FillColor _cb .PdfColor ;
|
|
|
|
// BorderSize represents border size of the appearance annotation area.
|
|
BorderSize float64 ;
|
|
|
|
// BorderColor represents the border color of the appearance annotation area.
|
|
BorderColor _cb .PdfColor ;
|
|
|
|
// WatermarkImage specifies the image used as a watermark that will be rendered
|
|
// behind the signature.
|
|
WatermarkImage _cg .Image ;
|
|
|
|
// Image represents the image used for the signature appearance.
|
|
Image _cg .Image ;
|
|
|
|
// Encoder specifies the image encoder used for image signature. Defaults to flate encoder.
|
|
Encoder _cf .StreamEncoder ;
|
|
|
|
// ImagePosition specifies the image location relative to the text signature.
|
|
ImagePosition SignatureImagePosition ;};
|
|
|
|
// SignatureImagePosition specifies the image signature location relative to the text signature.
|
|
// If text signature is not defined, this position will be ignored.
|
|
type SignatureImagePosition int ;func (_dff *AppearanceStyle )processDA (_gbee *_cb .PdfField ,_gabf *_d .ContentStreamOperations ,_geb ,_eaac *_cb .PdfPageResources ,_faee *_d .ContentCreator )(*AppearanceFont ,bool ,error ){var _dgeb *AppearanceFont ;
|
|
var _bga bool ;if _dff .Fonts !=nil {if _dff .Fonts .Fallback !=nil {_dgeb =_dff .Fonts .Fallback ;};if _cbe :=_dff .Fonts .FieldFallbacks ;_cbe !=nil {if _bafb ,_dfd :=_cbe [_gbee .PartialName ()];_dfd {_dgeb =_bafb ;}else if _cae ,_ebfa :=_gbee .FullName ();
|
|
_ebfa ==nil {if _fbbc ,_abec :=_cbe [_cae ];_abec {_dgeb =_fbbc ;};};};_bga =_dff .Fonts .ForceReplace ;};var _fgdd string ;var _bccfc float64 ;var _cdg bool ;if _gabf !=nil {for _ ,_agf :=range *_gabf {if _agf .Operand =="\u0054\u0066"&&len (_agf .Params )==2{if _aeg ,_fbc :=_cf .GetNameVal (_agf .Params [0]);
|
|
_fbc {_fgdd =_aeg ;};if _egb ,_ffg :=_cf .GetNumberAsFloat (_agf .Params [1]);_ffg ==nil {_bccfc =_egb ;};_cdg =true ;continue ;};_faee .AddOperand (*_agf );};};var _bgab *AppearanceFont ;var _adc _cf .PdfObject ;if _bga &&_dgeb !=nil {_bgab =_dgeb ;}else {if _geb !=nil &&_fgdd !=""{if _abf ,_bbfg :=_geb .GetFontByName (*_cf .MakeName (_fgdd ));
|
|
_bbfg {if _bfdde ,_fgfg :=_cb .NewPdfFontFromPdfObject (_abf );_fgfg ==nil {_adc =_abf ;_bgab =&AppearanceFont {Name :_fgdd ,Font :_bfdde ,Size :_bccfc };}else {_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052:\u0020\u0063\u006f\u0075\u006c\u0064\u0020\u006e\u006f\u0074\u0020\u006c\u006fa\u0064\u0020\u0061\u0070\u0070\u0065\u0061\u0072\u0061\u006e\u0063\u0065\u0020\u0066\u006f\u006e\u0074\u003a\u0020\u0025\u0076",_fgfg );
|
|
};};};if _bgab ==nil &&_dgeb !=nil {_bgab =_dgeb ;};if _bgab ==nil {_abb ,_bfge :=_cb .NewStandard14Font ("\u0048e\u006c\u0076\u0065\u0074\u0069\u0063a");if _bfge !=nil {return nil ,false ,_bfge ;};_bgab =&AppearanceFont {Name :"\u0048\u0065\u006c\u0076",Font :_abb ,Size :_bccfc };
|
|
};};_fgb :=*_cf .MakeName (_bgab .Name );if _adc ==nil {_adc =_bgab .Font .ToPdfObject ();};if _geb !=nil &&!_geb .HasFontByName (_fgb ){_geb .SetFontByName (_fgb ,_adc );};if _eaac !=nil &&!_eaac .HasFontByName (_fgb ){_eaac .SetFontByName (_fgb ,_adc );
|
|
};return _bgab ,_cdg ,nil ;};func _cfc (_bg CircleAnnotationDef ,_cda string )([]byte ,*_cb .PdfRectangle ,*_cb .PdfRectangle ,error ){_db :=_f .Circle {X :_bg .X ,Y :_bg .Y ,Width :_bg .Width ,Height :_bg .Height ,FillEnabled :_bg .FillEnabled ,FillColor :_bg .FillColor ,BorderEnabled :_bg .BorderEnabled ,BorderWidth :_bg .BorderWidth ,BorderColor :_bg .BorderColor ,Opacity :_bg .Opacity };
|
|
_gd ,_bb ,_gc :=_db .Draw (_cda );if _gc !=nil {return nil ,nil ,nil ,_gc ;};_eb :=&_cb .PdfRectangle {};_eb .Llx =_bg .X +_bb .Llx ;_eb .Lly =_bg .Y +_bb .Lly ;_eb .Urx =_bg .X +_bb .Urx ;_eb .Ury =_bg .Y +_bb .Ury ;return _gd ,_bb ,_eb ,nil ;};func _aaab (_ecae LineAnnotationDef ,_acd string )([]byte ,*_cb .PdfRectangle ,*_cb .PdfRectangle ,error ){_cbg :=_f .Line {X1 :0,Y1 :0,X2 :_ecae .X2 -_ecae .X1 ,Y2 :_ecae .Y2 -_ecae .Y1 ,LineColor :_ecae .LineColor ,Opacity :_ecae .Opacity ,LineWidth :_ecae .LineWidth ,LineEndingStyle1 :_ecae .LineEndingStyle1 ,LineEndingStyle2 :_ecae .LineEndingStyle2 };
|
|
_gabd ,_acgg ,_fca :=_cbg .Draw (_acd );if _fca !=nil {return nil ,nil ,nil ,_fca ;};_dgeg :=&_cb .PdfRectangle {};_dgeg .Llx =_ecae .X1 +_acgg .Llx ;_dgeg .Lly =_ecae .Y1 +_acgg .Lly ;_dgeg .Urx =_ecae .X1 +_acgg .Urx ;_dgeg .Ury =_ecae .Y1 +_acgg .Ury ;
|
|
return _gabd ,_acgg ,_dgeg ,nil ;};func _aaa (_fe CircleAnnotationDef )(*_cf .PdfObjectDictionary ,*_cb .PdfRectangle ,error ){_dd :=_cb .NewXObjectForm ();_dd .Resources =_cb .NewPdfPageResources ();_ac :="";if _fe .Opacity < 1.0{_ecg :=_cf .MakeDict ();
|
|
_ecg .Set ("\u0063\u0061",_cf .MakeFloat (_fe .Opacity ));_ecg .Set ("\u0043\u0041",_cf .MakeFloat (_fe .Opacity ));_ee :=_dd .Resources .AddExtGState ("\u0067\u0073\u0031",_ecg );if _ee !=nil {_a .Log .Debug ("U\u006e\u0061\u0062\u006c\u0065\u0020t\u006f\u0020\u0061\u0064\u0064\u0020\u0065\u0078\u0074g\u0073\u0074\u0061t\u0065 \u0067\u0073\u0031");
|
|
return nil ,nil ,_ee ;};_ac ="\u0067\u0073\u0031";};_ecgd ,_aad ,_gb ,_ea :=_cfc (_fe ,_ac );if _ea !=nil {return nil ,nil ,_ea ;};_ea =_dd .SetContentStream (_ecgd ,nil );if _ea !=nil {return nil ,nil ,_ea ;};_dd .BBox =_aad .ToPdfObject ();_eg :=_cf .MakeDict ();
|
|
_eg .Set ("\u004e",_dd .ToPdfObject ());return _eg ,_gb ,nil ;};
|
|
|
|
// CreateCircleAnnotation creates a circle/ellipse annotation object with appearance stream that can be added to
|
|
// page PDF annotations.
|
|
func CreateCircleAnnotation (circDef CircleAnnotationDef )(*_cb .PdfAnnotation ,error ){_cge :=_cb .NewPdfAnnotationCircle ();if circDef .BorderEnabled {_fc ,_dg ,_ae :=circDef .BorderColor .R (),circDef .BorderColor .G (),circDef .BorderColor .B ();_cge .C =_cf .MakeArrayFromFloats ([]float64 {_fc ,_dg ,_ae });
|
|
_ag :=_cb .NewBorderStyle ();_ag .SetBorderWidth (circDef .BorderWidth );_cge .BS =_ag .ToPdfObject ();};if circDef .FillEnabled {_cc ,_ec ,_cdc :=circDef .FillColor .R (),circDef .FillColor .G (),circDef .FillColor .B ();_cge .IC =_cf .MakeArrayFromFloats ([]float64 {_cc ,_ec ,_cdc });
|
|
}else {_cge .IC =_cf .MakeArrayFromIntegers ([]int {});};if circDef .Opacity < 1.0{_cge .CA =_cf .MakeFloat (circDef .Opacity );};_fcb ,_ge ,_ed :=_aaa (circDef );if _ed !=nil {return nil ,_ed ;};_cge .AP =_fcb ;_cge .Rect =_cf .MakeArrayFromFloats ([]float64 {_ge .Llx ,_ge .Lly ,_ge .Urx ,_ge .Ury });
|
|
return _cge .PdfAnnotation ,nil ;};func _aaae (_dea *_cb .PdfAnnotationWidget ,_gaf *_cb .PdfFieldButton ,_bgd *_cb .PdfPageResources ,_dac AppearanceStyle )(*_cf .PdfObjectDictionary ,error ){_eaa ,_fgdc :=_cf .GetArray (_dea .Rect );if !_fgdc {return nil ,_aa .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");
|
|
};_ggf ,_fba :=_cb .NewPdfRectangle (*_eaa );if _fba !=nil {return nil ,_fba ;};_ddf ,_aabf :=_ggf .Width (),_ggf .Height ();_ecfd ,_agc :=_ddf ,_aabf ;_a .Log .Debug ("\u0043\u0068\u0065\u0063kb\u006f\u0078\u002c\u0020\u0077\u0061\u0020\u0042\u0053\u003a\u0020\u0025\u0076",_dea .BS );
|
|
_gafg ,_fba :=_cb .NewStandard14Font ("\u005a\u0061\u0070f\u0044\u0069\u006e\u0067\u0062\u0061\u0074\u0073");if _fba !=nil {return nil ,_fba ;};_deb ,_fgf :=_cf .GetDict (_dea .MK );if _fgf {_egc ,_ :=_cf .GetDict (_dea .BS );_afdf :=_dac .applyAppearanceCharacteristics (_deb ,_egc ,_gafg );
|
|
if _afdf !=nil {return nil ,_afdf ;};};_fceg :=_cb .NewXObjectForm ();{_ede :=_d .NewContentCreator ();if _dac .BorderSize > 0{_dgc (_ede ,_dac ,_ddf ,_aabf );};if _dac .DrawAlignmentReticle {_fef :=_dac ;_fef .BorderSize =0.2;_eaff (_ede ,_fef ,_ddf ,_aabf );
|
|
};_ddf ,_aabf =_dac .applyRotation (_deb ,_ddf ,_aabf ,_ede );_aeed :=_dac .AutoFontSizeFraction *_aabf ;_gac ,_aed :=_gafg .GetRuneMetrics (_dac .CheckmarkRune );if !_aed {return nil ,_aa .New ("\u0067l\u0079p\u0068\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");
|
|
};_cgg :=_gafg .Encoder ();_aff :=_cgg .Encode (string (_dac .CheckmarkRune ));_dge :=_gac .Wx *_aeed /1000.0;_bae :=705.0;_aaeg :=_bae /1000.0*_aeed ;_gee :=2.0;_gad :=1.0;if _dge < _ddf {_gee =(_ddf -_dge )/2.0;};if _aaeg < _aabf {_gad =(_aabf -_aaeg )/2.0;
|
|
};_ede .Add_q ().Add_g (0).Add_BT ().Add_Tf ("\u005a\u0061\u0044\u0062",_aeed ).Add_Td (_gee ,_gad ).Add_Tj (*_cf .MakeStringFromBytes (_aff )).Add_ET ().Add_Q ();_fceg .Resources =_cb .NewPdfPageResources ();_fceg .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_gafg .ToPdfObject ());
|
|
_fceg .BBox =_cf .MakeArrayFromFloats ([]float64 {0,0,_ecfd ,_agc });_fceg .SetContentStream (_ede .Bytes (),_beea ());};_eegf :=_cb .NewXObjectForm ();{_efb :=_d .NewContentCreator ();if _dac .BorderSize > 0{_dgc (_efb ,_dac ,_ddf ,_aabf );};_eegf .BBox =_cf .MakeArrayFromFloats ([]float64 {0,0,_ecfd ,_agc });
|
|
_eegf .SetContentStream (_efb .Bytes (),_beea ());};_geab :=_cf .MakeDict ();_geab .Set ("\u004f\u0066\u0066",_eegf .ToPdfObject ());_geab .Set ("\u0059\u0065\u0073",_fceg .ToPdfObject ());_baeb :=_cf .MakeDict ();_baeb .Set ("\u004e",_geab );return _baeb ,nil ;
|
|
};
|
|
|
|
// AppearanceStyle defines style parameters for appearance stream generation.
|
|
type AppearanceStyle struct{
|
|
|
|
// How much of Rect height to fill when autosizing text.
|
|
AutoFontSizeFraction float64 ;
|
|
|
|
// CheckmarkRune is a rune used for check mark in checkboxes (for ZapfDingbats font).
|
|
CheckmarkRune rune ;BorderSize float64 ;BorderColor _cb .PdfColor ;FillColor _cb .PdfColor ;
|
|
|
|
// Multiplier for lineheight for multi line text.
|
|
MultilineLineHeight float64 ;MultilineVAlignMiddle bool ;
|
|
|
|
// Visual guide checking alignment of field contents (debugging).
|
|
DrawAlignmentReticle bool ;
|
|
|
|
// Allow field MK appearance characteristics to override style settings.
|
|
AllowMK bool ;
|
|
|
|
// Fonts holds appearance styles for fonts.
|
|
Fonts *AppearanceFontStyle ;};
|
|
|
|
// TextFieldOptions defines optional parameter for a text field in a form.
|
|
type TextFieldOptions struct{MaxLen int ;Value string ;};const (SignatureImageLeft SignatureImagePosition =iota ;SignatureImageRight ;SignatureImageTop ;SignatureImageBottom ;);
|
|
|
|
// LineAnnotationDef defines a line between point 1 (X1,Y1) and point 2 (X2,Y2). The line ending styles can be none
|
|
// (regular line), or arrows at either end. The line also has a specified width, color and opacity.
|
|
type LineAnnotationDef struct{X1 float64 ;Y1 float64 ;X2 float64 ;Y2 float64 ;LineColor *_cb .PdfColorDeviceRGB ;Opacity float64 ;LineWidth float64 ;LineEndingStyle1 _f .LineEndingStyle ;LineEndingStyle2 _f .LineEndingStyle ;};
|
|
|
|
// SetStyle applies appearance `style` to `fa`.
|
|
func (_bc *FieldAppearance )SetStyle (style AppearanceStyle ){_bc ._da =&style };func _fae (_agca *_cb .PdfField )string {if _agca ==nil {return "";};_afb ,_ccb :=_agca .GetContext ().(*_cb .PdfFieldText );if !_ccb {return _fae (_agca .Parent );};if _afb .DA !=nil {return _afb .DA .Str ();
|
|
};return _fae (_afb .Parent );};func (_cgf *AppearanceStyle )applyAppearanceCharacteristics (_fgg *_cf .PdfObjectDictionary ,_bfg *_cf .PdfObjectDictionary ,_fbb *_cb .PdfFont )error {if !_cgf .AllowMK {return nil ;};if CA ,_bee :=_cf .GetString (_fgg .Get ("\u0043\u0041"));
|
|
_bee &&_fbb !=nil {_gdb :=CA .Bytes ();if len (_gdb )!=0{_cff :=[]rune (_fbb .Encoder ().Decode (_gdb ));if len (_cff )==1{_cgf .CheckmarkRune =_cff [0];};};};if BC ,_eab :=_cf .GetArray (_fgg .Get ("\u0042\u0043"));_eab {_edg ,_cea :=BC .ToFloat64Array ();
|
|
if _cea !=nil {return _cea ;};switch len (_edg ){case 1:_cgf .BorderColor =_cb .NewPdfColorDeviceGray (_edg [0]);case 3:_cgf .BorderColor =_cb .NewPdfColorDeviceRGB (_edg [0],_edg [1],_edg [2]);case 4:_cgf .BorderColor =_cb .NewPdfColorDeviceCMYK (_edg [0],_edg [1],_edg [2],_edg [3]);
|
|
default:_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052:\u0020\u0042\u0043\u0020\u002d\u0020\u0049\u006e\u0076\u0061\u006c\u0069\u0064 \u006e\u0075\u006d\u0062\u0065\u0072\u0020\u006f\u0066\u0020\u0063\u006f\u006c\u006f\u0072\u0020\u0063\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0020\u0028\u0025\u0064)",len (_edg ));
|
|
};if _bfg !=nil {if _aec ,_gge :=_cf .GetNumberAsFloat (_bfg .Get ("\u0057"));_gge ==nil {_cgf .BorderSize =_aec ;};};};if BG ,_eba :=_cf .GetArray (_fgg .Get ("\u0042\u0047"));_eba {_ddfe ,_gceg :=BG .ToFloat64Array ();if _gceg !=nil {return _gceg ;};
|
|
switch len (_ddfe ){case 1:_cgf .FillColor =_cb .NewPdfColorDeviceGray (_ddfe [0]);case 3:_cgf .FillColor =_cb .NewPdfColorDeviceRGB (_ddfe [0],_ddfe [1],_ddfe [2]);case 4:_cgf .FillColor =_cb .NewPdfColorDeviceCMYK (_ddfe [0],_ddfe [1],_ddfe [2],_ddfe [3]);
|
|
default:_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052:\u0020\u0042\u0047\u0020\u002d\u0020\u0049\u006e\u0076\u0061\u006c\u0069\u0064 \u006e\u0075\u006d\u0062\u0065\u0072\u0020\u006f\u0066\u0020\u0063\u006f\u006c\u006f\u0072\u0020\u0063\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0020\u0028\u0025\u0064)",len (_ddfe ));
|
|
};};return nil ;};
|
|
|
|
// ComboboxFieldOptions defines optional parameters for a combobox form field.
|
|
type ComboboxFieldOptions struct{
|
|
|
|
// Choices is the list of string values that can be selected.
|
|
Choices []string ;};func _eaff (_gag *_d .ContentCreator ,_cfdb AppearanceStyle ,_ccg ,_gdg float64 ){_gag .Add_q ().Add_re (0,0,_ccg ,_gdg ).Add_re (0,_gdg /2,_ccg ,_gdg /2).Add_re (0,0,_ccg ,_gdg ).Add_re (_ccg /2,0,_ccg /2,_gdg ).Add_w (_cfdb .BorderSize ).SetStrokingColor (_cfdb .BorderColor ).SetNonStrokingColor (_cfdb .FillColor ).Add_B ().Add_Q ();
|
|
};type quadding int ;
|
|
|
|
// AppearanceFontStyle defines font style characteristics for form fields,
|
|
// used in the filling/flattening process.
|
|
type AppearanceFontStyle struct{
|
|
|
|
// Fallback represents a global font fallback, used for fields which do
|
|
// not specify a font in their default appearance (DA). The fallback is
|
|
// also used if there is a font specified in the DA, but it is not
|
|
// found in the AcroForm resources (DR).
|
|
Fallback *AppearanceFont ;
|
|
|
|
// FieldFallbacks defines font fallbacks for specific fields. The map keys
|
|
// represent the names of the fields (which can be specified by their
|
|
// partial or full names). Specific field fallback fonts take precedence
|
|
// over the global font fallback.
|
|
FieldFallbacks map[string ]*AppearanceFont ;
|
|
|
|
// ForceReplace forces the replacement of fonts in the filling/flattening
|
|
// process, even if the default appearance (DA) specify a valid font.
|
|
// If no fallback font is provided, setting this field has no effect.
|
|
ForceReplace bool ;};func _gf (_gg *_cb .PdfAnnotationWidget ,_edc *_cb .PdfFieldText ,_gecd *_cb .PdfPageResources ,_gfb AppearanceStyle )(*_cf .PdfObjectDictionary ,error ){_eag :=_cb .NewPdfPageResources ();_bfe ,_fgd :=_cf .GetArray (_gg .Rect );if !_fgd {return nil ,_aa .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");
|
|
};_adg ,_ebf :=_cb .NewPdfRectangle (*_bfe );if _ebf !=nil {return nil ,_ebf ;};_age ,_eeg :=_adg .Width (),_adg .Height ();_dc ,_ca :=_age ,_eeg ;_ade ,_bge :=_cf .GetDict (_gg .MK );if _bge {_gde ,_ :=_cf .GetDict (_gg .BS );_gcf :=_gfb .applyAppearanceCharacteristics (_ade ,_gde ,nil );
|
|
if _gcf !=nil {return nil ,_gcf ;};};_bcbe ,_ebf :=_d .NewContentStreamParser (_fae (_edc .PdfField )).Parse ();if _ebf !=nil {return nil ,_ebf ;};_gcb :=_d .NewContentCreator ();if _gfb .BorderSize > 0{_dgc (_gcb ,_gfb ,_age ,_eeg );};if _gfb .DrawAlignmentReticle {_bcc :=_gfb ;
|
|
_bcc .BorderSize =0.2;_eaff (_gcb ,_bcc ,_age ,_eeg );};_gcb .Add_BMC ("\u0054\u0078");_gcb .Add_q ();_age ,_eeg =_gfb .applyRotation (_ade ,_age ,_eeg ,_gcb );_gcb .Add_BT ();_ced ,_gcc ,_ebf :=_gfb .processDA (_edc .PdfField ,_bcbe ,_gecd ,_eag ,_gcb );
|
|
if _ebf !=nil {return nil ,_ebf ;};_cfa :=_ced .Font ;_egg :=_ced .Size ;_dag :=_cf .MakeName (_ced .Name );_fcf :=_egg ==0;if _fcf &&_gcc {_egg =_eeg *_gfb .AutoFontSizeFraction ;};_afc :=_cfa .Encoder ();if _afc ==nil {_a .Log .Debug ("\u0057\u0041RN\u003a\u0020\u0066\u006f\u006e\u0074\u0020\u0065\u006e\u0063\u006f\u0064\u0065\u0072\u0020\u0069\u0073\u0020\u006e\u0069l\u002e\u0020\u0041\u0073s\u0075\u006d\u0069\u006eg \u0069\u0064e\u006et\u0069\u0074\u0079\u0020\u0065\u006ec\u006f\u0064\u0065r\u002e\u0020O\u0075\u0074\u0070\u0075\u0074\u0020\u006d\u0061\u0079\u0020\u0062\u0065\u0020\u0069n\u0063\u006f\u0072\u0072\u0065\u0063\u0074\u002e");
|
|
_afc =_e .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};_gga ,_ebf :=_cfa .GetFontDescriptor ();if _ebf !=nil {_a .Log .Debug ("\u0045\u0072ro\u0072\u003a\u0020U\u006e\u0061\u0062\u006ce t\u006f g\u0065\u0074\u0020\u0066\u006f\u006e\u0074 d\u0065\u0073\u0063\u0072\u0069\u0070\u0074o\u0072");
|
|
};var _ga string ;if _fa ,_dbe :=_cf .GetString (_edc .V );_dbe {_ga =_fa .Decoded ();};if len (_ga )==0{return nil ,nil ;};_ggb :=[]string {_ga };_gfg :=false ;if _edc .Flags ().Has (_cb .FieldFlagMultiline ){_gfg =true ;_ga =_g .Replace (_ga ,"\u000d\u000a","\u000a",-1);
|
|
_ga =_g .Replace (_ga ,"\u000d","\u000a",-1);_ggb =_g .Split (_ga ,"\u000a");};_aae :=0.0;_bgg :=0;if _afc !=nil {_gba :=len (_ggb );_gegg :=0;for _gegg < _gba {var _cfd float64 ;_aaf :=-1;_ef :=0.0;for _eee ,_adee :=range _ggb [_gegg ]{if _adee ==' '{_aaf =_eee ;
|
|
_cfd =_ef ;};_caf ,_bd :=_cfa .GetRuneMetrics (_adee );if !_bd {_a .Log .Debug ("\u0046\u006f\u006e\u0074\u0020\u0064o\u0065\u0073\u0020\u006e\u006f\u0074\u0020\u0068\u0061\u0076\u0065\u0020\u0072\u0075\u006e\u0065\u0020\u006d\u0065\u0074r\u0069\u0063\u0073\u0020\u0066\u006f\u0072\u0020\u0025\u0076\u0020\u002d\u0020\u0073k\u0069p\u0070\u0069\u006e\u0067",_adee );
|
|
continue ;};_ef +=_caf .Wx ;if _gfg &&!_fcf &&_egg *_ef /1000.0> _age &&_aaf > 0{_agb :=_ggb [_gegg ][_aaf +1:];if _gegg < len (_ggb )-1{_ggb =append (_ggb [:_gegg +1],_ggb [_gegg :]...);_ggb [_gegg +1]=_agb ;}else {_ggb =append (_ggb ,_agb );};_gba ++;
|
|
_ggb [_gegg ]=_ggb [_gegg ][0:_aaf ];_ef =_cfd ;break ;};};if _ef > _aae {_aae =_ef ;};_ggb [_gegg ]=string (_afc .Encode (_ggb [_gegg ]));if len (_ggb [_gegg ])> 0{_bgg ++;};_gegg ++;};};_agg :=2.0;if _egg ==0||_fcf &&_aae > 0&&_agg +_aae *_egg /1000.0> _age {_egg =0.95*1000.0*(_age -_agg )/_aae ;
|
|
};_gfc :=_df ;{if _bccf ,_cec :=_cf .GetIntVal (_edc .Q );_cec {switch _bccf {case 0:_gfc =_df ;case 1:_gfc =_gec ;case 2:_gfc =_fee ;default:_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u003a\u0020\u0055\u006e\u0073\u0075\u0070\u0070\u006f\u0072t\u0065\u0064\u0020\u0071\u0075\u0061\u0064\u0064\u0069\u006e\u0067\u003a\u0020%\u0064\u0020\u002d\u0020\u0075\u0073\u0069\u006e\u0067\u0020\u006c\u0065ft\u0020\u0061\u006c\u0069\u0067\u006e\u006d\u0065\u006e\u0074",_bccf );
|
|
};};};_aeb :=_gfb .MultilineLineHeight ;_fd :=_egg ;if _gfg &&_bgg > 1{_fd =_aeb *_egg ;};var _bde float64 ;if _gga !=nil {_bde ,_ebf =_gga .GetCapHeight ();if _ebf !=nil {_a .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u003a\u0020\u0055\u006e\u0061\u0062\u006c\u0065 \u0074\u006f\u0020\u0067\u0065\u0074 \u0066\u006f\u006e\u0074\u0020\u0043\u0061\u0070\u0048\u0065\u0069\u0067\u0068t\u003a\u0020\u0025\u0076",_ebf );
|
|
};};if int (_bde )<=0{_a .Log .Debug ("W\u0041\u0052\u004e\u003a\u0020\u0043\u0061\u0070\u0048e\u0069\u0067\u0068\u0074\u0020\u006e\u006ft \u0061\u0076\u0061\u0069l\u0061\u0062\u006c\u0065\u0020\u002d\u0020\u0073\u0065tt\u0069\u006eg\u0020\u0074\u006f\u0020\u0031\u0030\u0030\u0030");
|
|
_bde =1000;};_efc :=_bde /1000.0*_egg ;_ged :=0.0;{_bcg :=float64 (_bgg )*_fd ;if _fcf &&_ged +_bcg > _eeg {_egg =0.95*(_eeg -_ged )/float64 (_bgg );_fd =_egg ;if _gfg &&_bgg > 1{_fd =_aeb *_egg ;};_efc =_bde /1000.0*_egg ;_bcg =float64 (_bgg )*_fd ;};
|
|
if _eeg > _bcg {if _gfg {if _gfb .MultilineVAlignMiddle {_gfa :=(_eeg -_bcg )/2.0;_fce :=_gfa +_bcg -_fd ;_ged =_fce ;}else {_ged =_eeg -_fd ;_ged -=_egg *0.5;};}else {_ged =(_eeg -_efc )/2.0;};};};_gcb .Add_Tf (*_dag ,_egg );_gcb .Add_Td (_agg ,_ged );
|
|
_abe :=_agg ;_dfa :=_agg ;for _afa ,_aab :=range _ggb {_gfe :=0.0;for _ ,_ccf :=range _aab {_aaad ,_eae :=_cfa .GetRuneMetrics (_ccf );if !_eae {continue ;};_gfe +=_aaad .Wx ;};_ccff :=_gfe /1000.0*_egg ;_bdef :=_age -_ccff ;var _cbb float64 ;switch _gfc {case _df :_cbb =_abe ;
|
|
case _gec :_cbb =_bdef /2;case _fee :_cbb =_bdef ;};_agg =_cbb -_dfa ;if _agg > 0.0{_gcb .Add_Td (_agg ,0);};_dfa =_cbb ;_gcb .Add_Tj (*_cf .MakeString (_aab ));if _afa < len (_ggb )-1{_gcb .Add_Td (0,-_fd *_aeb );};};_gcb .Add_ET ();_gcb .Add_Q ();_gcb .Add_EMC ();
|
|
_ebd :=_cb .NewXObjectForm ();_ebd .Resources =_eag ;_ebd .BBox =_cf .MakeArrayFromFloats ([]float64 {0,0,_dc ,_ca });_ebd .SetContentStream (_gcb .Bytes (),_beea ());_ddc :=_cf .MakeDict ();_ddc .Set ("\u004e",_ebd .ToPdfObject ());return _ddc ,nil ;};
|
|
|
|
|
|
// Style returns the appearance style of `fa`. If not specified, returns default style.
|
|
func (_fcc FieldAppearance )Style ()AppearanceStyle {if _fcc ._da !=nil {return *_fcc ._da ;};return AppearanceStyle {AutoFontSizeFraction :0.65,CheckmarkRune :'✔',BorderSize :0.0,BorderColor :_cb .NewPdfColorDeviceGray (0),FillColor :_cb .NewPdfColorDeviceGray (1),MultilineLineHeight :1.2,MultilineVAlignMiddle :false ,DrawAlignmentReticle :false ,AllowMK :true };
|
|
};
|
|
|
|
// WrapContentStream ensures that the entire content stream for a `page` is wrapped within q ... Q operands.
|
|
// Ensures that following operands that are added are not affected by additional operands that are added.
|
|
// Implements interface model.ContentStreamWrapper.
|
|
func (_gedd FieldAppearance )WrapContentStream (page *_cb .PdfPage )error {_bafd ,_def :=page .GetAllContentStreams ();if _def !=nil {return _def ;};_bggg :=_d .NewContentStreamParser (_bafd );_fdb ,_def :=_bggg .Parse ();if _def !=nil {return _def ;};
|
|
_fdb .WrapIfNeeded ();_dbcg :=[]string {_fdb .String ()};return page .SetContentStreams (_dbcg ,_beea ());};func _gced (_cdgd LineAnnotationDef )(*_cf .PdfObjectDictionary ,*_cb .PdfRectangle ,error ){_bad :=_cb .NewXObjectForm ();_bad .Resources =_cb .NewPdfPageResources ();
|
|
_bcdb :="";if _cdgd .Opacity < 1.0{_aafa :=_cf .MakeDict ();_aafa .Set ("\u0063\u0061",_cf .MakeFloat (_cdgd .Opacity ));_caab :=_bad .Resources .AddExtGState ("\u0067\u0073\u0031",_aafa );if _caab !=nil {_a .Log .Debug ("U\u006e\u0061\u0062\u006c\u0065\u0020t\u006f\u0020\u0061\u0064\u0064\u0020\u0065\u0078\u0074g\u0073\u0074\u0061t\u0065 \u0067\u0073\u0031");
|
|
return nil ,nil ,_caab ;};_bcdb ="\u0067\u0073\u0031";};_eaaef ,_edaf ,_dgef ,_fcgc :=_aaab (_cdgd ,_bcdb );if _fcgc !=nil {return nil ,nil ,_fcgc ;};_fcgc =_bad .SetContentStream (_eaaef ,nil );if _fcgc !=nil {return nil ,nil ,_fcgc ;};_bad .BBox =_edaf .ToPdfObject ();
|
|
_gacf :=_cf .MakeDict ();_gacf .Set ("\u004e",_bad .ToPdfObject ());return _gacf ,_dgef ,nil ;};
|
|
|
|
// NewSignatureFieldOpts returns a new initialized instance of options
|
|
// used to generate a signature appearance.
|
|
func NewSignatureFieldOpts ()*SignatureFieldOpts {return &SignatureFieldOpts {Font :_cb .DefaultFont (),FontSize :10,LineHeight :1,AutoSize :true ,TextColor :_cb .NewPdfColorDeviceGray (0),BorderColor :_cb .NewPdfColorDeviceGray (0),FillColor :_cb .NewPdfColorDeviceGray (1),Encoder :_cf .NewFlateEncoder (),ImagePosition :SignatureImageLeft };
|
|
};
|
|
|
|
// NewCheckboxField generates a new checkbox field with partial name `name` at location `rect`
|
|
// on specified `page` and with field specific options `opt`.
|
|
func NewCheckboxField (page *_cb .PdfPage ,name string ,rect []float64 ,opt CheckboxFieldOptions )(*_cb .PdfFieldButton ,error ){if page ==nil {return nil ,_aa .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");
|
|
};if len (name )<=0{return nil ,_aa .New ("\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0064\u0020\u0061\u0074\u0074\u0072\u0069\u0062u\u0074e\u0020\u006e\u006f\u0074\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064");};if len (rect )!=4{return nil ,_aa .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");
|
|
};_ebea ,_beb :=_cb .NewStandard14Font (_cb .ZapfDingbatsName );if _beb !=nil {return nil ,_beb ;};_fda :=_cb .NewPdfField ();_cdb :=&_cb .PdfFieldButton {};_fda .SetContext (_cdb );_cdb .PdfField =_fda ;_cdb .T =_cf .MakeString (name );_cdb .SetType (_cb .ButtonTypeCheckbox );
|
|
_caa :="\u004f\u0066\u0066";if opt .Checked {_caa ="\u0059\u0065\u0073";};_cdb .V =_cf .MakeName (_caa );_bbb :=_cb .NewPdfAnnotationWidget ();_bbb .Rect =_cf .MakeArrayFromFloats (rect );_bbb .P =page .ToPdfObject ();_bbb .F =_cf .MakeInteger (4);_bbb .Parent =_cdb .ToPdfObject ();
|
|
_ebb :=rect [2]-rect [0];_fbe :=rect [3]-rect [1];var _febb _b .Buffer ;_febb .WriteString ("\u0071\u000a");_febb .WriteString ("\u0030 \u0030\u0020\u0031\u0020\u0072\u0067\n");_febb .WriteString ("\u0042\u0054\u000a");_febb .WriteString ("\u002f\u005a\u0061D\u0062\u0020\u0031\u0032\u0020\u0054\u0066\u000a");
|
|
_febb .WriteString ("\u0045\u0054\u000a");_febb .WriteString ("\u0051\u000a");_gfbg :=_d .NewContentCreator ();_gfbg .Add_q ();_gfbg .Add_rg (0,0,1);_gfbg .Add_BT ();_gfbg .Add_Tf (*_cf .MakeName ("\u005a\u0061\u0044\u0062"),12);_gfbg .Add_Td (0,0);_gfbg .Add_ET ();
|
|
_gfbg .Add_Q ();_gcfc :=_cb .NewXObjectForm ();_gcfc .SetContentStream (_gfbg .Bytes (),_cf .NewRawEncoder ());_gcfc .BBox =_cf .MakeArrayFromFloats ([]float64 {0,0,_ebb ,_fbe });_gcfc .Resources =_cb .NewPdfPageResources ();_gcfc .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_ebea .ToPdfObject ());
|
|
_gfbg =_d .NewContentCreator ();_gfbg .Add_q ();_gfbg .Add_re (0,0,_ebb ,_fbe );_gfbg .Add_W ().Add_n ();_gfbg .Add_rg (0,0,1);_gfbg .Translate (0,3.0);_gfbg .Add_BT ();_gfbg .Add_Tf (*_cf .MakeName ("\u005a\u0061\u0044\u0062"),12);_gfbg .Add_Td (0,0);
|
|
_gfbg .Add_Tj (*_cf .MakeString ("\u0034"));_gfbg .Add_ET ();_gfbg .Add_Q ();_cga :=_cb .NewXObjectForm ();_cga .SetContentStream (_gfbg .Bytes (),_cf .NewRawEncoder ());_cga .BBox =_cf .MakeArrayFromFloats ([]float64 {0,0,_ebb ,_fbe });_cga .Resources =_cb .NewPdfPageResources ();
|
|
_cga .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_ebea .ToPdfObject ());_cadd :=_cf .MakeDict ();_cadd .Set ("\u004f\u0066\u0066",_gcfc .ToPdfObject ());_cadd .Set ("\u0059\u0065\u0073",_cga .ToPdfObject ());_fff :=_cf .MakeDict ();_fff .Set ("\u004e",_cadd );
|
|
_bbb .AP =_fff ;_bbb .AS =_cf .MakeName (_caa );_cdb .Annotations =append (_cdb .Annotations ,_bbb );return _cdb ,nil ;};
|
|
|
|
// SignatureLine represents a line of information in the signature field appearance.
|
|
type SignatureLine struct{Desc string ;Text string ;};func _beea ()_cf .StreamEncoder {return _cf .NewFlateEncoder ()};
|
|
|
|
// CircleAnnotationDef defines a circle annotation or ellipse at position (X, Y) and Width and Height.
|
|
// The annotation has various style parameters including Fill and Border options and Opacity.
|
|
type CircleAnnotationDef struct{X float64 ;Y float64 ;Width float64 ;Height float64 ;FillEnabled bool ;FillColor *_cb .PdfColorDeviceRGB ;BorderEnabled bool ;BorderWidth float64 ;BorderColor *_cb .PdfColorDeviceRGB ;Opacity float64 ;};
|
|
|
|
// GenerateAppearanceDict generates an appearance dictionary for widget annotation `wa` for the `field` in `form`.
|
|
// Implements interface model.FieldAppearanceGenerator.
|
|
func (_bf FieldAppearance )GenerateAppearanceDict (form *_cb .PdfAcroForm ,field *_cb .PdfField ,wa *_cb .PdfAnnotationWidget )(*_cf .PdfObjectDictionary ,error ){_a .Log .Trace ("\u0047\u0065n\u0065\u0072\u0061\u0074e\u0041\u0070p\u0065\u0061\u0072\u0061\u006e\u0063\u0065\u0044i\u0063\u0074\u0020\u0066\u006f\u0072\u0020\u0025\u0076\u0020\u0020\u0056:\u0020\u0025\u002b\u0076",field .PartialName (),field .V );
|
|
_ ,_edd :=field .GetContext ().(*_cb .PdfFieldText );_dfg ,_ead :=_cf .GetDict (wa .AP );if _ead &&_bf .OnlyIfMissing &&(!_edd ||!_bf .RegenerateTextFields ){_a .Log .Trace ("\u0041\u006c\u0072\u0065a\u0064\u0079\u0020\u0070\u006f\u0070\u0075\u006c\u0061\u0074e\u0064 \u002d\u0020\u0069\u0067\u006e\u006f\u0072i\u006e\u0067");
|
|
return _dfg ,nil ;};if form .DR ==nil {form .DR =_cb .NewPdfPageResources ();};switch _ce :=field .GetContext ().(type ){case *_cb .PdfFieldText :_fg :=_ce ;switch {case _fg .Flags ().Has (_cb .FieldFlagPassword ):return nil ,nil ;case _fg .Flags ().Has (_cb .FieldFlagFileSelect ):return nil ,nil ;
|
|
case _fg .Flags ().Has (_cb .FieldFlagComb ):if _fg .MaxLen !=nil {_ab ,_eea :=_gegc (wa ,_fg ,form .DR ,_bf .Style ());if _eea !=nil {return nil ,_eea ;};return _ab ,nil ;};};_bcb ,_af :=_gf (wa ,_fg ,form .DR ,_bf .Style ());if _af !=nil {return nil ,_af ;
|
|
};return _bcb ,nil ;case *_cb .PdfFieldButton :_cgd :=_ce ;if _cgd .IsCheckbox (){_geg ,_bgf :=_aaae (wa ,_cgd ,form .DR ,_bf .Style ());if _bgf !=nil {return nil ,_bgf ;};return _geg ,nil ;};_a .Log .Debug ("\u0054\u004f\u0044\u004f\u003a\u0020\u0055\u004e\u0048\u0041\u004e\u0044\u004c\u0045\u0044 \u0062u\u0074\u0074\u006f\u006e\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u002b\u0076",_cgd .GetType ());
|
|
case *_cb .PdfFieldChoice :_bbd :=_ce ;switch {case _bbd .Flags ().Has (_cb .FieldFlagCombo ):_cce ,_dga :=_ccfd (form ,wa ,_bbd ,_bf .Style ());if _dga !=nil {return nil ,_dga ;};return _cce ,nil ;default:_a .Log .Debug ("\u0054\u004f\u0044\u004f\u003a\u0020\u0055N\u0048\u0041\u004eD\u004c\u0045\u0044\u0020c\u0068\u006f\u0069\u0063\u0065\u0020\u0066\u0069\u0065\u006c\u0064\u0020\u0077\u0069\u0074\u0068\u0020\u0066\u006c\u0061\u0067\u0073\u003a\u0020\u0025\u0073",_bbd .Flags ().String ());
|
|
};default:_a .Log .Debug ("\u0054\u004f\u0044\u004f\u003a\u0020\u0055\u004e\u0048\u0041N\u0044\u004c\u0045\u0044\u0020\u0066\u0069e\u006c\u0064\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0054",_ce );};return nil ,nil ;};const (_df quadding =0;_gec quadding =1;
|
|
_fee quadding =2;);func _gcaa (_ebag RectangleAnnotationDef ,_adcg string )([]byte ,*_cb .PdfRectangle ,*_cb .PdfRectangle ,error ){_fbcc :=_f .Rectangle {X :0,Y :0,Width :_ebag .Width ,Height :_ebag .Height ,FillEnabled :_ebag .FillEnabled ,FillColor :_ebag .FillColor ,BorderEnabled :_ebag .BorderEnabled ,BorderWidth :2*_ebag .BorderWidth ,BorderColor :_ebag .BorderColor ,Opacity :_ebag .Opacity };
|
|
_eacg ,_baca ,_cbbb :=_fbcc .Draw (_adcg );if _cbbb !=nil {return nil ,nil ,nil ,_cbbb ;};_gdfg :=&_cb .PdfRectangle {};_gdfg .Llx =_ebag .X +_baca .Llx ;_gdfg .Lly =_ebag .Y +_baca .Lly ;_gdfg .Urx =_ebag .X +_baca .Urx ;_gdfg .Ury =_ebag .Y +_baca .Ury ;
|
|
return _eacg ,_baca ,_gdfg ,nil ;};
|
|
|
|
// FieldAppearance implements interface model.FieldAppearanceGenerator and generates appearance streams
|
|
// for fields taking into account what value is in the field. A common use case is for generating the
|
|
// appearance stream prior to flattening fields.
|
|
//
|
|
// If `OnlyIfMissing` is true, the field appearance is generated only for fields that do not have an
|
|
// appearance stream specified.
|
|
// If `RegenerateTextFields` is true, all text fields are regenerated (even if OnlyIfMissing is true).
|
|
type FieldAppearance struct{OnlyIfMissing bool ;RegenerateTextFields bool ;_da *AppearanceStyle ;};func _eeac (_cbce RectangleAnnotationDef )(*_cf .PdfObjectDictionary ,*_cb .PdfRectangle ,error ){_ccbf :=_cb .NewXObjectForm ();_ccbf .Resources =_cb .NewPdfPageResources ();
|
|
_gead :="";if _cbce .Opacity < 1.0{_dbg :=_cf .MakeDict ();_dbg .Set ("\u0063\u0061",_cf .MakeFloat (_cbce .Opacity ));_dbg .Set ("\u0043\u0041",_cf .MakeFloat (_cbce .Opacity ));_cfbdg :=_ccbf .Resources .AddExtGState ("\u0067\u0073\u0031",_dbg );if _cfbdg !=nil {_a .Log .Debug ("U\u006e\u0061\u0062\u006c\u0065\u0020t\u006f\u0020\u0061\u0064\u0064\u0020\u0065\u0078\u0074g\u0073\u0074\u0061t\u0065 \u0067\u0073\u0031");
|
|
return nil ,nil ,_cfbdg ;};_gead ="\u0067\u0073\u0031";};_fed ,_cba ,_deef ,_fad :=_gcaa (_cbce ,_gead );if _fad !=nil {return nil ,nil ,_fad ;};_fad =_ccbf .SetContentStream (_fed ,nil );if _fad !=nil {return nil ,nil ,_fad ;};_ccbf .BBox =_cba .ToPdfObject ();
|
|
_aebg :=_cf .MakeDict ();_aebg .Set ("\u004e",_ccbf .ToPdfObject ());return _aebg ,_deef ,nil ;};
|
|
|
|
// CreateLineAnnotation creates a line annotation object that can be added to page PDF annotations.
|
|
func CreateLineAnnotation (lineDef LineAnnotationDef )(*_cb .PdfAnnotation ,error ){_accf :=_cb .NewPdfAnnotationLine ();_accf .L =_cf .MakeArrayFromFloats ([]float64 {lineDef .X1 ,lineDef .Y1 ,lineDef .X2 ,lineDef .Y2 });_ddca :=_cf .MakeName ("\u004e\u006f\u006e\u0065");
|
|
if lineDef .LineEndingStyle1 ==_f .LineEndingStyleArrow {_ddca =_cf .MakeName ("C\u006c\u006f\u0073\u0065\u0064\u0041\u0072\u0072\u006f\u0077");};_gfd :=_cf .MakeName ("\u004e\u006f\u006e\u0065");if lineDef .LineEndingStyle2 ==_f .LineEndingStyleArrow {_gfd =_cf .MakeName ("C\u006c\u006f\u0073\u0065\u0064\u0041\u0072\u0072\u006f\u0077");
|
|
};_accf .LE =_cf .MakeArray (_ddca ,_gfd );if lineDef .Opacity < 1.0{_accf .CA =_cf .MakeFloat (lineDef .Opacity );};_ggef ,_bdeb ,_gcfb :=lineDef .LineColor .R (),lineDef .LineColor .G (),lineDef .LineColor .B ();_accf .IC =_cf .MakeArrayFromFloats ([]float64 {_ggef ,_bdeb ,_gcfb });
|
|
_accf .C =_cf .MakeArrayFromFloats ([]float64 {_ggef ,_bdeb ,_gcfb });_gfcc :=_cb .NewBorderStyle ();_gfcc .SetBorderWidth (lineDef .LineWidth );_accf .BS =_gfcc .ToPdfObject ();_ddd ,_ece ,_adfc :=_gced (lineDef );if _adfc !=nil {return nil ,_adfc ;};
|
|
_accf .AP =_ddd ;_accf .Rect =_cf .MakeArrayFromFloats ([]float64 {_ece .Llx ,_ece .Lly ,_ece .Urx ,_ece .Ury });return _accf .PdfAnnotation ,nil ;};
|
|
|
|
// CreateRectangleAnnotation creates a rectangle annotation object that can be added to page PDF annotations.
|
|
func CreateRectangleAnnotation (rectDef RectangleAnnotationDef )(*_cb .PdfAnnotation ,error ){_efff :=_cb .NewPdfAnnotationSquare ();if rectDef .BorderEnabled {_ega ,_gfccg ,_eabd :=rectDef .BorderColor .R (),rectDef .BorderColor .G (),rectDef .BorderColor .B ();
|
|
_efff .C =_cf .MakeArrayFromFloats ([]float64 {_ega ,_gfccg ,_eabd });_ggee :=_cb .NewBorderStyle ();_ggee .SetBorderWidth (rectDef .BorderWidth );_efff .BS =_ggee .ToPdfObject ();};if rectDef .FillEnabled {_cffg ,_gadd ,_ebfd :=rectDef .FillColor .R (),rectDef .FillColor .G (),rectDef .FillColor .B ();
|
|
_efff .IC =_cf .MakeArrayFromFloats ([]float64 {_cffg ,_gadd ,_ebfd });}else {_efff .IC =_cf .MakeArrayFromIntegers ([]int {});};if rectDef .Opacity < 1.0{_efff .CA =_cf .MakeFloat (rectDef .Opacity );};_ddec ,_gfba ,_eed :=_eeac (rectDef );if _eed !=nil {return nil ,_eed ;
|
|
};_efff .AP =_ddec ;_efff .Rect =_cf .MakeArrayFromFloats ([]float64 {_gfba .Llx ,_gfba .Lly ,_gfba .Urx ,_gfba .Ury });return _efff .PdfAnnotation ,nil ;};
|
|
|
|
// NewComboboxField generates a new combobox form field with partial name `name` at location `rect`
|
|
// on specified `page` and with field specific options `opt`.
|
|
func NewComboboxField (page *_cb .PdfPage ,name string ,rect []float64 ,opt ComboboxFieldOptions )(*_cb .PdfFieldChoice ,error ){if page ==nil {return nil ,_aa .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");
|
|
};if len (name )<=0{return nil ,_aa .New ("\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0064\u0020\u0061\u0074\u0074\u0072\u0069\u0062u\u0074e\u0020\u006e\u006f\u0074\u0020\u0073\u0070\u0065\u0063\u0069\u0066\u0069\u0065\u0064");};if len (rect )!=4{return nil ,_aa .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");
|
|
};_bfbe :=_cb .NewPdfField ();_agcb :=&_cb .PdfFieldChoice {};_bfbe .SetContext (_agcb );_agcb .PdfField =_bfbe ;_agcb .T =_cf .MakeString (name );_agcb .Opt =_cf .MakeArray ();for _ ,_gef :=range opt .Choices {_agcb .Opt .Append (_cf .MakeString (_gef ));
|
|
};_agcb .SetFlag (_cb .FieldFlagCombo );_fcd :=_cb .NewPdfAnnotationWidget ();_fcd .Rect =_cf .MakeArrayFromFloats (rect );_fcd .P =page .ToPdfObject ();_fcd .F =_cf .MakeInteger (4);_fcd .Parent =_agcb .ToPdfObject ();_agcb .Annotations =append (_agcb .Annotations ,_fcd );
|
|
return _agcb ,nil ;};
|
|
|
|
// CheckboxFieldOptions defines optional parameters for a checkbox field a form.
|
|
type CheckboxFieldOptions struct{Checked bool ;};func _gca (_cafe []*SignatureLine ,_cebd *SignatureFieldOpts )(*_cf .PdfObjectDictionary ,error ){if _cebd ==nil {_cebd =NewSignatureFieldOpts ();};var _cgc error ;var _dae *_cf .PdfObjectName ;_dcg :=_cebd .Font ;
|
|
if _dcg !=nil {_fbgf ,_ :=_dcg .GetFontDescriptor ();if _fbgf !=nil {if _gdd ,_eff :=_fbgf .FontName .(*_cf .PdfObjectName );_eff {_dae =_gdd ;};};if _dae ==nil {_dae =_cf .MakeName ("\u0046\u006f\u006et\u0031");};}else {if _dcg ,_cgc =_cb .NewStandard14Font ("\u0048e\u006c\u0076\u0065\u0074\u0069\u0063a");
|
|
_cgc !=nil {return nil ,_cgc ;};_dae =_cf .MakeName ("\u0048\u0065\u006c\u0076");};_edb :=_cebd .FontSize ;if _edb <=0{_edb =10;};if _cebd .LineHeight <=0{_cebd .LineHeight =1;};_dbeb :=_cebd .LineHeight *_edb ;_fab ,_ggbe :=_dcg .GetRuneMetrics (' ');
|
|
if !_ggbe {return nil ,_aa .New ("\u0074\u0068e \u0066\u006f\u006et\u0020\u0064\u006f\u0065s n\u006ft \u0068\u0061\u0076\u0065\u0020\u0061\u0020sp\u0061\u0063\u0065\u0020\u0067\u006c\u0079p\u0068");};_cfbd :=_fab .Wx ;var _cfca float64 ;var _gbb []string ;
|
|
for _ ,_bab :=range _cafe {if _bab .Text ==""{continue ;};_dde :=_bab .Text ;if _bab .Desc !=""{_dde =_bab .Desc +"\u003a\u0020"+_dde ;};_gbb =append (_gbb ,_dde );var _ccgd float64 ;for _ ,_dbcc :=range _dde {_ggec ,_gdea :=_dcg .GetRuneMetrics (_dbcc );
|
|
if !_gdea {continue ;};_ccgd +=_ggec .Wx ;};if _ccgd > _cfca {_cfca =_ccgd ;};};_cfca =_cfca *_edb /1000.0;_daa :=float64 (len (_gbb ))*_dbeb ;_bef :=_cebd .Image !=nil ;_gfge :=_cebd .Rect ;if _gfge ==nil {_gfge =[]float64 {0,0,_cfca ,_daa };if _bef {_gfge [2]=_cfca *2;
|
|
_gfge [3]=_daa *2;};_cebd .Rect =_gfge ;};_gda :=_gfge [2]-_gfge [0];_fgbb :=_gfge [3]-_gfge [1];_fbgd ,_bfgf :=_gfge ,_gfge ;var _dbd ,_bda float64 ;if _bef &&len (_gbb )> 0{if _cebd .ImagePosition <=SignatureImageRight {_bdfd :=[]float64 {_gfge [0],_gfge [1],_gfge [0]+(_gda /2),_gfge [3]};
|
|
_bgc :=[]float64 {_gfge [0]+(_gda /2),_gfge [1],_gfge [2],_gfge [3]};if _cebd .ImagePosition ==SignatureImageLeft {_fbgd ,_bfgf =_bdfd ,_bgc ;}else {_fbgd ,_bfgf =_bgc ,_bdfd ;};}else {_dfc :=[]float64 {_gfge [0],_gfge [1],_gfge [2],_gfge [1]+(_fgbb /2)};
|
|
_eca :=[]float64 {_gfge [0],_gfge [1]+(_fgbb /2),_gfge [2],_gfge [3]};if _cebd .ImagePosition ==SignatureImageTop {_fbgd ,_bfgf =_eca ,_dfc ;}else {_fbgd ,_bfgf =_dfc ,_eca ;};};};_dbd =_bfgf [2]-_bfgf [0];_bda =_bfgf [3]-_bfgf [1];var _afcf float64 ;if _cebd .AutoSize {if _cfca > _dbd ||_daa > _bda {_efd :=_cd .Min (_dbd /_cfca ,_bda /_daa );
|
|
_edb *=_efd ;};_dbeb =_cebd .LineHeight *_edb ;_afcf +=(_bda -float64 (len (_gbb ))*_dbeb )/2;};_cgeg :=_d .NewContentCreator ();_ffad :=_cb .NewPdfPageResources ();_ffad .SetFontByName (*_dae ,_dcg .ToPdfObject ());if _cebd .BorderSize <=0{_cebd .BorderSize =0;
|
|
_cebd .BorderColor =_cb .NewPdfColorDeviceGray (1);};if _cebd .BorderColor ==nil {_cebd .BorderColor =_cb .NewPdfColorDeviceGray (1);};if _cebd .FillColor ==nil {_cebd .FillColor =_cb .NewPdfColorDeviceGray (1);};_cgeg .Add_q ().SetNonStrokingColor (_cebd .FillColor ).SetStrokingColor (_cebd .BorderColor ).Add_w (_cebd .BorderSize ).Add_re (_gfge [0],_gfge [1],_gda ,_fgbb ).Add_B ().Add_Q ();
|
|
if _cebd .WatermarkImage !=nil {_fece :=[]float64 {_gfge [0],_gfge [1],_gfge [2],_gfge [3]};_gdcf ,_eac ,_effa :=_dgg (_cebd .WatermarkImage ,"\u0049\u006d\u0061\u0067\u0065\u0057\u0061\u0074\u0065r\u006d\u0061\u0072\u006b",_cebd ,_fece ,_cgeg );if _effa !=nil {return nil ,_effa ;
|
|
};_ffad .SetXObjectImageByName (*_gdcf ,_eac );};_cgeg .Add_q ();_cgeg .Translate (_bfgf [0],_bfgf [3]-_dbeb -_afcf );_cgeg .Add_BT ();_deg :=_dcg .Encoder ();for _ ,_beff :=range _gbb {var _bcf []byte ;for _ ,_gega :=range _beff {if _ad .IsSpace (_gega ){if len (_bcf )> 0{_cgeg .SetNonStrokingColor (_cebd .TextColor ).Add_Tf (*_dae ,_edb ).Add_TL (_dbeb ).Add_TJ ([]_cf .PdfObject {_cf .MakeStringFromBytes (_bcf )}...);
|
|
_bcf =nil ;};_cgeg .Add_Tf (*_dae ,_edb ).Add_TL (_dbeb ).Add_TJ ([]_cf .PdfObject {_cf .MakeFloat (-_cfbd )}...);}else {_bcf =append (_bcf ,_deg .Encode (string (_gega ))...);};};if len (_bcf )> 0{_cgeg .SetNonStrokingColor (_cebd .TextColor ).Add_Tf (*_dae ,_edb ).Add_TL (_dbeb ).Add_TJ ([]_cf .PdfObject {_cf .MakeStringFromBytes (_bcf )}...);
|
|
};_cgeg .Add_Td (0,-_dbeb );};_cgeg .Add_ET ();_cgeg .Add_Q ();if _bef {_cag ,_dfcb ,_cfe :=_dgg (_cebd .Image ,"\u0049\u006d\u0061\u0067\u0065\u0053\u0069\u0067\u006ea\u0074\u0075\u0072\u0065",_cebd ,_fbgd ,_cgeg );if _cfe !=nil {return nil ,_cfe ;};_ffad .SetXObjectImageByName (*_cag ,_dfcb );
|
|
};_fcbf :=_cb .NewXObjectForm ();_fcbf .Resources =_ffad ;_fcbf .BBox =_cf .MakeArrayFromFloats (_gfge );_fcbf .SetContentStream (_cgeg .Bytes (),_beea ());_dfga :=_cf .MakeDict ();_dfga .Set ("\u004e",_fcbf .ToPdfObject ());return _dfga ,nil ;};
|
|
|
|
// NewSignatureLine returns a new signature line displayed as a part of the
|
|
// signature field appearance.
|
|
func NewSignatureLine (desc ,text string )*SignatureLine {return &SignatureLine {Desc :desc ,Text :text };};
|
|
|
|
// AppearanceFont represents a font used for generating the appearance of a
|
|
// field in the filling/flattening process.
|
|
type AppearanceFont struct{
|
|
|
|
// Name represents the name of the font which will be added to the
|
|
// AcroForm resources (DR).
|
|
Name string ;
|
|
|
|
// Font represents the actual font used for the field appearance.
|
|
Font *_cb .PdfFont ;
|
|
|
|
// Size represents the size of the font used for the field appearance.
|
|
// If size is 0, a default font size will be used.
|
|
// The default font size is calculated using the available annotation
|
|
// height and the AutoFontSizeFraction of the AppearanceStyle.
|
|
Size float64 ;};func _dgg (_ddg _cg .Image ,_adf string ,_gbeef *SignatureFieldOpts ,_gage []float64 ,_cad *_d .ContentCreator )(*_cf .PdfObjectName ,*_cb .XObjectImage ,error ){_bgce ,_edace :=_cb .DefaultImageHandler {}.NewImageFromGoImage (_ddg );if _edace !=nil {return nil ,nil ,_edace ;
|
|
};_ceg ,_edace :=_cb .NewXObjectImageFromImage (_bgce ,nil ,_gbeef .Encoder );if _edace !=nil {return nil ,nil ,_edace ;};_aadgd ,_dee :=float64 (*_ceg .Width ),float64 (*_ceg .Height );_dcf :=_gage [2]-_gage [0];_dad :=_gage [3]-_gage [1];if _gbeef .AutoSize {_afec :=_cd .Min (_dcf /_aadgd ,_dad /_dee );
|
|
_aadgd *=_afec ;_dee *=_afec ;_gage [0]=_gage [0]+(_dcf /2)-(_aadgd /2);_gage [1]=_gage [1]+(_dad /2)-(_dee /2);};var _dba *_cf .PdfObjectName ;if _eacf ,_bcab :=_cf .GetName (_ceg .Name );_bcab {_dba =_eacf ;}else {_dba =_cf .MakeName (_adf );};if _cad !=nil {_cad .Add_q ().Translate (_gage [0],_gage [1]).Scale (_aadgd ,_dee ).Add_Do (*_dba ).Add_Q ();
|
|
}else {return nil ,nil ,_aa .New ("\u0043\u006f\u006e\u0074en\u0074\u0043\u0072\u0065\u0061\u0074\u006f\u0072\u0020\u0069\u0073\u0020\u006e\u0075l\u006c");};return _dba ,_ceg ,nil ;};
|
|
|
|
// RectangleAnnotationDef is a rectangle defined with a specified Width and Height and a lower left corner at (X,Y).
|
|
// The rectangle can optionally have a border and a filling color.
|
|
// The Width/Height includes the border (if any specified).
|
|
type RectangleAnnotationDef struct{X float64 ;Y float64 ;Width float64 ;Height float64 ;FillEnabled bool ;FillColor *_cb .PdfColorDeviceRGB ;BorderEnabled bool ;BorderWidth float64 ;BorderColor *_cb .PdfColorDeviceRGB ;Opacity float64 ;};func _cede (_agge *_cb .PdfField ,_dbc ,_fbg float64 ,_eadf string ,_bca AppearanceStyle ,_gadf *_d .ContentStreamOperations ,_bcge *_cb .PdfPageResources ,_bfb *_cf .PdfObjectDictionary )(*_cb .XObjectForm ,error ){_ffe :=_cb .NewPdfPageResources ();
|
|
_cbc ,_gdf :=_dbc ,_fbg ;_cfdf :=_d .NewContentCreator ();if _bca .BorderSize > 0{_dgc (_cfdf ,_bca ,_dbc ,_fbg );};if _bca .DrawAlignmentReticle {_eaae :=_bca ;_eaae .BorderSize =0.2;_eaff (_cfdf ,_eaae ,_dbc ,_fbg );};_cfdf .Add_BMC ("\u0054\u0078");
|
|
_cfdf .Add_q ();_cfdf .Add_BT ();_dbc ,_fbg =_bca .applyRotation (_bfb ,_dbc ,_fbg ,_cfdf );_ddfc ,_gbc ,_bfca :=_bca .processDA (_agge ,_gadf ,_bcge ,_ffe ,_cfdf );if _bfca !=nil {return nil ,_bfca ;};_acc :=_ddfc .Font ;_bbc :=_ddfc .Size ;_bceg :=_cf .MakeName (_ddfc .Name );
|
|
_gccg :=_bbc ==0;if _gccg &&_gbc {_bbc =_fbg *_bca .AutoFontSizeFraction ;};_edfd :=_acc .Encoder ();if _edfd ==nil {_a .Log .Debug ("\u0057\u0041RN\u003a\u0020\u0066\u006f\u006e\u0074\u0020\u0065\u006e\u0063\u006f\u0064\u0065\u0072\u0020\u0069\u0073\u0020\u006e\u0069l\u002e\u0020\u0041\u0073s\u0075\u006d\u0069\u006eg \u0069\u0064e\u006et\u0069\u0074\u0079\u0020\u0065\u006ec\u006f\u0064\u0065r\u002e\u0020O\u0075\u0074\u0070\u0075\u0074\u0020\u006d\u0061\u0079\u0020\u0062\u0065\u0020\u0069n\u0063\u006f\u0072\u0072\u0065\u0063\u0074\u002e");
|
|
_edfd =_e .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};if len (_eadf )==0{return nil ,nil ;};_gfaa :=2.0;_ffd :=0.0;if _edfd !=nil {for _ ,_bfed :=range _eadf {_accd ,_gcbd :=_acc .GetRuneMetrics (_bfed );if !_gcbd {_a .Log .Debug ("\u0046\u006f\u006e\u0074\u0020\u0064o\u0065\u0073\u0020\u006e\u006f\u0074\u0020\u0068\u0061\u0076\u0065\u0020\u0072\u0075\u006e\u0065\u0020\u006d\u0065\u0074r\u0069\u0063\u0073\u0020\u0066\u006f\u0072\u0020\u0025\u0076\u0020\u002d\u0020\u0073k\u0069p\u0070\u0069\u006e\u0067",_bfed );
|
|
continue ;};_ffd +=_accd .Wx ;};_eadf =string (_edfd .Encode (_eadf ));};if _bbc ==0||_gccg &&_ffd > 0&&_gfaa +_ffd *_bbc /1000.0> _dbc {_bbc =0.95*1000.0*(_dbc -_gfaa )/_ffd ;};_bac :=1.0*_bbc ;_ggaa :=2.0;{_ebfb :=_bac ;if _gccg &&_ggaa +_ebfb > _fbg {_bbc =0.95*(_fbg -_ggaa );
|
|
_bac =1.0*_bbc ;_ebfb =_bac ;};if _fbg > _ebfb {_ggaa =(_fbg -_ebfb )/2.0;_ggaa +=1.50;};};_cfdf .Add_Tf (*_bceg ,_bbc );_cfdf .Add_Td (_gfaa ,_ggaa );_cfdf .Add_Tj (*_cf .MakeString (_eadf ));_cfdf .Add_ET ();_cfdf .Add_Q ();_cfdf .Add_EMC ();_afe :=_cb .NewXObjectForm ();
|
|
_afe .Resources =_ffe ;_afe .BBox =_cf .MakeArrayFromFloats ([]float64 {0,0,_cbc ,_gdf });_afe .SetContentStream (_cfdf .Bytes (),_beea ());return _afe ,nil ;}; |