unipdf/annotator/annotator.go
2021-04-06 22:35:37 +00:00

363 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";_fg "errors";_f "github.com/unidoc/unipdf/v3/common";_g "github.com/unidoc/unipdf/v3/contentstream";_cf "github.com/unidoc/unipdf/v3/contentstream/draw";_fc "github.com/unidoc/unipdf/v3/core";_c "github.com/unidoc/unipdf/v3/internal/textencoding";
_ff "github.com/unidoc/unipdf/v3/model";_e "image";_ccg "math";_ag "strings";_cc "unicode";);
// TextFieldOptions defines optional parameter for a text field in a form.
type TextFieldOptions struct{MaxLen int ;Value string ;};
// 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 *_ff .PdfColorDeviceRGB ;BorderEnabled bool ;BorderWidth float64 ;BorderColor *_ff .PdfColorDeviceRGB ;Opacity float64 ;};
// 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 (_bdd FieldAppearance )WrapContentStream (page *_ff .PdfPage )error {_edcaa ,_gbdg :=page .GetAllContentStreams ();if _gbdg !=nil {return _gbdg ;};_ccec :=_g .NewContentStreamParser (_edcaa );_bdc ,_gbdg :=_ccec .Parse ();if _gbdg !=nil {return _gbdg ;
};_bdc .WrapIfNeeded ();_acacd :=[]string {_bdc .String ()};return page .SetContentStreams (_acacd ,_edbc ());};
// SetStyle applies appearance `style` to `fa`.
func (_ebd *FieldAppearance )SetStyle (style AppearanceStyle ){_ebd ._ca =&style };func (_geb *AppearanceStyle )processDA (_gbd *_ff .PdfField ,_fedd *_g .ContentStreamOperations ,_edd ,_bab *_ff .PdfPageResources ,_cegf *_g .ContentCreator )(*AppearanceFont ,bool ,error ){var _faf *AppearanceFont ;
var _bfec bool ;if _geb .Fonts !=nil {if _geb .Fonts .Fallback !=nil {_faf =_geb .Fonts .Fallback ;};if _aede :=_geb .Fonts .FieldFallbacks ;_aede !=nil {if _gdge ,_fddc :=_aede [_gbd .PartialName ()];_fddc {_faf =_gdge ;}else if _acd ,_agbb :=_gbd .FullName ();
_agbb ==nil {if _efbg ,_ffc :=_aede [_acd ];_ffc {_faf =_efbg ;};};};_bfec =_geb .Fonts .ForceReplace ;};var _acac string ;var _cggg float64 ;var _edgd bool ;if _fedd !=nil {for _ ,_cga :=range *_fedd {if _cga .Operand =="\u0054\u0066"&&len (_cga .Params )==2{if _badc ,_efd :=_fc .GetNameVal (_cga .Params [0]);
_efd {_acac =_badc ;};if _gdbc ,_ggd :=_fc .GetNumberAsFloat (_cga .Params [1]);_ggd ==nil {_cggg =_gdbc ;};_edgd =true ;continue ;};_cegf .AddOperand (*_cga );};};var _ade *AppearanceFont ;var _egb _fc .PdfObject ;if _bfec &&_faf !=nil {_ade =_faf ;}else {if _edd !=nil &&_acac !=""{if _fff ,_afga :=_edd .GetFontByName (*_fc .MakeName (_acac ));
_afga {if _edbg ,_fgcc :=_ff .NewPdfFontFromPdfObject (_fff );_fgcc ==nil {_egb =_fff ;_ade =&AppearanceFont {Name :_acac ,Font :_edbg ,Size :_cggg };}else {_f .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",_fgcc );
};};};if _ade ==nil &&_faf !=nil {_ade =_faf ;};if _ade ==nil {_dadef ,_fbaa :=_ff .NewStandard14Font ("\u0048e\u006c\u0076\u0065\u0074\u0069\u0063a");if _fbaa !=nil {return nil ,false ,_fbaa ;};_ade =&AppearanceFont {Name :"\u0048\u0065\u006c\u0076",Font :_dadef ,Size :_cggg };
};};_dbf :=*_fc .MakeName (_ade .Name );if _egb ==nil {_egb =_ade .Font .ToPdfObject ();};if _edd !=nil &&!_edd .HasFontByName (_dbf ){_edd .SetFontByName (_dbf ,_egb );};if _bab !=nil &&!_bab .HasFontByName (_dbf ){_bab .SetFontByName (_dbf ,_egb );};
return _ade ,_edgd ,nil ;};func _ad (_ce CircleAnnotationDef ,_faa string )([]byte ,*_ff .PdfRectangle ,*_ff .PdfRectangle ,error ){_ab :=_cf .Circle {X :_ce .X ,Y :_ce .Y ,Width :_ce .Width ,Height :_ce .Height ,FillEnabled :_ce .FillEnabled ,FillColor :_ce .FillColor ,BorderEnabled :_ce .BorderEnabled ,BorderWidth :_ce .BorderWidth ,BorderColor :_ce .BorderColor ,Opacity :_ce .Opacity };
_eeb ,_eec ,_ddg :=_ab .Draw (_faa );if _ddg !=nil {return nil ,nil ,nil ,_ddg ;};_ddc :=&_ff .PdfRectangle {};_ddc .Llx =_ce .X +_eec .Llx ;_ddc .Lly =_ce .Y +_eec .Lly ;_ddc .Urx =_ce .X +_eec .Urx ;_ddc .Ury =_ce .Y +_eec .Ury ;return _eeb ,_eec ,_ddc ,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 *_ff .PdfColorDeviceRGB ;BorderEnabled bool ;BorderWidth float64 ;BorderColor *_ff .PdfColorDeviceRGB ;Opacity float64 ;};func _deg (_gg *_ff .PdfAnnotationWidget ,_bcc *_ff .PdfFieldButton ,_cgg *_ff .PdfPageResources ,_edec AppearanceStyle )(*_fc .PdfObjectDictionary ,error ){_ccgg ,_ddcb :=_fc .GetArray (_gg .Rect );
if !_ddcb {return nil ,_fg .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_dad ,_gaa :=_ff .NewPdfRectangle (*_ccgg );if _gaa !=nil {return nil ,_gaa ;};_aff ,_fccb :=_dad .Width (),_dad .Height ();_edge ,_caa :=_aff ,_fccb ;
_f .Log .Debug ("\u0043\u0068\u0065\u0063kb\u006f\u0078\u002c\u0020\u0077\u0061\u0020\u0042\u0053\u003a\u0020\u0025\u0076",_gg .BS );_dbg ,_gaa :=_ff .NewStandard14Font ("\u005a\u0061\u0070f\u0044\u0069\u006e\u0067\u0062\u0061\u0074\u0073");if _gaa !=nil {return nil ,_gaa ;
};_gab ,_bffg :=_fc .GetDict (_gg .MK );if _bffg {_fag ,_ :=_fc .GetDict (_gg .BS );_dabd :=_edec .applyAppearanceCharacteristics (_gab ,_fag ,_dbg );if _dabd !=nil {return nil ,_dabd ;};};_agf :=_ff .NewXObjectForm ();{_affc :=_g .NewContentCreator ();
if _edec .BorderSize > 0{_feec (_affc ,_edec ,_aff ,_fccb );};if _edec .DrawAlignmentReticle {_bbg :=_edec ;_bbg .BorderSize =0.2;_acc (_affc ,_bbg ,_aff ,_fccb );};_aff ,_fccb =_edec .applyRotation (_gab ,_aff ,_fccb ,_affc );_acgc :=_edec .AutoFontSizeFraction *_fccb ;
_edca ,_gfc :=_dbg .GetRuneMetrics (_edec .CheckmarkRune );if !_gfc {return nil ,_fg .New ("\u0067l\u0079p\u0068\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_baf :=_dbg .Encoder ();_fbg :=_baf .Encode (string (_edec .CheckmarkRune ));
_bbed :=_edca .Wx *_acgc /1000.0;_egaf :=705.0;_egfd :=_egaf /1000.0*_acgc ;_adb :=2.0;_bcg :=1.0;if _bbed < _aff {_adb =(_aff -_bbed )/2.0;};if _egfd < _fccb {_bcg =(_fccb -_egfd )/2.0;};_affc .Add_q ().Add_g (0).Add_BT ().Add_Tf ("\u005a\u0061\u0044\u0062",_acgc ).Add_Td (_adb ,_bcg ).Add_Tj (*_fc .MakeStringFromBytes (_fbg )).Add_ET ().Add_Q ();
_agf .Resources =_ff .NewPdfPageResources ();_agf .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_dbg .ToPdfObject ());_agf .BBox =_fc .MakeArrayFromFloats ([]float64 {0,0,_edge ,_caa });_agf .SetContentStream (_affc .Bytes (),_edbc ());};_fed :=_ff .NewXObjectForm ();
{_edee :=_g .NewContentCreator ();if _edec .BorderSize > 0{_feec (_edee ,_edec ,_aff ,_fccb );};_fed .BBox =_fc .MakeArrayFromFloats ([]float64 {0,0,_edge ,_caa });_fed .SetContentStream (_edee .Bytes (),_edbc ());};_dgd :=_fc .MakeDict ();_dgd .Set ("\u004f\u0066\u0066",_fed .ToPdfObject ());
_dgd .Set ("\u0059\u0065\u0073",_agf .ToPdfObject ());_dec :=_fc .MakeDict ();_dec .Set ("\u004e",_dgd );return _dec ,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 *_ff .PdfPage ,name string ,rect []float64 ,opt TextFieldOptions )(*_ff .PdfFieldText ,error ){if page ==nil {return nil ,_fg .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");};if len (name )<=0{return nil ,_fg .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 ,_fg .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");};_dee :=_ff .NewPdfField ();_fdb :=&_ff .PdfFieldText {};_dee .SetContext (_fdb );_fdb .PdfField =_dee ;_fdb .T =_fc .MakeString (name );
if opt .MaxLen > 0{_fdb .MaxLen =_fc .MakeInteger (int64 (opt .MaxLen ));};if len (opt .Value )> 0{_fdb .V =_fc .MakeString (opt .Value );};_gadc :=_ff .NewPdfAnnotationWidget ();_gadc .Rect =_fc .MakeArrayFromFloats (rect );_gadc .P =page .ToPdfObject ();
_gadc .F =_fc .MakeInteger (4);_gadc .Parent =_fdb .ToPdfObject ();_fdb .Annotations =append (_fdb .Annotations ,_gadc );return _fdb ,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 _ff .PdfColor ;FillColor _ff .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 ;};
// SignatureLine represents a line of information in the signature field appearance.
type SignatureLine struct{Desc string ;Text string ;};func _fdc (_ae *_ff .PdfAnnotationWidget ,_acgd *_ff .PdfFieldText ,_gde *_ff .PdfPageResources ,_ede AppearanceStyle )(*_fc .PdfObjectDictionary ,error ){_cad :=_ff .NewPdfPageResources ();_aef ,_gdd :=_fc .GetArray (_ae .Rect );
if !_gdd {return nil ,_fg .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_acgf ,_fec :=_ff .NewPdfRectangle (*_aef );if _fec !=nil {return nil ,_fec ;};_efc ,_efbf :=_acgf .Width (),_acgf .Height ();_dfea ,_gcc :=_efc ,_efbf ;
_bd ,_bba :=_fc .GetDict (_ae .MK );if _bba {_fggb ,_ :=_fc .GetDict (_ae .BS );_eab :=_ede .applyAppearanceCharacteristics (_bd ,_fggb ,nil );if _eab !=nil {return nil ,_eab ;};};_beb ,_bba :=_fc .GetIntVal (_acgd .MaxLen );if !_bba {return nil ,_fg .New ("\u006d\u0061\u0078\u006c\u0065\u006e\u0020\u006e\u006ft\u0020\u0073\u0065\u0074");
};if _beb <=0{return nil ,_fg .New ("\u006d\u0061\u0078\u004c\u0065\u006e\u0020\u0069\u006ev\u0061\u006c\u0069\u0064");};_gdg :=_efc /float64 (_beb );_ebe ,_fec :=_g .NewContentStreamParser (_baa (_acgd .PdfField )).Parse ();if _fec !=nil {return nil ,_fec ;
};_dge :=_g .NewContentCreator ();if _ede .BorderSize > 0{_feec (_dge ,_ede ,_efc ,_efbf );};if _ede .DrawAlignmentReticle {_fad :=_ede ;_fad .BorderSize =0.2;_acc (_dge ,_fad ,_efc ,_efbf );};_dge .Add_BMC ("\u0054\u0078");_dge .Add_q ();_ ,_efbf =_ede .applyRotation (_bd ,_efc ,_efbf ,_dge );
_dge .Add_BT ();_eece ,_bff ,_fec :=_ede .processDA (_acgd .PdfField ,_ebe ,_gde ,_cad ,_dge );if _fec !=nil {return nil ,_fec ;};_fcc :=_eece .Font ;_dcd :=_fc .MakeName (_eece .Name );_bbfg :=_eece .Size ;_eag :=_bbfg ==0;if _eag &&_bff {_bbfg =_efbf *_ede .AutoFontSizeFraction ;
};_abcd :=_fcc .Encoder ();if _abcd ==nil {_f .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");
_abcd =_c .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};var _ddf string ;if _bcf ,_ecg :=_fc .GetString (_acgd .V );_ecg {_ddf =_bcf .Decoded ();};_dge .Add_Tf (*_dcd ,_bbfg );var _ecc float64 ;for _ ,_fef :=range _ddf {_eeg ,_fggg :=_fcc .GetRuneMetrics (_fef );
if !_fggg {_f .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",_fef );
continue ;};_gbba :=_eeg .Wy ;if int (_gbba )<=0{_gbba =_eeg .Wx ;};if _gbba > _ecc {_ecc =_gbba ;};};if int (_ecc )==0{_f .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");
_ecc =1000;};_ceg ,_fec :=_fcc .GetFontDescriptor ();if _fec !=nil {_f .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 _cfgf float64 ;
if _ceg !=nil {_cfgf ,_fec =_ceg .GetCapHeight ();if _fec !=nil {_f .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",_fec );
};};if int (_cfgf )<=0{_f .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");
_cfgf =1000.0;};_ba :=_cfgf /1000.0*_bbfg ;_gda :=0.0;_ebdb :=1.0*_bbfg *(_ecc /1000.0);{_fee :=_ebdb ;if _eag &&_gda +_fee > _efbf {_bbfg =0.95*(_efbf -_gda );_ba =_cfgf /1000.0*_bbfg ;};if _efbf > _ba {_gda =(_efbf -_ba )/2.0;};};_dge .Add_Td (0,_gda );
if _aeff ,_bca :=_fc .GetIntVal (_acgd .Q );_bca {switch _aeff {case 2:if len (_ddf )< _beb {_bcb :=float64 (_beb -len (_ddf ))*_gdg ;_dge .Add_Td (_bcb ,0);};};};for _dcba ,_gfb :=range _ddf {_aca :=2.0;_beba :=string (_gfb );if _abcd !=nil {_abd ,_fdce :=_fcc .GetRuneMetrics (_gfb );
if !_fdce {_f .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",_gfb );
continue ;};_beba =string (_abcd .Encode (_beba ));_cfe :=_bbfg *_abd .Wx /1000.0;_egab :=(_gdg -_cfe )/2;_aca =_egab ;};_dge .Add_Td (_aca ,0);_dge .Add_Tj (*_fc .MakeString (_beba ));if _dcba !=len (_ddf )-1{_dge .Add_Td (_gdg -_aca ,0);};};_dge .Add_ET ();
_dge .Add_Q ();_dge .Add_EMC ();_afb :=_ff .NewXObjectForm ();_afb .Resources =_cad ;_afb .BBox =_fc .MakeArrayFromFloats ([]float64 {0,0,_dfea ,_gcc });_afb .SetContentStream (_dge .Bytes (),_edbc ());_eegg :=_fc .MakeDict ();_eegg .Set ("\u004e",_afb .ToPdfObject ());
return _eegg ,nil ;};
// 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 *_ff .PdfSignature ,lines []*SignatureLine ,opts *SignatureFieldOpts )(*_ff .PdfFieldSignature ,error ){if signature ==nil {return nil ,_fg .New ("\u0073\u0069\u0067na\u0074\u0075\u0072\u0065\u0020\u0063\u0061\u006e\u006e\u006f\u0074\u0020\u0062\u0065\u0020\u006e\u0069\u006c");
};_daf ,_bcef :=_ged (lines ,opts );if _bcef !=nil {return nil ,_bcef ;};_gded :=_ff .NewPdfFieldSignature (signature );_gded .Rect =_fc .MakeArrayFromFloats (opts .Rect );_gded .AP =_daf ;return _gded ,nil ;};func (_fbgc *AppearanceStyle )applyRotation (_gfd *_fc .PdfObjectDictionary ,_cdd ,_gfab float64 ,_dfba *_g .ContentCreator )(float64 ,float64 ){if !_fbgc .AllowMK {return _cdd ,_gfab ;
};if _gfd ==nil {return _cdd ,_gfab ;};_gea ,_ :=_fc .GetNumberAsFloat (_gfd .Get ("\u0052"));if _gea ==0{return _cdd ,_gfab ;};_gead :=-_gea ;_ecf :=_cf .Path {Points :[]_cf .Point {_cf .NewPoint (0,0).Rotate (_gead ),_cf .NewPoint (_cdd ,0).Rotate (_gead ),_cf .NewPoint (0,_gfab ).Rotate (_gead ),_cf .NewPoint (_cdd ,_gfab ).Rotate (_gead )}}.GetBoundingBox ();
_dfba .RotateDeg (_gea );_dfba .Translate (_ecf .X ,_ecf .Y );return _ecf .Width ,_ecf .Height ;};const (_bgc quadding =0;_ebb quadding =1;_df quadding =2;);func _egdg (_fefc RectangleAnnotationDef ,_dbe string )([]byte ,*_ff .PdfRectangle ,*_ff .PdfRectangle ,error ){_cdge :=_cf .Rectangle {X :0,Y :0,Width :_fefc .Width ,Height :_fefc .Height ,FillEnabled :_fefc .FillEnabled ,FillColor :_fefc .FillColor ,BorderEnabled :_fefc .BorderEnabled ,BorderWidth :2*_fefc .BorderWidth ,BorderColor :_fefc .BorderColor ,Opacity :_fefc .Opacity };
_gddc ,_fgbd ,_bafa :=_cdge .Draw (_dbe );if _bafa !=nil {return nil ,nil ,nil ,_bafa ;};_efdc :=&_ff .PdfRectangle {};_efdc .Llx =_fefc .X +_fgbd .Llx ;_efdc .Lly =_fefc .Y +_fgbd .Lly ;_efdc .Urx =_fefc .X +_fgbd .Urx ;_efdc .Ury =_fefc .Y +_fgbd .Ury ;
return _gddc ,_fgbd ,_efdc ,nil ;};const (SignatureImageLeft SignatureImagePosition =iota ;SignatureImageRight ;SignatureImageTop ;SignatureImageBottom ;);
// CreateLineAnnotation creates a line annotation object that can be added to page PDF annotations.
func CreateLineAnnotation (lineDef LineAnnotationDef )(*_ff .PdfAnnotation ,error ){_dgb :=_ff .NewPdfAnnotationLine ();_dgb .L =_fc .MakeArrayFromFloats ([]float64 {lineDef .X1 ,lineDef .Y1 ,lineDef .X2 ,lineDef .Y2 });_ffa :=_fc .MakeName ("\u004e\u006f\u006e\u0065");
if lineDef .LineEndingStyle1 ==_cf .LineEndingStyleArrow {_ffa =_fc .MakeName ("C\u006c\u006f\u0073\u0065\u0064\u0041\u0072\u0072\u006f\u0077");};_eddc :=_fc .MakeName ("\u004e\u006f\u006e\u0065");if lineDef .LineEndingStyle2 ==_cf .LineEndingStyleArrow {_eddc =_fc .MakeName ("C\u006c\u006f\u0073\u0065\u0064\u0041\u0072\u0072\u006f\u0077");
};_dgb .LE =_fc .MakeArray (_ffa ,_eddc );if lineDef .Opacity < 1.0{_dgb .CA =_fc .MakeFloat (lineDef .Opacity );};_cade ,_bce ,_cfa :=lineDef .LineColor .R (),lineDef .LineColor .G (),lineDef .LineColor .B ();_dgb .IC =_fc .MakeArrayFromFloats ([]float64 {_cade ,_bce ,_cfa });
_dgb .C =_fc .MakeArrayFromFloats ([]float64 {_cade ,_bce ,_cfa });_effd :=_ff .NewBorderStyle ();_effd .SetBorderWidth (lineDef .LineWidth );_dgb .BS =_effd .ToPdfObject ();_deff ,_cbaf ,_cfae :=_dgbe (lineDef );if _cfae !=nil {return nil ,_cfae ;};_dgb .AP =_deff ;
_dgb .Rect =_fc .MakeArrayFromFloats ([]float64 {_cbaf .Llx ,_cbaf .Lly ,_cbaf .Urx ,_cbaf .Ury });return _dgb .PdfAnnotation ,nil ;};func _egd (_eb CircleAnnotationDef )(*_fc .PdfObjectDictionary ,*_ff .PdfRectangle ,error ){_ef :=_ff .NewXObjectForm ();
_ef .Resources =_ff .NewPdfPageResources ();_cd :="";if _eb .Opacity < 1.0{_bg :=_fc .MakeDict ();_bg .Set ("\u0063\u0061",_fc .MakeFloat (_eb .Opacity ));_bg .Set ("\u0043\u0041",_fc .MakeFloat (_eb .Opacity ));_dg :=_ef .Resources .AddExtGState ("\u0067\u0073\u0031",_bg );
if _dg !=nil {_f .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 ,_dg ;};_cd ="\u0067\u0073\u0031";};_gcb ,_fa ,_gf ,_ee :=_ad (_eb ,_cd );
if _ee !=nil {return nil ,nil ,_ee ;};_ee =_ef .SetContentStream (_gcb ,nil );if _ee !=nil {return nil ,nil ,_ee ;};_ef .BBox =_fa .ToPdfObject ();_dd :=_fc .MakeDict ();_dd .Set ("\u004e",_ef .ToPdfObject ());return _dd ,_gf ,nil ;};func _eecc (_fea *_ff .PdfField ,_fde ,_dade float64 ,_fgcba string ,_fage AppearanceStyle ,_gaca *_g .ContentStreamOperations ,_ecdd *_ff .PdfPageResources ,_dae *_fc .PdfObjectDictionary )(*_ff .XObjectForm ,error ){_cdff :=_ff .NewPdfPageResources ();
_cdgb ,_gad :=_fde ,_dade ;_dabaa :=_g .NewContentCreator ();if _fage .BorderSize > 0{_feec (_dabaa ,_fage ,_fde ,_dade );};if _fage .DrawAlignmentReticle {_ddae :=_fage ;_ddae .BorderSize =0.2;_acc (_dabaa ,_ddae ,_fde ,_dade );};_dabaa .Add_BMC ("\u0054\u0078");
_dabaa .Add_q ();_dabaa .Add_BT ();_fde ,_dade =_fage .applyRotation (_dae ,_fde ,_dade ,_dabaa );_edf ,_feee ,_fdde :=_fage .processDA (_fea ,_gaca ,_ecdd ,_cdff ,_dabaa );if _fdde !=nil {return nil ,_fdde ;};_gfaf :=_edf .Font ;_bae :=_edf .Size ;_gfafe :=_fc .MakeName (_edf .Name );
_edbb :=_bae ==0;if _edbb &&_feee {_bae =_dade *_fage .AutoFontSizeFraction ;};_aaa :=_gfaf .Encoder ();if _aaa ==nil {_f .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");
_aaa =_c .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};if len (_fgcba )==0{return nil ,nil ;};_gccd :=2.0;_bge :=0.0;if _aaa !=nil {for _ ,_eca :=range _fgcba {_aagf ,_fcf :=_gfaf .GetRuneMetrics (_eca );if !_fcf {_f .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",_eca );
continue ;};_bge +=_aagf .Wx ;};_fgcba =string (_aaa .Encode (_fgcba ));};if _bae ==0||_edbb &&_bge > 0&&_gccd +_bge *_bae /1000.0> _fde {_bae =0.95*1000.0*(_fde -_gccd )/_bge ;};_cba :=1.0*_bae ;_bcgd :=2.0;{_efcg :=_cba ;if _edbb &&_bcgd +_efcg > _dade {_bae =0.95*(_dade -_bcgd );
_cba =1.0*_bae ;_efcg =_cba ;};if _dade > _efcg {_bcgd =(_dade -_efcg )/2.0;_bcgd +=1.50;};};_dabaa .Add_Tf (*_gfafe ,_bae );_dabaa .Add_Td (_gccd ,_bcgd );_dabaa .Add_Tj (*_fc .MakeString (_fgcba ));_dabaa .Add_ET ();_dabaa .Add_Q ();_dabaa .Add_EMC ();
_egc :=_ff .NewXObjectForm ();_egc .Resources =_cdff ;_egc .BBox =_fc .MakeArrayFromFloats ([]float64 {0,0,_cdgb ,_gad });_egc .SetContentStream (_dabaa .Bytes (),_edbc ());return _egc ,nil ;};
// 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 *_ff .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 _ff .PdfColor ;
// FillColor represents the background color of the appearance annotation area.
FillColor _ff .PdfColor ;
// BorderSize represents border size of the appearance annotation area.
BorderSize float64 ;
// BorderColor represents the border color of the appearance annotation area.
BorderColor _ff .PdfColor ;
// WatermarkImage specifies the image used as a watermark that will be rendered
// behind the signature.
WatermarkImage _e .Image ;
// Image represents the image used for the signature appearance.
Image _e .Image ;
// Encoder specifies the image encoder used for image signature. Defaults to flate encoder.
Encoder _fc .StreamEncoder ;
// ImagePosition specifies the image location relative to the text signature.
ImagePosition SignatureImagePosition ;};func _ged (_decb []*SignatureLine ,_gba *SignatureFieldOpts )(*_fc .PdfObjectDictionary ,error ){if _gba ==nil {_gba =NewSignatureFieldOpts ();};var _ffb error ;var _ffef *_fc .PdfObjectName ;_faef :=_gba .Font ;
if _faef !=nil {_fdea ,_ :=_faef .GetFontDescriptor ();if _fdea !=nil {if _efebf ,_ded :=_fdea .FontName .(*_fc .PdfObjectName );_ded {_ffef =_efebf ;};};if _ffef ==nil {_ffef =_fc .MakeName ("\u0046\u006f\u006et\u0031");};}else {if _faef ,_ffb =_ff .NewStandard14Font ("\u0048e\u006c\u0076\u0065\u0074\u0069\u0063a");
_ffb !=nil {return nil ,_ffb ;};_ffef =_fc .MakeName ("\u0048\u0065\u006c\u0076");};_efgd :=_gba .FontSize ;if _efgd <=0{_efgd =10;};if _gba .LineHeight <=0{_gba .LineHeight =1;};_gec :=_gba .LineHeight *_efgd ;_dfg ,_dfbg :=_faef .GetRuneMetrics (' ');
if !_dfbg {return nil ,_fg .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");};_dde :=_dfg .Wx ;var _agg float64 ;var _cdgf []string ;
for _ ,_gceg :=range _decb {if _gceg .Text ==""{continue ;};_bbce :=_gceg .Text ;if _gceg .Desc !=""{_bbce =_gceg .Desc +"\u003a\u0020"+_bbce ;};_cdgf =append (_cdgf ,_bbce );var _ebef float64 ;for _ ,_decc :=range _bbce {_fbbe ,_ebgf :=_faef .GetRuneMetrics (_decc );
if !_ebgf {continue ;};_ebef +=_fbbe .Wx ;};if _ebef > _agg {_agg =_ebef ;};};_agg =_agg *_efgd /1000.0;_aedc :=float64 (len (_cdgf ))*_gec ;_eaca :=_gba .Image !=nil ;_gag :=_gba .Rect ;if _gag ==nil {_gag =[]float64 {0,0,_agg ,_aedc };if _eaca {_gag [2]=_agg *2;
_gag [3]=_aedc *2;};_gba .Rect =_gag ;};_aac :=_gag [2]-_gag [0];_gcd :=_gag [3]-_gag [1];_efef ,_bdf :=_gag ,_gag ;var _aace ,_ccfb float64 ;if _eaca &&len (_cdgf )> 0{if _gba .ImagePosition <=SignatureImageRight {_dbgc :=[]float64 {_gag [0],_gag [1],_gag [0]+(_aac /2),_gag [3]};
_bgf :=[]float64 {_gag [0]+(_aac /2),_gag [1],_gag [2],_gag [3]};if _gba .ImagePosition ==SignatureImageLeft {_efef ,_bdf =_dbgc ,_bgf ;}else {_efef ,_bdf =_bgf ,_dbgc ;};}else {_daef :=[]float64 {_gag [0],_gag [1],_gag [2],_gag [1]+(_gcd /2)};_fgga :=[]float64 {_gag [0],_gag [1]+(_gcd /2),_gag [2],_gag [3]};
if _gba .ImagePosition ==SignatureImageTop {_efef ,_bdf =_fgga ,_daef ;}else {_efef ,_bdf =_daef ,_fgga ;};};};_aace =_bdf [2]-_bdf [0];_ccfb =_bdf [3]-_bdf [1];var _gfbe float64 ;if _gba .AutoSize {if _agg > _aace ||_aedc > _ccfb {_fgb :=_ccg .Min (_aace /_agg ,_ccfb /_aedc );
_efgd *=_fgb ;};_gec =_gba .LineHeight *_efgd ;_gfbe +=(_ccfb -float64 (len (_cdgf ))*_gec )/2;};_afe :=_g .NewContentCreator ();_cbg :=_ff .NewPdfPageResources ();_cbg .SetFontByName (*_ffef ,_faef .ToPdfObject ());if _gba .BorderSize <=0{_gba .BorderSize =0;
_gba .BorderColor =_ff .NewPdfColorDeviceGray (1);};if _gba .BorderColor ==nil {_gba .BorderColor =_ff .NewPdfColorDeviceGray (1);};if _gba .FillColor ==nil {_gba .FillColor =_ff .NewPdfColorDeviceGray (1);};_afe .Add_q ().SetNonStrokingColor (_gba .FillColor ).SetStrokingColor (_gba .BorderColor ).Add_w (_gba .BorderSize ).Add_re (_gag [0],_gag [1],_aac ,_gcd ).Add_B ().Add_Q ();
if _gba .WatermarkImage !=nil {_gfaa :=[]float64 {_gag [0],_gag [1],_gag [2],_gag [3]};_cfbd ,_dfgb ,_fcgb :=_fccg (_gba .WatermarkImage ,"\u0049\u006d\u0061\u0067\u0065\u0057\u0061\u0074\u0065r\u006d\u0061\u0072\u006b",_gba ,_gfaa ,_afe );if _fcgb !=nil {return nil ,_fcgb ;
};_cbg .SetXObjectImageByName (*_cfbd ,_dfgb );};_afe .Add_q ();_afe .Translate (_bdf [0],_bdf [3]-_gec -_gfbe );_afe .Add_BT ();_bdbe :=_faef .Encoder ();for _ ,_dabda :=range _cdgf {var _aedd []byte ;for _ ,_ebf :=range _dabda {if _cc .IsSpace (_ebf ){if len (_aedd )> 0{_afe .SetNonStrokingColor (_gba .TextColor ).Add_Tf (*_ffef ,_efgd ).Add_TL (_gec ).Add_TJ ([]_fc .PdfObject {_fc .MakeStringFromBytes (_aedd )}...);
_aedd =nil ;};_afe .Add_Tf (*_ffef ,_efgd ).Add_TL (_gec ).Add_TJ ([]_fc .PdfObject {_fc .MakeFloat (-_dde )}...);}else {_aedd =append (_aedd ,_bdbe .Encode (string (_ebf ))...);};};if len (_aedd )> 0{_afe .SetNonStrokingColor (_gba .TextColor ).Add_Tf (*_ffef ,_efgd ).Add_TL (_gec ).Add_TJ ([]_fc .PdfObject {_fc .MakeStringFromBytes (_aedd )}...);
};_afe .Add_Td (0,-_gec );};_afe .Add_ET ();_afe .Add_Q ();if _eaca {_fagd ,_edaf ,_ced :=_fccg (_gba .Image ,"\u0049\u006d\u0061\u0067\u0065\u0053\u0069\u0067\u006ea\u0074\u0075\u0072\u0065",_gba ,_efef ,_afe );if _ced !=nil {return nil ,_ced ;};_cbg .SetXObjectImageByName (*_fagd ,_edaf );
};_ddef :=_ff .NewXObjectForm ();_ddef .Resources =_cbg ;_ddef .BBox =_fc .MakeArrayFromFloats (_gag );_ddef .SetContentStream (_afe .Bytes (),_edbc ());_egaa :=_fc .MakeDict ();_egaa .Set ("\u004e",_ddef .ToPdfObject ());return _egaa ,nil ;};func (_dfef *AppearanceStyle )applyAppearanceCharacteristics (_dba *_fc .PdfObjectDictionary ,_bad *_fc .PdfObjectDictionary ,_aed *_ff .PdfFont )error {if !_dfef .AllowMK {return nil ;
};if CA ,_ebeg :=_fc .GetString (_dba .Get ("\u0043\u0041"));_ebeg &&_aed !=nil {_dga :=CA .Bytes ();if len (_dga )!=0{_dbd :=[]rune (_aed .Encoder ().Decode (_dga ));if len (_dbd )==1{_dfef .CheckmarkRune =_dbd [0];};};};if BC ,_dfca :=_fc .GetArray (_dba .Get ("\u0042\u0043"));
_dfca {_abg ,_gbg :=BC .ToFloat64Array ();if _gbg !=nil {return _gbg ;};switch len (_abg ){case 1:_dfef .BorderColor =_ff .NewPdfColorDeviceGray (_abg [0]);case 3:_dfef .BorderColor =_ff .NewPdfColorDeviceRGB (_abg [0],_abg [1],_abg [2]);case 4:_dfef .BorderColor =_ff .NewPdfColorDeviceCMYK (_abg [0],_abg [1],_abg [2],_abg [3]);
default:_f .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 (_abg ));
};if _bad !=nil {if _gace ,_bfd :=_fc .GetNumberAsFloat (_bad .Get ("\u0057"));_bfd ==nil {_dfef .BorderSize =_gace ;};};};if BG ,_eabf :=_fc .GetArray (_dba .Get ("\u0042\u0047"));_eabf {_gfbg ,_add :=BG .ToFloat64Array ();if _add !=nil {return _add ;
};switch len (_gfbg ){case 1:_dfef .FillColor =_ff .NewPdfColorDeviceGray (_gfbg [0]);case 3:_dfef .FillColor =_ff .NewPdfColorDeviceRGB (_gfbg [0],_gfbg [1],_gfbg [2]);case 4:_dfef .FillColor =_ff .NewPdfColorDeviceCMYK (_gfbg [0],_gfbg [1],_gfbg [2],_gfbg [3]);
default:_f .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 (_gfbg ));
};};return nil ;};func _feec (_dgeb *_g .ContentCreator ,_eee AppearanceStyle ,_agb ,_beda float64 ){_dgeb .Add_q ().Add_re (0,0,_agb ,_beda ).Add_w (_eee .BorderSize ).SetStrokingColor (_eee .BorderColor ).SetNonStrokingColor (_eee .FillColor ).Add_B ().Add_Q ();
};
// Style returns the appearance style of `fa`. If not specified, returns default style.
func (_gd FieldAppearance )Style ()AppearanceStyle {if _gd ._ca !=nil {return *_gd ._ca ;};return AppearanceStyle {AutoFontSizeFraction :0.65,CheckmarkRune :'✔',BorderSize :0.0,BorderColor :_ff .NewPdfColorDeviceGray (0),FillColor :_ff .NewPdfColorDeviceGray (1),MultilineLineHeight :1.2,MultilineVAlignMiddle :false ,DrawAlignmentReticle :false ,AllowMK :true };
};
// 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 };};
// 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 ;};
// 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 *_ff .PdfPage ,name string ,rect []float64 ,opt ComboboxFieldOptions )(*_ff .PdfFieldChoice ,error ){if page ==nil {return nil ,_fg .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");
};if len (name )<=0{return nil ,_fg .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 ,_fg .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");
};_aeb :=_ff .NewPdfField ();_fagg :=&_ff .PdfFieldChoice {};_aeb .SetContext (_fagg );_fagg .PdfField =_aeb ;_fagg .T =_fc .MakeString (name );_fagg .Opt =_fc .MakeArray ();for _ ,_eff :=range opt .Choices {_fagg .Opt .Append (_fc .MakeString (_eff ));
};_fagg .SetFlag (_ff .FieldFlagCombo );_bbb :=_ff .NewPdfAnnotationWidget ();_bbb .Rect =_fc .MakeArrayFromFloats (rect );_bbb .P =page .ToPdfObject ();_bbb .F =_fc .MakeInteger (4);_bbb .Parent =_fagg .ToPdfObject ();_fagg .Annotations =append (_fagg .Annotations ,_bbb );
return _fagg ,nil ;};
// CreateRectangleAnnotation creates a rectangle annotation object that can be added to page PDF annotations.
func CreateRectangleAnnotation (rectDef RectangleAnnotationDef )(*_ff .PdfAnnotation ,error ){_eaa :=_ff .NewPdfAnnotationSquare ();if rectDef .BorderEnabled {_dedg ,_gaad ,_bfdb :=rectDef .BorderColor .R (),rectDef .BorderColor .G (),rectDef .BorderColor .B ();
_eaa .C =_fc .MakeArrayFromFloats ([]float64 {_dedg ,_gaad ,_bfdb });_gdeb :=_ff .NewBorderStyle ();_gdeb .SetBorderWidth (rectDef .BorderWidth );_eaa .BS =_gdeb .ToPdfObject ();};if rectDef .FillEnabled {_efa ,_cca ,_edde :=rectDef .FillColor .R (),rectDef .FillColor .G (),rectDef .FillColor .B ();
_eaa .IC =_fc .MakeArrayFromFloats ([]float64 {_efa ,_cca ,_edde });}else {_eaa .IC =_fc .MakeArrayFromIntegers ([]int {});};if rectDef .Opacity < 1.0{_eaa .CA =_fc .MakeFloat (rectDef .Opacity );};_ecca ,_bdfe ,_gbff :=_cfc (rectDef );if _gbff !=nil {return nil ,_gbff ;
};_eaa .AP =_ecca ;_eaa .Rect =_fc .MakeArrayFromFloats ([]float64 {_bdfe .Llx ,_bdfe .Lly ,_bdfe .Urx ,_bdfe .Ury });return _eaa .PdfAnnotation ,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 _acc (_edecd *_g .ContentCreator ,_gcfd AppearanceStyle ,_caag ,_deaa float64 ){_edecd .Add_q ().Add_re (0,0,_caag ,_deaa ).Add_re (0,_deaa /2,_caag ,_deaa /2).Add_re (0,0,_caag ,_deaa ).Add_re (_caag /2,0,_caag /2,_deaa ).Add_w (_gcfd .BorderSize ).SetStrokingColor (_gcfd .BorderColor ).SetNonStrokingColor (_gcfd .FillColor ).Add_B ().Add_Q ();
};
// 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 *_ff .PdfPage ,name string ,rect []float64 ,opt CheckboxFieldOptions )(*_ff .PdfFieldButton ,error ){if page ==nil {return nil ,_fg .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");
};if len (name )<=0{return nil ,_fg .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 ,_fg .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");
};_gacd ,_dfeac :=_ff .NewStandard14Font (_ff .ZapfDingbatsName );if _dfeac !=nil {return nil ,_dfeac ;};_edcd :=_ff .NewPdfField ();_fbbg :=&_ff .PdfFieldButton {};_edcd .SetContext (_fbbg );_fbbg .PdfField =_edcd ;_fbbg .T =_fc .MakeString (name );_fbbg .SetType (_ff .ButtonTypeCheckbox );
_ddce :="\u004f\u0066\u0066";if opt .Checked {_ddce ="\u0059\u0065\u0073";};_fbbg .V =_fc .MakeName (_ddce );_bcd :=_ff .NewPdfAnnotationWidget ();_bcd .Rect =_fc .MakeArrayFromFloats (rect );_bcd .P =page .ToPdfObject ();_bcd .F =_fc .MakeInteger (4);
_bcd .Parent =_fbbg .ToPdfObject ();_cbb :=rect [2]-rect [0];_dfeb :=rect [3]-rect [1];var _fbe _b .Buffer ;_fbe .WriteString ("\u0071\u000a");_fbe .WriteString ("\u0030 \u0030\u0020\u0031\u0020\u0072\u0067\n");_fbe .WriteString ("\u0042\u0054\u000a");
_fbe .WriteString ("\u002f\u005a\u0061D\u0062\u0020\u0031\u0032\u0020\u0054\u0066\u000a");_fbe .WriteString ("\u0045\u0054\u000a");_fbe .WriteString ("\u0051\u000a");_gedd :=_g .NewContentCreator ();_gedd .Add_q ();_gedd .Add_rg (0,0,1);_gedd .Add_BT ();
_gedd .Add_Tf (*_fc .MakeName ("\u005a\u0061\u0044\u0062"),12);_gedd .Add_Td (0,0);_gedd .Add_ET ();_gedd .Add_Q ();_feeb :=_ff .NewXObjectForm ();_feeb .SetContentStream (_gedd .Bytes (),_fc .NewRawEncoder ());_feeb .BBox =_fc .MakeArrayFromFloats ([]float64 {0,0,_cbb ,_dfeb });
_feeb .Resources =_ff .NewPdfPageResources ();_feeb .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_gacd .ToPdfObject ());_gedd =_g .NewContentCreator ();_gedd .Add_q ();_gedd .Add_re (0,0,_cbb ,_dfeb );_gedd .Add_W ().Add_n ();_gedd .Add_rg (0,0,1);
_gedd .Translate (0,3.0);_gedd .Add_BT ();_gedd .Add_Tf (*_fc .MakeName ("\u005a\u0061\u0044\u0062"),12);_gedd .Add_Td (0,0);_gedd .Add_Tj (*_fc .MakeString ("\u0034"));_gedd .Add_ET ();_gedd .Add_Q ();_gdbce :=_ff .NewXObjectForm ();_gdbce .SetContentStream (_gedd .Bytes (),_fc .NewRawEncoder ());
_gdbce .BBox =_fc .MakeArrayFromFloats ([]float64 {0,0,_cbb ,_dfeb });_gdbce .Resources =_ff .NewPdfPageResources ();_gdbce .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_gacd .ToPdfObject ());_ddda :=_fc .MakeDict ();_ddda .Set ("\u004f\u0066\u0066",_feeb .ToPdfObject ());
_ddda .Set ("\u0059\u0065\u0073",_gdbce .ToPdfObject ());_bea :=_fc .MakeDict ();_bea .Set ("\u004e",_ddda );_bcd .AP =_bea ;_bcd .AS =_fc .MakeName (_ddce );_fbbg .Annotations =append (_fbbg .Annotations ,_bcd );return _fbbg ,nil ;};func _edbc ()_fc .StreamEncoder {return _fc .NewFlateEncoder ()};
type quadding int ;func _cec (_ga *_ff .PdfAnnotationWidget ,_fe *_ff .PdfFieldText ,_fae *_ff .PdfPageResources ,_ge AppearanceStyle )(*_fc .PdfObjectDictionary ,error ){_ecd :=_ff .NewPdfPageResources ();_fgc ,_gdb :=_fc .GetArray (_ga .Rect );if !_gdb {return nil ,_fg .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");
};_abce ,_daa :=_ff .NewPdfRectangle (*_fgc );if _daa !=nil {return nil ,_daa ;};_cb ,_dc :=_abce .Width (),_abce .Height ();_cfb ,_ac :=_cb ,_dc ;_eaf ,_fga :=_fc .GetDict (_ga .MK );if _fga {_cfg ,_ :=_fc .GetDict (_ga .BS );_eda :=_ge .applyAppearanceCharacteristics (_eaf ,_cfg ,nil );
if _eda !=nil {return nil ,_eda ;};};_afa ,_daa :=_g .NewContentStreamParser (_baa (_fe .PdfField )).Parse ();if _daa !=nil {return nil ,_daa ;};_acg :=_g .NewContentCreator ();if _ge .BorderSize > 0{_feec (_acg ,_ge ,_cb ,_dc );};if _ge .DrawAlignmentReticle {_ffde :=_ge ;
_ffde .BorderSize =0.2;_acc (_acg ,_ffde ,_cb ,_dc );};_acg .Add_BMC ("\u0054\u0078");_acg .Add_q ();_cb ,_dc =_ge .applyRotation (_eaf ,_cb ,_dc ,_acg );_acg .Add_BT ();_dfb ,_eae ,_daa :=_ge .processDA (_fe .PdfField ,_afa ,_fae ,_ecd ,_acg );if _daa !=nil {return nil ,_daa ;
};_bbe :=_dfb .Font ;_efb :=_dfb .Size ;_bec :=_fc .MakeName (_dfb .Name );_bc :=_efb ==0;if _bc &&_eae {_efb =_dc *_ge .AutoFontSizeFraction ;};_dfe :=_bbe .Encoder ();if _dfe ==nil {_f .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");
_dfe =_c .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};_feb ,_daa :=_bbe .GetFontDescriptor ();if _daa !=nil {_f .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 _gef string ;if _gce ,_egfa :=_fc .GetString (_fe .V );_egfa {_gef =_gce .Decoded ();};if len (_gef )==0{return nil ,nil ;};_db :=[]string {_gef };_eef :=false ;if _fe .Flags ().Has (_ff .FieldFlagMultiline ){_eef =true ;_gef =_ag .Replace (_gef ,"\u000d\u000a","\u000a",-1);
_gef =_ag .Replace (_gef ,"\u000d","\u000a",-1);_db =_ag .Split (_gef ,"\u000a");};_cdc :=0.0;_ccge :=0;if _dfe !=nil {_ddgc :=len (_db );_dab :=0;for _dab < _ddgc {var _daba float64 ;_dfc :=-1;_geg :=0.0;for _bf ,_afc :=range _db [_dab ]{if _afc ==' '{_dfc =_bf ;
_daba =_geg ;};_bbf ,_gdbf :=_bbe .GetRuneMetrics (_afc );if !_gdbf {_f .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",_afc );
continue ;};_geg +=_bbf .Wx ;if _eef &&!_bc &&_efb *_geg /1000.0> _cb &&_dfc > 0{_fbb :=_db [_dab ][_dfc +1:];if _dab < len (_db )-1{_db =append (_db [:_dab +1],_db [_dab :]...);_db [_dab +1]=_fbb ;}else {_db =append (_db ,_fbb );};_ddgc ++;_db [_dab ]=_db [_dab ][0:_dfc ];
_geg =_daba ;break ;};};if _geg > _cdc {_cdc =_geg ;};_db [_dab ]=string (_dfe .Encode (_db [_dab ]));if len (_db [_dab ])> 0{_ccge ++;};_dab ++;};};_fca :=2.0;if _efb ==0||_bc &&_cdc > 0&&_fca +_cdc *_efb /1000.0> _cb {_efb =0.95*1000.0*(_cb -_fca )/_cdc ;
};_bed :=_bgc ;{if _egg ,_gb :=_fc .GetIntVal (_fe .Q );_gb {switch _egg {case 0:_bed =_bgc ;case 1:_bed =_ebb ;case 2:_bed =_df ;default:_f .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",_egg );
};};};_de :=_ge .MultilineLineHeight ;_bfb :=_efb ;if _eef &&_ccge > 1{_bfb =_de *_efb ;};var _cgc float64 ;if _feb !=nil {_cgc ,_daa =_feb .GetCapHeight ();if _daa !=nil {_f .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",_daa );
};};if int (_cgc )<=0{_f .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");
_cgc =1000;};_bbea :=_cgc /1000.0*_efb ;_eggg :=0.0;{_gdbg :=float64 (_ccge )*_bfb ;if _bc &&_eggg +_gdbg > _dc {_efb =0.95*(_dc -_eggg )/float64 (_ccge );_bfb =_efb ;if _eef &&_ccge > 1{_bfb =_de *_efb ;};_bbea =_cgc /1000.0*_efb ;_gdbg =float64 (_ccge )*_bfb ;
};if _dc > _gdbg {if _eef {if _ge .MultilineVAlignMiddle {_dea :=(_dc -_gdbg )/2.0;_faeg :=_dea +_gdbg -_bfb ;_eggg =_faeg ;}else {_eggg =_dc -_bfb ;_eggg -=_efb *0.5;};}else {_eggg =(_dc -_bbea )/2.0;};};};_acg .Add_Tf (*_bec ,_efb );_acg .Add_Td (_fca ,_eggg );
_gff :=_fca ;_cfd :=_fca ;for _dcc ,_abe :=range _db {_efg :=0.0;for _ ,_gegb :=range _abe {_dgc ,_dcb :=_bbe .GetRuneMetrics (_gegb );if !_dcb {continue ;};_efg +=_dgc .Wx ;};_fgg :=_efg /1000.0*_efb ;_fgcb :=_cb -_fgg ;var _edg float64 ;switch _bed {case _bgc :_edg =_gff ;
case _ebb :_edg =_fgcb /2;case _df :_edg =_fgcb ;};_fca =_edg -_cfd ;if _fca > 0.0{_acg .Add_Td (_fca ,0);};_cfd =_edg ;_acg .Add_Tj (*_fc .MakeString (_abe ));if _dcc < len (_db )-1{_acg .Add_Td (0,-_bfb *_de );};};_acg .Add_ET ();_acg .Add_Q ();_acg .Add_EMC ();
_gbb :=_ff .NewXObjectForm ();_gbb .Resources =_ecd ;_gbb .BBox =_fc .MakeArrayFromFloats ([]float64 {0,0,_cfb ,_ac });_gbb .SetContentStream (_acg .Bytes (),_edbc ());_afg :=_fc .MakeDict ();_afg .Set ("\u004e",_gbb .ToPdfObject ());return _afg ,nil ;
};func _dgbe (_defb LineAnnotationDef )(*_fc .PdfObjectDictionary ,*_ff .PdfRectangle ,error ){_aefd :=_ff .NewXObjectForm ();_aefd .Resources =_ff .NewPdfPageResources ();_ffdg :="";if _defb .Opacity < 1.0{_dfgc :=_fc .MakeDict ();_dfgc .Set ("\u0063\u0061",_fc .MakeFloat (_defb .Opacity ));
_bgeg :=_aefd .Resources .AddExtGState ("\u0067\u0073\u0031",_dfgc );if _bgeg !=nil {_f .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 ,_bgeg ;
};_ffdg ="\u0067\u0073\u0031";};_agbg ,_cabb ,_eabg ,_bbfa :=_edfg (_defb ,_ffdg );if _bbfa !=nil {return nil ,nil ,_bbfa ;};_bbfa =_aefd .SetContentStream (_agbg ,nil );if _bbfa !=nil {return nil ,nil ,_bbfa ;};_aefd .BBox =_cabb .ToPdfObject ();_baab :=_fc .MakeDict ();
_baab .Set ("\u004e",_aefd .ToPdfObject ());return _baab ,_eabg ,nil ;};
// CreateCircleAnnotation creates a circle/ellipse annotation object with appearance stream that can be added to
// page PDF annotations.
func CreateCircleAnnotation (circDef CircleAnnotationDef )(*_ff .PdfAnnotation ,error ){_d :=_ff .NewPdfAnnotationCircle ();if circDef .BorderEnabled {_gc ,_af ,_eg :=circDef .BorderColor .R (),circDef .BorderColor .G (),circDef .BorderColor .B ();_d .C =_fc .MakeArrayFromFloats ([]float64 {_gc ,_af ,_eg });
_agd :=_ff .NewBorderStyle ();_agd .SetBorderWidth (circDef .BorderWidth );_d .BS =_agd .ToPdfObject ();};if circDef .FillEnabled {_egf ,_bb ,_ega :=circDef .FillColor .R (),circDef .FillColor .G (),circDef .FillColor .B ();_d .IC =_fc .MakeArrayFromFloats ([]float64 {_egf ,_bb ,_ega });
}else {_d .IC =_fc .MakeArrayFromIntegers ([]int {});};if circDef .Opacity < 1.0{_d .CA =_fc .MakeFloat (circDef .Opacity );};_cg ,_ea ,_be :=_egd (circDef );if _be !=nil {return nil ,_be ;};_d .AP =_cg ;_d .Rect =_fc .MakeArrayFromFloats ([]float64 {_ea .Llx ,_ea .Lly ,_ea .Urx ,_ea .Ury });
return _d .PdfAnnotation ,nil ;};func _fccg (_def _e .Image ,_bcge string ,_ace *SignatureFieldOpts ,_cag []float64 ,_aedf *_g .ContentCreator )(*_fc .PdfObjectName ,*_ff .XObjectImage ,error ){_defg ,_gbgf :=_ff .DefaultImageHandler {}.NewImageFromGoImage (_def );
if _gbgf !=nil {return nil ,nil ,_gbgf ;};_bfeb ,_gbgf :=_ff .NewXObjectImageFromImage (_defg ,nil ,_ace .Encoder );if _gbgf !=nil {return nil ,nil ,_gbgf ;};_bfbd ,_acec :=float64 (*_bfeb .Width ),float64 (*_bfeb .Height );_edcg :=_cag [2]-_cag [0];_dffg :=_cag [3]-_cag [1];
if _ace .AutoSize {_dag :=_ccg .Min (_edcg /_bfbd ,_dffg /_acec );_bfbd *=_dag ;_acec *=_dag ;_cag [0]=_cag [0]+(_edcg /2)-(_bfbd /2);_cag [1]=_cag [1]+(_dffg /2)-(_acec /2);};var _faefc *_fc .PdfObjectName ;if _bfg ,_aeda :=_fc .GetName (_bfeb .Name );
_aeda {_faefc =_bfg ;}else {_faefc =_fc .MakeName (_bcge );};if _aedf !=nil {_aedf .Add_q ().Translate (_cag [0],_cag [1]).Scale (_bfbd ,_acec ).Add_Do (*_faefc ).Add_Q ();}else {return nil ,nil ,_fg .New ("\u0043\u006f\u006e\u0074en\u0074\u0043\u0072\u0065\u0061\u0074\u006f\u0072\u0020\u0069\u0073\u0020\u006e\u0075l\u006c");
};return _faefc ,_bfeb ,nil ;};func _cfc (_eed RectangleAnnotationDef )(*_fc .PdfObjectDictionary ,*_ff .PdfRectangle ,error ){_aebe :=_ff .NewXObjectForm ();_aebe .Resources =_ff .NewPdfPageResources ();_gbe :="";if _eed .Opacity < 1.0{_caae :=_fc .MakeDict ();
_caae .Set ("\u0063\u0061",_fc .MakeFloat (_eed .Opacity ));_caae .Set ("\u0043\u0041",_fc .MakeFloat (_eed .Opacity ));_gccc :=_aebe .Resources .AddExtGState ("\u0067\u0073\u0031",_caae );if _gccc !=nil {_f .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 ,_gccc ;};_gbe ="\u0067\u0073\u0031";};_dfa ,_abcc ,_bebb ,_defd :=_egdg (_eed ,_gbe );if _defd !=nil {return nil ,nil ,_defd ;};_defd =_aebe .SetContentStream (_dfa ,nil );if _defd !=nil {return nil ,nil ,_defd ;};_aebe .BBox =_abcc .ToPdfObject ();
_ffeb :=_fc .MakeDict ();_ffeb .Set ("\u004e",_aebe .ToPdfObject ());return _ffeb ,_bebb ,nil ;};
// 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 *_ff .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 ;};
// CheckboxFieldOptions defines optional parameters for a checkbox field a form.
type CheckboxFieldOptions struct{Checked bool ;};
// 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 *_ff .PdfColorDeviceRGB ;Opacity float64 ;LineWidth float64 ;LineEndingStyle1 _cf .LineEndingStyle ;LineEndingStyle2 _cf .LineEndingStyle ;};
// GenerateAppearanceDict generates an appearance dictionary for widget annotation `wa` for the `field` in `form`.
// Implements interface model.FieldAppearanceGenerator.
func (_ffd FieldAppearance )GenerateAppearanceDict (form *_ff .PdfAcroForm ,field *_ff .PdfField ,wa *_ff .PdfAnnotationWidget )(*_fc .PdfObjectDictionary ,error ){_f .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 );
_ ,_abc :=field .GetContext ().(*_ff .PdfFieldText );_ed ,_ddd :=_fc .GetDict (wa .AP );if _ddd &&_ffd .OnlyIfMissing &&(!_abc ||!_ffd .RegenerateTextFields ){_f .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 _ed ,nil ;};if form .DR ==nil {form .DR =_ff .NewPdfPageResources ();};switch _cdf :=field .GetContext ().(type ){case *_ff .PdfFieldText :_cgb :=_cdf ;switch {case _cgb .Flags ().Has (_ff .FieldFlagPassword ):return nil ,nil ;case _cgb .Flags ().Has (_ff .FieldFlagFileSelect ):return nil ,nil ;
case _cgb .Flags ().Has (_ff .FieldFlagComb ):if _cgb .MaxLen !=nil {_da ,_ege :=_fdc (wa ,_cgb ,form .DR ,_ffd .Style ());if _ege !=nil {return nil ,_ege ;};return _da ,nil ;};};_fb ,_gfg :=_cec (wa ,_cgb ,form .DR ,_ffd .Style ());if _gfg !=nil {return nil ,_gfg ;
};return _fb ,nil ;case *_ff .PdfFieldButton :_aa :=_cdf ;if _aa .IsCheckbox (){_efe ,_ec :=_deg (wa ,_aa ,form .DR ,_ffd .Style ());if _ec !=nil {return nil ,_ec ;};return _efe ,nil ;};_f .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",_aa .GetType ());
case *_ff .PdfFieldChoice :_edb :=_cdf ;switch {case _edb .Flags ().Has (_ff .FieldFlagCombo ):_fd ,_fba :=_ffe (form ,wa ,_edb ,_ffd .Style ());if _fba !=nil {return nil ,_fba ;};return _fd ,nil ;default:_f .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",_edb .Flags ().String ());
};default:_f .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",_cdf );};return nil ,nil ;};
// NewSignatureFieldOpts returns a new initialized instance of options
// used to generate a signature appearance.
func NewSignatureFieldOpts ()*SignatureFieldOpts {return &SignatureFieldOpts {Font :_ff .DefaultFont (),FontSize :10,LineHeight :1,AutoSize :true ,TextColor :_ff .NewPdfColorDeviceGray (0),BorderColor :_ff .NewPdfColorDeviceGray (0),FillColor :_ff .NewPdfColorDeviceGray (1),Encoder :_fc .NewFlateEncoder (),ImagePosition :SignatureImageLeft };
};func _edfg (_dfcae LineAnnotationDef ,_eccd string )([]byte ,*_ff .PdfRectangle ,*_ff .PdfRectangle ,error ){_afed :=_cf .Line {X1 :0,Y1 :0,X2 :_dfcae .X2 -_dfcae .X1 ,Y2 :_dfcae .Y2 -_dfcae .Y1 ,LineColor :_dfcae .LineColor ,Opacity :_dfcae .Opacity ,LineWidth :_dfcae .LineWidth ,LineEndingStyle1 :_dfcae .LineEndingStyle1 ,LineEndingStyle2 :_dfcae .LineEndingStyle2 };
_efga ,_gbf ,_dddc :=_afed .Draw (_eccd );if _dddc !=nil {return nil ,nil ,nil ,_dddc ;};_bcec :=&_ff .PdfRectangle {};_bcec .Llx =_dfcae .X1 +_gbf .Llx ;_bcec .Lly =_dfcae .Y1 +_gbf .Lly ;_bcec .Urx =_dfcae .X1 +_gbf .Urx ;_bcec .Ury =_dfcae .Y1 +_gbf .Ury ;
return _efga ,_gbf ,_bcec ,nil ;};
// 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 ;
// 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 ;_ca *AppearanceStyle ;};func _baa (_ceab *_ff .PdfField )string {if _ceab ==nil {return "";};_aeg ,_baeg :=_ceab .GetContext ().(*_ff .PdfFieldText );if !_baeg {return _baa (_ceab .Parent );
};if _aeg .DA !=nil {return _aeg .DA .Str ();};return _baa (_aeg .Parent );};func _ffe (_cea *_ff .PdfAcroForm ,_cab *_ff .PdfAnnotationWidget ,_bfe *_ff .PdfFieldChoice ,_cac AppearanceStyle )(*_fc .PdfObjectDictionary ,error ){_abf ,_eccb :=_fc .GetArray (_cab .Rect );
if !_eccb {return nil ,_fg .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_eeca ,_cce :=_ff .NewPdfRectangle (*_abf );if _cce !=nil {return nil ,_cce ;};_ccf ,_afff :=_eeca .Width (),_eeca .Height ();_f .Log .Debug ("\u0043\u0068\u006f\u0069\u0063\u0065\u002c\u0020\u0077\u0061\u0020\u0042S\u003a\u0020\u0025\u0076",_cab .BS );
_gfa ,_cce :=_g .NewContentStreamParser (_baa (_bfe .PdfField )).Parse ();if _cce !=nil {return nil ,_cce ;};_fcg ,_fdd :=_fc .GetDict (_cab .MK );if _fdd {_dfcd ,_ :=_fc .GetDict (_cab .BS );_fab :=_cac .applyAppearanceCharacteristics (_fcg ,_dfcd ,nil );
if _fab !=nil {return nil ,_fab ;};};_eafa :=_fc .MakeDict ();for _ ,_ebg :=range _bfe .Opt .Elements (){if _gac ,_fge :=_fc .GetArray (_ebg );_fge &&_gac .Len ()==2{_ebg =_gac .Get (1);};var _cabg string ;if _cdg ,_ebc :=_fc .GetString (_ebg );_ebc {_cabg =_cdg .Decoded ();
}else if _cdca ,_eafe :=_fc .GetName (_ebg );_eafe {_cabg =_cdca .String ();}else {_f .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",_ebg );
return nil ,_fg .New ("\u006e\u006f\u0074\u0020\u0061\u0020\u006e\u0061\u006d\u0065\u002f\u0073t\u0072\u0069\u006e\u0067");};if len (_cabg )> 0{_ecgd ,_bga :=_eecc (_bfe .PdfField ,_ccf ,_afff ,_cabg ,_cac ,_gfa ,_cea .DR ,_fcg );if _bga !=nil {return nil ,_bga ;
};_eafa .Set (*_fc .MakeName (_cabg ),_ecgd .ToPdfObject ());};};_bdb :=_fc .MakeDict ();_bdb .Set ("\u004e",_eafa );return _bdb ,nil ;};