unipdf/annotator/annotator.go
2020-11-11 18:48:37 +00:00

212 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 (_d "bytes";_b "errors";_e "github.com/unidoc/unipdf/v3/common";_a "github.com/unidoc/unipdf/v3/contentstream";_fb "github.com/unidoc/unipdf/v3/contentstream/draw";_gg "github.com/unidoc/unipdf/v3/core";_c "github.com/unidoc/unipdf/v3/internal/textencoding";_fc "github.com/unidoc/unipdf/v3/model";_g "image";_ec "math";_fe "strings";_cd "unicode";);func _ggeb (_ebg RectangleAnnotationDef ,_ebgf string )([]byte ,*_fc .PdfRectangle ,*_fc .PdfRectangle ,error ){_efcg :=_fb .Rectangle {X :0,Y :0,Width :_ebg .Width ,Height :_ebg .Height ,FillEnabled :_ebg .FillEnabled ,FillColor :_ebg .FillColor ,BorderEnabled :_ebg .BorderEnabled ,BorderWidth :2*_ebg .BorderWidth ,BorderColor :_ebg .BorderColor ,Opacity :_ebg .Opacity };_ccea ,_gbag ,_fcdf :=_efcg .Draw (_ebgf );if _fcdf !=nil {return nil ,nil ,nil ,_fcdf ;};_gabg :=&_fc .PdfRectangle {};_gabg .Llx =_ebg .X +_gbag .Llx ;_gabg .Lly =_ebg .Y +_gbag .Lly ;_gabg .Urx =_ebg .X +_gbag .Urx ;_gabg .Ury =_ebg .Y +_gbag .Ury ;return _ccea ,_gbag ,_gabg ,nil ;};func _dbe (_ecbf _g .Image ,_dcda string ,_bfbf *SignatureFieldOpts ,_gag []float64 ,_dgf *_a .ContentCreator )(*_gg .PdfObjectName ,*_fc .XObjectImage ,error ){_cfgc ,_gbgb :=_fc .DefaultImageHandler {}.NewImageFromGoImage (_ecbf );if _gbgb !=nil {return nil ,nil ,_gbgb ;};_bgaa ,_gbgb :=_fc .NewXObjectImageFromImage (_cfgc ,nil ,_bfbf .Encoder );if _gbgb !=nil {return nil ,nil ,_gbgb ;};_aed ,_ddfd :=float64 (*_bgaa .Width ),float64 (*_bgaa .Height );_fgbef :=_gag [2]-_gag [0];_cde :=_gag [3]-_gag [1];if _bfbf .AutoSize {_fcad :=_ec .Min (_fgbef /_aed ,_cde /_ddfd );_aed *=_fcad ;_ddfd *=_fcad ;_gag [0]=_gag [0]+(_fgbef /2)-(_aed /2);_gag [1]=_gag [1]+(_cde /2)-(_ddfd /2);};var _cceg *_gg .PdfObjectName ;if _egd ,_gdf :=_gg .GetName (_bgaa .Name );_gdf {_cceg =_egd ;}else {_cceg =_gg .MakeName (_dcda );};if _dgf !=nil {_dgf .Add_q ().Translate (_gag [0],_gag [1]).Scale (_aed ,_ddfd ).Add_Do (*_cceg ).Add_Q ();}else {return nil ,nil ,_b .New ("\u0043\u006f\u006e\u0074en\u0074\u0043\u0072\u0065\u0061\u0074\u006f\u0072\u0020\u0069\u0073\u0020\u006e\u0075l\u006c");};return _cceg ,_bgaa ,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 *_fc .PdfSignature ,lines []*SignatureLine ,opts *SignatureFieldOpts )(*_fc .PdfFieldSignature ,error ){if signature ==nil {return nil ,_b .New ("\u0073\u0069\u0067na\u0074\u0075\u0072\u0065\u0020\u0063\u0061\u006e\u006e\u006f\u0074\u0020\u0062\u0065\u0020\u006e\u0069\u006c");};_afd ,_bge :=_bfgg (lines ,opts );if _bge !=nil {return nil ,_bge ;};_cbdc :=_fc .NewPdfFieldSignature (signature );_cbdc .Rect =_gg .MakeArrayFromFloats (opts .Rect );_cbdc .AP =_afd ;return _cbdc ,nil ;};func (_gab *AppearanceStyle )applyRotation (_ffeb *_gg .PdfObjectDictionary ,_gada ,_gfaf float64 ,_ffda *_a .ContentCreator )(float64 ,float64 ){if !_gab .AllowMK {return _gada ,_gfaf ;};if _ffeb ==nil {return _gada ,_gfaf ;};_bdcb ,_ :=_gg .GetNumberAsFloat (_ffeb .Get ("\u0052"));if _bdcb ==0{return _gada ,_gfaf ;};_gdee :=-_bdcb ;_eef :=_fb .Path {Points :[]_fb .Point {_fb .NewPoint (0,0).Rotate (_gdee ),_fb .NewPoint (_gada ,0).Rotate (_gdee ),_fb .NewPoint (0,_gfaf ).Rotate (_gdee ),_fb .NewPoint (_gada ,_gfaf ).Rotate (_gdee )}}.GetBoundingBox ();_ffda .RotateDeg (_bdcb );_ffda .Translate (_eef .X ,_eef .Y );return _eef .Width ,_eef .Height ;};
// 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 };};func _fbg (_fcdaf *_fc .PdfField ,_cdbg ,_dcd float64 ,_fcc string ,_gedc AppearanceStyle ,_ddb *_a .ContentStreamOperations ,_edge *_fc .PdfPageResources ,_gfd *_gg .PdfObjectDictionary )(*_fc .XObjectForm ,error ){_dac :=_fc .NewPdfPageResources ();_dfg ,_efca :=_cdbg ,_dcd ;_edbg :=_a .NewContentCreator ();if _gedc .BorderSize > 0{_edgeg (_edbg ,_gedc ,_cdbg ,_dcd );};if _gedc .DrawAlignmentReticle {_fgbf :=_gedc ;_fgbf .BorderSize =0.2;_adgc (_edbg ,_fgbf ,_cdbg ,_dcd );};_edbg .Add_BMC ("\u0054\u0078");_edbg .Add_q ();_edbg .Add_BT ();_cdbg ,_dcd =_gedc .applyRotation (_gfd ,_cdbg ,_dcd ,_edbg );_aff ,_cae ,_cfa :=_gedc .processDA (_fcdaf ,_ddb ,_edge ,_dac ,_edbg );if _cfa !=nil {return nil ,_cfa ;};_cbc :=_aff .Font ;_dba :=_aff .Size ;_bgg :=_gg .MakeName (_aff .Name );_bae :=_dba ==0;if _bae &&_cae {_dba =_dcd *_gedc .AutoFontSizeFraction ;};_bcce :=_cbc .Encoder ();if _bcce ==nil {_e .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");_bcce =_c .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};if len (_fcc )==0{return nil ,nil ;};_gadd :=2.0;_fcef :=0.0;if _bcce !=nil {for _ ,_ead :=range _fcc {_becg ,_eaaa :=_cbc .GetRuneMetrics (_ead );if !_eaaa {_e .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",_ead );continue ;};_fcef +=_becg .Wx ;};_fcc =string (_bcce .Encode (_fcc ));};if _dba ==0||_bae &&_fcef > 0&&_gadd +_fcef *_dba /1000.0> _cdbg {_dba =0.95*1000.0*(_cdbg -_gadd )/_fcef ;};_egba :=1.0*_dba ;_gbac :=2.0;{_dfe :=_egba ;if _bae &&_gbac +_dfe > _dcd {_dba =0.95*(_dcd -_gbac );_egba =1.0*_dba ;_dfe =_egba ;};if _dcd > _dfe {_gbac =(_dcd -_dfe )/2.0;_gbac +=1.50;};};_edbg .Add_Tf (*_bgg ,_dba );_edbg .Add_Td (_gadd ,_gbac );_edbg .Add_Tj (*_gg .MakeString (_fcc ));_edbg .Add_ET ();_edbg .Add_Q ();_edbg .Add_EMC ();_dddf :=_fc .NewXObjectForm ();_dddf .Resources =_dac ;_dddf .BBox =_gg .MakeArrayFromFloats ([]float64 {0,0,_dfg ,_efca });_dddf .SetContentStream (_edbg .Bytes (),_fbbd ());return _dddf ,nil ;};
// Style returns the appearance style of `fa`. If not specified, returns default style.
func (_adg FieldAppearance )Style ()AppearanceStyle {if _adg ._ccd !=nil {return *_adg ._ccd ;};return AppearanceStyle {AutoFontSizeFraction :0.65,CheckmarkRune :'✔',BorderSize :0.0,BorderColor :_fc .NewPdfColorDeviceGray (0),FillColor :_fc .NewPdfColorDeviceGray (1),MultilineLineHeight :1.2,MultilineVAlignMiddle :false ,DrawAlignmentReticle :false ,AllowMK :true };};func _da (_ag *_fc .PdfAnnotationWidget ,_fad *_fc .PdfFieldText ,_ee *_fc .PdfPageResources ,_dede AppearanceStyle )(*_gg .PdfObjectDictionary ,error ){_ggf :=_fc .NewPdfPageResources ();_fdb ,_bec :=_gg .GetArray (_ag .Rect );if !_bec {return nil ,_b .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_cgad ,_gf :=_fc .NewPdfRectangle (*_fdb );if _gf !=nil {return nil ,_gf ;};_ega ,_dga :=_cgad .Width (),_cgad .Height ();_gc ,_bff :=_ega ,_dga ;_efg ,_fbd :=_gg .GetDict (_ag .MK );if _fbd {_ffb ,_ :=_gg .GetDict (_ag .BS );_gcb :=_dede .applyAppearanceCharacteristics (_efg ,_ffb ,nil );if _gcb !=nil {return nil ,_gcb ;};};_gd ,_gf :=_a .NewContentStreamParser (_gaddf (_fad .PdfField )).Parse ();if _gf !=nil {return nil ,_gf ;};_aef :=_a .NewContentCreator ();if _dede .BorderSize > 0{_edgeg (_aef ,_dede ,_ega ,_dga );};if _dede .DrawAlignmentReticle {_cdbf :=_dede ;_cdbf .BorderSize =0.2;_adgc (_aef ,_cdbf ,_ega ,_dga );};_aef .Add_BMC ("\u0054\u0078");_aef .Add_q ();_ega ,_dga =_dede .applyRotation (_efg ,_ega ,_dga ,_aef );_aef .Add_BT ();_efa ,_ada ,_gf :=_dede .processDA (_fad .PdfField ,_gd ,_ee ,_ggf ,_aef );if _gf !=nil {return nil ,_gf ;};_agd :=_efa .Font ;_bd :=_efa .Size ;_ca :=_gg .MakeName (_efa .Name );_agg :=_bd ==0;if _agg &&_ada {_bd =_dga *_dede .AutoFontSizeFraction ;};_fac :=_agd .Encoder ();if _fac ==nil {_e .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");_fac =_c .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};_edc ,_gf :=_agd .GetFontDescriptor ();if _gf !=nil {_e .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 _ecb string ;if _cffe ,_bfg :=_gg .GetString (_fad .V );_bfg {_ecb =_cffe .Decoded ();};if len (_ecb )==0{return nil ,nil ;};_eeb :=[]string {_ecb };_gbe :=false ;if _fad .Flags ().Has (_fc .FieldFlagMultiline ){_gbe =true ;_ecb =_fe .Replace (_ecb ,"\u000d\u000a","\u000a",-1);_ecb =_fe .Replace (_ecb ,"\u000d","\u000a",-1);_eeb =_fe .Split (_ecb ,"\u000a");};_gba :=0.0;_cdg :=0;if _fac !=nil {_caa :=len (_eeb );_dgc :=0;for _dgc < _caa {var _aa float64 ;_dfd :=-1;_dfa :=0.0;for _ggb ,_dab :=range _eeb [_dgc ]{if _dab ==' '{_dfd =_ggb ;_aa =_dfa ;};_fbb ,_fcd :=_agd .GetRuneMetrics (_dab );if !_fcd {_e .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",_dab );continue ;};_dfa +=_fbb .Wx ;if _gbe &&!_agg &&_bd *_dfa /1000.0> _ega &&_dfd > 0{_dff :=_eeb [_dgc ][_dfd +1:];if _dgc < len (_eeb )-1{_eeb =append (_eeb [:_dgc +1],_eeb [_dgc :]...);_eeb [_dgc +1]=_dff ;}else {_eeb =append (_eeb ,_dff );};_caa ++;_eeb [_dgc ]=_eeb [_dgc ][0:_dfd ];_dfa =_aa ;break ;};};if _dfa > _gba {_gba =_dfa ;};_eeb [_dgc ]=string (_fac .Encode (_eeb [_dgc ]));if len (_eeb [_dgc ])> 0{_cdg ++;};_dgc ++;};};_fee :=2.0;if _bd ==0||_agg &&_gba > 0&&_fee +_gba *_bd /1000.0> _ega {_bd =0.95*1000.0*(_ega -_fee )/_gba ;};_gga :=_dg ;{if _bffa ,_bba :=_gg .GetIntVal (_fad .Q );_bba {switch _bffa {case 0:_gga =_dg ;case 1:_gga =_acb ;case 2:_gga =_ded ;default:_e .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",_bffa );};};};_def :=_dede .MultilineLineHeight ;_cdbb :=_bd ;if _gbe &&_cdg > 1{_cdbb =_def *_bd ;};var _fadf float64 ;if _edc !=nil {_fadf ,_gf =_edc .GetCapHeight ();if _gf !=nil {_e .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",_gf );};};if int (_fadf )<=0{_e .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");_fadf =1000;};_ba :=_fadf /1000.0*_bd ;_eec :=0.0;{_cad :=float64 (_cdg )*_cdbb ;if _agg &&_eec +_cad > _dga {_bd =0.95*(_dga -_eec )/float64 (_cdg );_cdbb =_bd ;if _gbe &&_cdg > 1{_cdbb =_def *_bd ;};_ba =_fadf /1000.0*_bd ;_cad =float64 (_cdg )*_cdbb ;};if _dga > _cad {if _gbe {if _dede .MultilineVAlignMiddle {_dfda :=(_dga -_cad )/2.0;_eab :=_dfda +_cad -_cdbb ;_eec =_eab ;}else {_eec =_dga -_cdbb ;_eec -=_bd *0.5;};}else {_eec =(_dga -_ba )/2.0;};};};_aef .Add_Tf (*_ca ,_bd );_aef .Add_Td (_fee ,_eec );_ecc :=_fee ;_bg :=_fee ;for _fg ,_gaa :=range _eeb {_cdf :=0.0;for _ ,_ge :=range _gaa {_agf ,_cfb :=_agd .GetRuneMetrics (_ge );if !_cfb {continue ;};_cdf +=_agf .Wx ;};_acc :=_cdf /1000.0*_bd ;_gge :=_ega -_acc ;var _afg float64 ;switch _gga {case _dg :_afg =_ecc ;case _acb :_afg =_gge /2;case _ded :_afg =_gge ;};_fee =_afg -_bg ;if _fee > 0.0{_aef .Add_Td (_fee ,0);};_bg =_afg ;_aef .Add_Tj (*_gg .MakeString (_gaa ));if _fg < len (_eeb )-1{_aef .Add_Td (0,-_cdbb *_def );};};_aef .Add_ET ();_aef .Add_Q ();_aef .Add_EMC ();_cca :=_fc .NewXObjectForm ();_cca .Resources =_ggf ;_cca .BBox =_gg .MakeArrayFromFloats ([]float64 {0,0,_gc ,_bff });_cca .SetContentStream (_aef .Bytes (),_fbbd ());_aad :=_gg .MakeDict ();_aad .Set ("\u004e",_cca .ToPdfObject ());return _aad ,nil ;};
// 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 (_aceg FieldAppearance )WrapContentStream (page *_fc .PdfPage )error {_bbc ,_bde :=page .GetAllContentStreams ();if _bde !=nil {return _bde ;};_gdcd :=_a .NewContentStreamParser (_bbc );_cec ,_bde :=_gdcd .Parse ();if _bde !=nil {return _bde ;};_cec .WrapIfNeeded ();_efd :=[]string {_cec .String ()};return page .SetContentStreams (_efd ,_fbbd ());};func _gaddf (_cdaf *_fc .PdfField )string {if _cdaf ==nil {return "";};_feeg ,_abg :=_cdaf .GetContext ().(*_fc .PdfFieldText );if !_abg {return _gaddf (_cdaf .Parent );};if _feeg .DA !=nil {return _feeg .DA .Str ();};return _gaddf (_feeg .Parent );};func _bdg (_egbd RectangleAnnotationDef )(*_gg .PdfObjectDictionary ,*_fc .PdfRectangle ,error ){_dbeb :=_fc .NewXObjectForm ();_dbeb .Resources =_fc .NewPdfPageResources ();_afa :="";if _egbd .Opacity < 1.0{_ffea :=_gg .MakeDict ();_ffea .Set ("\u0063\u0061",_gg .MakeFloat (_egbd .Opacity ));_ffea .Set ("\u0043\u0041",_gg .MakeFloat (_egbd .Opacity ));_gbc :=_dbeb .Resources .AddExtGState ("\u0067\u0073\u0031",_ffea );if _gbc !=nil {_e .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 ,_gbc ;};_afa ="\u0067\u0073\u0031";};_dffc ,_ccbf ,_agac ,_ebfe :=_ggeb (_egbd ,_afa );if _ebfe !=nil {return nil ,nil ,_ebfe ;};_ebfe =_dbeb .SetContentStream (_dffc ,nil );if _ebfe !=nil {return nil ,nil ,_ebfe ;};_dbeb .BBox =_ccbf .ToPdfObject ();_fdf :=_gg .MakeDict ();_fdf .Set ("\u004e",_dbeb .ToPdfObject ());return _fdf ,_agac ,nil ;};
// SetStyle applies appearance `style` to `fa`.
func (_abc *FieldAppearance )SetStyle (style AppearanceStyle ){_abc ._ccd =&style };func _efc (_ffd *_fc .PdfAcroForm ,_fgbed *_fc .PdfAnnotationWidget ,_ggd *_fc .PdfFieldChoice ,_gfe AppearanceStyle )(*_gg .PdfObjectDictionary ,error ){_bdf ,_cffa :=_gg .GetArray (_fgbed .Rect );if !_cffa {return nil ,_b .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_aec ,_bfa :=_fc .NewPdfRectangle (*_bdf );if _bfa !=nil {return nil ,_bfa ;};_cfc ,_dfb :=_aec .Width (),_aec .Height ();_e .Log .Debug ("\u0043\u0068\u006f\u0069\u0063\u0065\u002c\u0020\u0077\u0061\u0020\u0042S\u003a\u0020\u0025\u0076",_fgbed .BS );_febf ,_bfa :=_a .NewContentStreamParser (_gaddf (_ggd .PdfField )).Parse ();if _bfa !=nil {return nil ,_bfa ;};_gbbd ,_agfb :=_gg .GetDict (_fgbed .MK );if _agfb {_ggbb ,_ :=_gg .GetDict (_fgbed .BS );_cccb :=_gfe .applyAppearanceCharacteristics (_gbbd ,_ggbb ,nil );if _cccb !=nil {return nil ,_cccb ;};};_fca :=_gg .MakeDict ();for _ ,_fce :=range _ggd .Opt .Elements (){if _ccfa ,_abd :=_gg .GetArray (_fce );_abd &&_ccfa .Len ()==2{_fce =_ccfa .Get (1);};var _facc string ;if _gdc ,_bbb :=_gg .GetString (_fce );_bbb {_facc =_gdc .Decoded ();}else if _edb ,_ced :=_gg .GetName (_fce );_ced {_facc =_edb .String ();}else {_e .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",_fce );return nil ,_b .New ("\u006e\u006f\u0074\u0020\u0061\u0020\u006e\u0061\u006d\u0065\u002f\u0073t\u0072\u0069\u006e\u0067");};if len (_facc )> 0{_egee ,_gaeb :=_fbg (_ggd .PdfField ,_cfc ,_dfb ,_facc ,_gfe ,_febf ,_ffd .DR ,_gbbd );if _gaeb !=nil {return nil ,_gaeb ;};_fca .Set (*_gg .MakeName (_facc ),_egee .ToPdfObject ());};};_bffab :=_gg .MakeDict ();_bffab .Set ("\u004e",_fca );return _bffab ,nil ;};func _aga (_ggae *_fc .PdfAnnotationWidget ,_becc *_fc .PdfFieldText ,_dabc *_fc .PdfPageResources ,_efe AppearanceStyle )(*_gg .PdfObjectDictionary ,error ){_fed :=_fc .NewPdfPageResources ();_ebf ,_ffg :=_gg .GetArray (_ggae .Rect );if !_ffg {return nil ,_b .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_dgd ,_dd :=_fc .NewPdfRectangle (*_ebf );if _dd !=nil {return nil ,_dd ;};_eae ,_beg :=_dgd .Width (),_dgd .Height ();_fff ,_gae :=_eae ,_beg ;_gdb ,_cfd :=_gg .GetDict (_ggae .MK );if _cfd {_fgc ,_ :=_gg .GetDict (_ggae .BS );_gdd :=_efe .applyAppearanceCharacteristics (_gdb ,_fgc ,nil );if _gdd !=nil {return nil ,_gdd ;};};_faf ,_cfd :=_gg .GetIntVal (_becc .MaxLen );if !_cfd {return nil ,_b .New ("\u006d\u0061\u0078\u006c\u0065\u006e\u0020\u006e\u006ft\u0020\u0073\u0065\u0074");};if _faf <=0{return nil ,_b .New ("\u006d\u0061\u0078\u004c\u0065\u006e\u0020\u0069\u006ev\u0061\u006c\u0069\u0064");};_ddd :=_eae /float64 (_faf );_eccd ,_dd :=_a .NewContentStreamParser (_gaddf (_becc .PdfField )).Parse ();if _dd !=nil {return nil ,_dd ;};_geg :=_a .NewContentCreator ();if _efe .BorderSize > 0{_edgeg (_geg ,_efe ,_eae ,_beg );};if _efe .DrawAlignmentReticle {_aggf :=_efe ;_aggf .BorderSize =0.2;_adgc (_geg ,_aggf ,_eae ,_beg );};_geg .Add_BMC ("\u0054\u0078");_geg .Add_q ();_ ,_beg =_efe .applyRotation (_gdb ,_eae ,_beg ,_geg );_geg .Add_BT ();_dgcg ,_cef ,_dd :=_efe .processDA (_becc .PdfField ,_eccd ,_dabc ,_fed ,_geg );if _dd !=nil {return nil ,_dd ;};_dad :=_dgcg .Font ;_gbf :=_gg .MakeName (_dgcg .Name );_edg :=_dgcg .Size ;_gaf :=_edg ==0;if _gaf &&_cef {_edg =_beg *_efe .AutoFontSizeFraction ;};_eca :=_dad .Encoder ();if _eca ==nil {_e .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");_eca =_c .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};var _bce string ;if _aac ,_caaa :=_gg .GetString (_becc .V );_caaa {_bce =_aac .Decoded ();};_geg .Add_Tf (*_gbf ,_edg );var _accb float64 ;for _ ,_fgb :=range _bce {_bcc ,_eaf :=_dad .GetRuneMetrics (_fgb );if !_eaf {_e .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",_fgb );continue ;};_gbg :=_bcc .Wy ;if int (_gbg )<=0{_gbg =_bcc .Wx ;};if _gbg > _accb {_accb =_gbg ;};};if int (_accb )==0{_e .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");_accb =1000;};_gcbe ,_dd :=_dad .GetFontDescriptor ();if _dd !=nil {_e .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 _gbb float64 ;if _gcbe !=nil {_gbb ,_dd =_gcbe .GetCapHeight ();if _dd !=nil {_e .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",_dd );};};if int (_gbb )<=0{_e .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");_gbb =1000.0;};_fgd :=_gbb /1000.0*_edg ;_dgdf :=0.0;_afb :=1.0*_edg *(_accb /1000.0);{_fcb :=_afb ;if _gaf &&_dgdf +_fcb > _beg {_edg =0.95*(_beg -_dgdf );_fgd =_gbb /1000.0*_edg ;};if _beg > _fgd {_dgdf =(_beg -_fgd )/2.0;};};_geg .Add_Td (0,_dgdf );if _ecd ,_add :=_gg .GetIntVal (_becc .Q );_add {switch _ecd {case 2:if len (_bce )< _faf {_cag :=float64 (_faf -len (_bce ))*_ddd ;_geg .Add_Td (_cag ,0);};};};for _fgbe ,_bfb :=range _bce {_abf :=2.0;_cda :=string (_bfb );if _eca !=nil {_dgad ,_ggg :=_dad .GetRuneMetrics (_bfb );if !_ggg {_e .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",_bfb );continue ;};_cda =string (_eca .Encode (_cda ));_ffe :=_edg *_dgad .Wx /1000.0;_cbf :=(_ddd -_ffe )/2;_abf =_cbf ;};_geg .Add_Td (_abf ,0);_geg .Add_Tj (*_gg .MakeString (_cda ));if _fgbe !=len (_bce )-1{_geg .Add_Td (_ddd -_abf ,0);};};_geg .Add_ET ();_geg .Add_Q ();_geg .Add_EMC ();_gcd :=_fc .NewXObjectForm ();_gcd .Resources =_fed ;_gcd .BBox =_gg .MakeArrayFromFloats ([]float64 {0,0,_fff ,_gae });_gcd .SetContentStream (_geg .Bytes (),_fbbd ());_ged :=_gg .MakeDict ();_ged .Set ("\u004e",_gcd .ToPdfObject ());return _ged ,nil ;};type quadding int ;
// 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 ;
// 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 (_ecf *AppearanceStyle )applyAppearanceCharacteristics (_aadd *_gg .PdfObjectDictionary ,_bggc *_gg .PdfObjectDictionary ,_eede *_fc .PdfFont )error {if !_ecf .AllowMK {return nil ;};if CA ,_gde :=_gg .GetString (_aadd .Get ("\u0043\u0041"));_gde &&_eede !=nil {_cfg :=CA .Bytes ();if len (_cfg )!=0{_bdc :=[]rune (_eede .Encoder ().Decode (_cfg ));if len (_bdc )==1{_ecf .CheckmarkRune =_bdc [0];};};};if BC ,_efb :=_gg .GetArray (_aadd .Get ("\u0042\u0043"));_efb {_bfbc ,_feed :=BC .ToFloat64Array ();if _feed !=nil {return _feed ;};switch len (_bfbc ){case 1:_ecf .BorderColor =_fc .NewPdfColorDeviceGray (_bfbc [0]);case 3:_ecf .BorderColor =_fc .NewPdfColorDeviceRGB (_bfbc [0],_bfbc [1],_bfbc [2]);case 4:_ecf .BorderColor =_fc .NewPdfColorDeviceCMYK (_bfbc [0],_bfbc [1],_bfbc [2],_bfbc [3]);default:_e .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 (_bfbc ));};if _bggc !=nil {if _cgcc ,_eged :=_gg .GetNumberAsFloat (_bggc .Get ("\u0057"));_eged ==nil {_ecf .BorderSize =_cgcc ;};};};if BG ,_abge :=_gg .GetArray (_aadd .Get ("\u0042\u0047"));_abge {_cgccc ,_dgg :=BG .ToFloat64Array ();if _dgg !=nil {return _dgg ;};switch len (_cgccc ){case 1:_ecf .FillColor =_fc .NewPdfColorDeviceGray (_cgccc [0]);case 3:_ecf .FillColor =_fc .NewPdfColorDeviceRGB (_cgccc [0],_cgccc [1],_cgccc [2]);case 4:_ecf .FillColor =_fc .NewPdfColorDeviceCMYK (_cgccc [0],_cgccc [1],_cgccc [2],_cgccc [3]);default:_e .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 (_cgccc ));};};return nil ;};
// SignatureLine represents a line of information in the signature field appearance.
type SignatureLine struct{Desc string ;Text string ;};func _cfdg (_fag *_fc .PdfAnnotationWidget ,_afbb *_fc .PdfFieldButton ,_gbae *_fc .PdfPageResources ,_bab AppearanceStyle )(*_gg .PdfObjectDictionary ,error ){_fcf ,_aab :=_gg .GetArray (_fag .Rect );if !_aab {return nil ,_b .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_caac ,_dcc :=_fc .NewPdfRectangle (*_fcf );if _dcc !=nil {return nil ,_dcc ;};_aea ,_ede :=_caac .Width (),_caac .Height ();_eaff ,_cgc :=_aea ,_ede ;_e .Log .Debug ("\u0043\u0068\u0065\u0063kb\u006f\u0078\u002c\u0020\u0077\u0061\u0020\u0042\u0053\u003a\u0020\u0025\u0076",_fag .BS );_aeaf ,_dcc :=_fc .NewStandard14Font ("\u005a\u0061\u0070f\u0044\u0069\u006e\u0067\u0062\u0061\u0074\u0073");if _dcc !=nil {return nil ,_dcc ;};_cdc ,_agb :=_gg .GetDict (_fag .MK );if _agb {_fcda ,_ :=_gg .GetDict (_fag .BS );_cdaa :=_bab .applyAppearanceCharacteristics (_cdc ,_fcda ,_aeaf );if _cdaa !=nil {return nil ,_cdaa ;};};_gfa :=_fc .NewXObjectForm ();{_bcd :=_a .NewContentCreator ();if _bab .BorderSize > 0{_edgeg (_bcd ,_bab ,_aea ,_ede );};if _bab .DrawAlignmentReticle {_bgf :=_bab ;_bgf .BorderSize =0.2;_adgc (_bcd ,_bgf ,_aea ,_ede );};_aea ,_ede =_bab .applyRotation (_cdc ,_aea ,_ede ,_bcd );_cfff :=_bab .AutoFontSizeFraction *_ede ;_abb ,_egac :=_aeaf .GetRuneMetrics (_bab .CheckmarkRune );if !_egac {return nil ,_b .New ("\u0067l\u0079p\u0068\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_afba :=_aeaf .Encoder ();_cfe :=_afba .Encode (string (_bab .CheckmarkRune ));_ccf :=_abb .Wx *_cfff /1000.0;_bcea :=705.0;_defb :=_bcea /1000.0*_cfff ;_debd :=2.0;_dccd :=1.0;if _ccf < _aea {_debd =(_aea -_ccf )/2.0;};if _defb < _ede {_dccd =(_ede -_defb )/2.0;};_bcd .Add_q ().Add_g (0).Add_BT ().Add_Tf ("\u005a\u0061\u0044\u0062",_cfff ).Add_Td (_debd ,_dccd ).Add_Tj (*_gg .MakeStringFromBytes (_cfe )).Add_ET ().Add_Q ();_gfa .Resources =_fc .NewPdfPageResources ();_gfa .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_aeaf .ToPdfObject ());_gfa .BBox =_gg .MakeArrayFromFloats ([]float64 {0,0,_eaff ,_cgc });_gfa .SetContentStream (_bcd .Bytes (),_fbbd ());};_adda :=_fc .NewXObjectForm ();{_eaa :=_a .NewContentCreator ();if _bab .BorderSize > 0{_edgeg (_eaa ,_bab ,_aea ,_ede );};_adda .BBox =_gg .MakeArrayFromFloats ([]float64 {0,0,_eaff ,_cgc });_adda .SetContentStream (_eaa .Bytes (),_fbbd ());};_fcg :=_gg .MakeDict ();_fcg .Set ("\u004f\u0066\u0066",_adda .ToPdfObject ());_fcg .Set ("\u0059\u0065\u0073",_gfa .ToPdfObject ());_daa :=_gg .MakeDict ();_daa .Set ("\u004e",_fcg );return _daa ,nil ;};
// CreateRectangleAnnotation creates a rectangle annotation object that can be added to page PDF annotations.
func CreateRectangleAnnotation (rectDef RectangleAnnotationDef )(*_fc .PdfAnnotation ,error ){_fbdc :=_fc .NewPdfAnnotationSquare ();if rectDef .BorderEnabled {_fec ,_gffg ,_dbeg :=rectDef .BorderColor .R (),rectDef .BorderColor .G (),rectDef .BorderColor .B ();_fbdc .C =_gg .MakeArrayFromFloats ([]float64 {_fec ,_gffg ,_dbeg });_bceb :=_fc .NewBorderStyle ();_bceb .SetBorderWidth (rectDef .BorderWidth );_fbdc .BS =_bceb .ToPdfObject ();};if rectDef .FillEnabled {_ggee ,_afcd ,_ebd :=rectDef .FillColor .R (),rectDef .FillColor .G (),rectDef .FillColor .B ();_fbdc .IC =_gg .MakeArrayFromFloats ([]float64 {_ggee ,_afcd ,_ebd });}else {_fbdc .IC =_gg .MakeArrayFromIntegers ([]int {});};if rectDef .Opacity < 1.0{_fbdc .CA =_gg .MakeFloat (rectDef .Opacity );};_caeb ,_bea ,_dbfg :=_bdg (rectDef );if _dbfg !=nil {return nil ,_dbfg ;};_fbdc .AP =_caeb ;_fbdc .Rect =_gg .MakeArrayFromFloats ([]float64 {_bea .Llx ,_bea .Lly ,_bea .Urx ,_bea .Ury });return _fbdc .PdfAnnotation ,nil ;};func _cg (_bbf CircleAnnotationDef ,_afe string )([]byte ,*_fc .PdfRectangle ,*_fc .PdfRectangle ,error ){_ea :=_fb .Circle {X :_bbf .X ,Y :_bbf .Y ,Width :_bbf .Width ,Height :_bbf .Height ,FillEnabled :_bbf .FillEnabled ,FillColor :_bbf .FillColor ,BorderEnabled :_bbf .BorderEnabled ,BorderWidth :_bbf .BorderWidth ,BorderColor :_bbf .BorderColor ,Opacity :_bbf .Opacity };_cff ,_ad ,_ga :=_ea .Draw (_afe );if _ga !=nil {return nil ,nil ,nil ,_ga ;};_db :=&_fc .PdfRectangle {};_db .Llx =_bbf .X +_ad .Llx ;_db .Lly =_bbf .Y +_ad .Lly ;_db .Urx =_bbf .X +_ad .Urx ;_db .Ury =_bbf .Y +_ad .Ury ;return _cff ,_ad ,_db ,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 *_fc .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 _fc .PdfColor ;
// FillColor represents the background color of the appearance annotation area.
FillColor _fc .PdfColor ;
// BorderSize represents border size of the appearance annotation area.
BorderSize float64 ;
// BorderColor represents the border color of the appearance annotation area.
BorderColor _fc .PdfColor ;
// WatermarkImage specifies the image used as a watermark that will be rendered
// behind the signature.
WatermarkImage _g .Image ;
// Image represents the image used for the signature appearance.
Image _g .Image ;
// Encoder specifies the image encoder used for image signature. Defaults to flate encoder.
Encoder _gg .StreamEncoder ;
// ImagePosition specifies the image location relative to the text signature.
ImagePosition SignatureImagePosition ;};
// 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 *_fc .PdfPage ,name string ,rect []float64 ,opt ComboboxFieldOptions )(*_fc .PdfFieldChoice ,error ){if page ==nil {return nil ,_b .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");};if len (name )<=0{return nil ,_b .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 ,_b .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");};_agae :=_fc .NewPdfField ();_ffbd :=&_fc .PdfFieldChoice {};_agae .SetContext (_ffbd );_ffbd .PdfField =_agae ;_ffbd .T =_gg .MakeString (name );_ffbd .Opt =_gg .MakeArray ();for _ ,_bfeg :=range opt .Choices {_ffbd .Opt .Append (_gg .MakeString (_bfeg ));};_ffbd .SetFlag (_fc .FieldFlagCombo );_adb :=_fc .NewPdfAnnotationWidget ();_adb .Rect =_gg .MakeArrayFromFloats (rect );_adb .P =page .ToPdfObject ();_adb .F =_gg .MakeInteger (4);_adb .Parent =_ffbd .ToPdfObject ();_ffbd .Annotations =append (_ffbd .Annotations ,_adb );return _ffbd ,nil ;};func _fbbd ()_gg .StreamEncoder {return _gg .NewFlateEncoder ()};
// 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 *_fc .PdfColorDeviceRGB ;BorderEnabled bool ;BorderWidth float64 ;BorderColor *_fc .PdfColorDeviceRGB ;Opacity float64 ;};
// 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 *_fc .PdfColorDeviceRGB ;BorderEnabled bool ;BorderWidth float64 ;BorderColor *_fc .PdfColorDeviceRGB ;Opacity float64 ;};
// 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 *_fc .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 ;};
// 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 *_fc .PdfColorDeviceRGB ;Opacity float64 ;LineWidth float64 ;LineEndingStyle1 _fb .LineEndingStyle ;LineEndingStyle2 _fb .LineEndingStyle ;};func (_eba *AppearanceStyle )processDA (_bdd *_fc .PdfField ,_edef *_a .ContentStreamOperations ,_efgg ,_ebe *_fc .PdfPageResources ,_eefc *_a .ContentCreator )(*AppearanceFont ,bool ,error ){var _gdg *AppearanceFont ;var _agaf bool ;if _eba .Fonts !=nil {if _eba .Fonts .Fallback !=nil {_gdg =_eba .Fonts .Fallback ;};if _ecaf :=_eba .Fonts .FieldFallbacks ;_ecaf !=nil {if _gcde ,_eedf :=_ecaf [_bdd .PartialName ()];_eedf {_gdg =_gcde ;}else if _dce ,_egg :=_bdd .FullName ();_egg ==nil {if _geb ,_dec :=_ecaf [_dce ];_dec {_gdg =_geb ;};};};_agaf =_eba .Fonts .ForceReplace ;};var _cgg string ;var _addf float64 ;var _eefe bool ;if _edef !=nil {for _ ,_bad :=range *_edef {if _bad .Operand =="\u0054\u0066"&&len (_bad .Params )==2{if _bdb ,_bbfa :=_gg .GetNameVal (_bad .Params [0]);_bbfa {_cgg =_bdb ;};if _gbgd ,_gdga :=_gg .GetNumberAsFloat (_bad .Params [1]);_gdga ==nil {_addf =_gbgd ;};_eefe =true ;continue ;};_eefc .AddOperand (*_bad );};};var _gdgb *AppearanceFont ;var _bac _gg .PdfObject ;if _agaf &&_gdg !=nil {_gdgb =_gdg ;}else {if _efgg !=nil &&_cgg !=""{if _gbaeb ,_begf :=_efgg .GetFontByName (*_gg .MakeName (_cgg ));_begf {if _bgd ,_fade :=_fc .NewPdfFontFromPdfObject (_gbaeb );_fade ==nil {_bac =_gbaeb ;_gdgb =&AppearanceFont {Name :_cgg ,Font :_bgd ,Size :_addf };}else {_e .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",_fade );};};};if _gdgb ==nil &&_gdg !=nil {_gdgb =_gdg ;};if _gdgb ==nil {_bgda ,_fcbd :=_fc .NewStandard14Font ("\u0048e\u006c\u0076\u0065\u0074\u0069\u0063a");if _fcbd !=nil {return nil ,false ,_fcbd ;};_gdgb =&AppearanceFont {Name :"\u0048\u0065\u006c\u0076",Font :_bgda ,Size :_addf };};};_dgcd :=*_gg .MakeName (_gdgb .Name );if _bac ==nil {_bac =_gdgb .Font .ToPdfObject ();};if _efgg !=nil &&!_efgg .HasFontByName (_dgcd ){_efgg .SetFontByName (_dgcd ,_bac );};if _ebe !=nil &&!_ebe .HasFontByName (_dgcd ){_ebe .SetFontByName (_dgcd ,_bac );};return _gdgb ,_eefe ,nil ;};func _bfgg (_eeg []*SignatureLine ,_fbc *SignatureFieldOpts )(*_gg .PdfObjectDictionary ,error ){if _fbc ==nil {_fbc =NewSignatureFieldOpts ();};var _abae error ;var _feee *_gg .PdfObjectName ;_bgc :=_fbc .Font ;if _bgc !=nil {_cce ,_ :=_bgc .GetFontDescriptor ();if _cce !=nil {if _ebed ,_cgf :=_cce .FontName .(*_gg .PdfObjectName );_cgf {_feee =_ebed ;};};if _feee ==nil {_feee =_gg .MakeName ("\u0046\u006f\u006et\u0031");};}else {if _bgc ,_abae =_fc .NewStandard14Font ("\u0048e\u006c\u0076\u0065\u0074\u0069\u0063a");_abae !=nil {return nil ,_abae ;};_feee =_gg .MakeName ("\u0048\u0065\u006c\u0076");};_cfdgf :=_fbc .FontSize ;if _cfdgf <=0{_cfdgf =10;};if _fbc .LineHeight <=0{_fbc .LineHeight =1;};_agbg :=_fbc .LineHeight *_cfdgf ;_fded ,_daaa :=_bgc .GetRuneMetrics (' ');if !_daaa {return nil ,_b .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");};_daca :=_fded .Wx ;var _ece float64 ;var _ddf []string ;for _ ,_dag :=range _eeg {if _dag .Text ==""{continue ;};_dedd :=_dag .Text ;if _dag .Desc !=""{_dedd =_dag .Desc +"\u003a\u0020"+_dedd ;};_ddf =append (_ddf ,_dedd );var _fcfe float64 ;for _ ,_cbfa :=range _dedd {_bddg ,_fcdg :=_bgc .GetRuneMetrics (_cbfa );if !_fcdg {continue ;};_fcfe +=_bddg .Wx ;};if _fcfe > _ece {_ece =_fcfe ;};};_ece =_ece *_cfdgf /1000.0;_gec :=float64 (len (_ddf ))*_agbg ;_gee :=_fbc .Image !=nil ;_eegc :=_fbc .Rect ;if _eegc ==nil {_eegc =[]float64 {0,0,_ece ,_gec };if _gee {_eegc [2]=_ece *2;_eegc [3]=_gec *2;};_fbc .Rect =_eegc ;};_cdd :=_eegc [2]-_eegc [0];_ggdb :=_eegc [3]-_eegc [1];_ffgc ,_agff :=_eegc ,_eegc ;var _cecb ,_bfgb float64 ;if _gee &&len (_ddf )> 0{if _fbc .ImagePosition <=SignatureImageRight {_bcda :=[]float64 {_eegc [0],_eegc [1],_eegc [0]+(_cdd /2),_eegc [3]};_abfg :=[]float64 {_eegc [0]+(_cdd /2),_eegc [1],_eegc [2],_eegc [3]};if _fbc .ImagePosition ==SignatureImageLeft {_ffgc ,_agff =_bcda ,_abfg ;}else {_ffgc ,_agff =_abfg ,_bcda ;};}else {_fcae :=[]float64 {_eegc [0],_eegc [1],_eegc [2],_eegc [1]+(_ggdb /2)};_aaca :=[]float64 {_eegc [0],_eegc [1]+(_ggdb /2),_eegc [2],_eegc [3]};if _fbc .ImagePosition ==SignatureImageTop {_ffgc ,_agff =_aaca ,_fcae ;}else {_ffgc ,_agff =_fcae ,_aaca ;};};};_cecb =_agff [2]-_agff [0];_bfgb =_agff [3]-_agff [1];var _gecd float64 ;if _fbc .AutoSize {if _ece > _cecb ||_gec > _bfgb {_gadc :=_ec .Min (_cecb /_ece ,_bfgb /_gec );_cfdgf *=_gadc ;};_agbg =_fbc .LineHeight *_cfdgf ;_gecd +=(_bfgb -float64 (len (_ddf ))*_agbg )/2;};_bgaf :=_a .NewContentCreator ();_cgab :=_fc .NewPdfPageResources ();_cgab .SetFontByName (*_feee ,_bgc .ToPdfObject ());if _fbc .BorderSize <=0{_fbc .BorderSize =0;_fbc .BorderColor =_fc .NewPdfColorDeviceGray (1);};if _fbc .BorderColor ==nil {_fbc .BorderColor =_fc .NewPdfColorDeviceGray (1);};if _fbc .FillColor ==nil {_fbc .FillColor =_fc .NewPdfColorDeviceGray (1);};_bgaf .Add_q ().SetNonStrokingColor (_fbc .FillColor ).SetStrokingColor (_fbc .BorderColor ).Add_w (_fbc .BorderSize ).Add_re (_eegc [0],_eegc [1],_cdd ,_ggdb ).Add_B ().Add_Q ();if _fbc .WatermarkImage !=nil {_cecg :=[]float64 {_eegc [0],_eegc [1],_eegc [2],_eegc [3]};_gff ,_debf ,_egef :=_dbe (_fbc .WatermarkImage ,"\u0049\u006d\u0061\u0067\u0065\u0057\u0061\u0074\u0065r\u006d\u0061\u0072\u006b",_fbc ,_cecg ,_bgaf );if _egef !=nil {return nil ,_egef ;};_cgab .SetXObjectImageByName (*_gff ,_debf );};_bgaf .Add_q ();_bgaf .Translate (_agff [0],_agff [3]-_agbg -_gecd );_bgaf .Add_BT ();_gffe :=_bgc .Encoder ();for _ ,_cedg :=range _ddf {var _cac []byte ;for _ ,_agda :=range _cedg {if _cd .IsSpace (_agda ){if len (_cac )> 0{_bgaf .SetNonStrokingColor (_fbc .TextColor ).Add_Tf (*_feee ,_cfdgf ).Add_TL (_agbg ).Add_TJ ([]_gg .PdfObject {_gg .MakeStringFromBytes (_cac )}...);_cac =nil ;};_bgaf .Add_Tf (*_feee ,_cfdgf ).Add_TL (_agbg ).Add_TJ ([]_gg .PdfObject {_gg .MakeFloat (-_daca )}...);}else {_cac =append (_cac ,_gffe .Encode (string (_agda ))...);};};if len (_cac )> 0{_bgaf .SetNonStrokingColor (_fbc .TextColor ).Add_Tf (*_feee ,_cfdgf ).Add_TL (_agbg ).Add_TJ ([]_gg .PdfObject {_gg .MakeStringFromBytes (_cac )}...);};_bgaf .Add_Td (0,-_agbg );};_bgaf .Add_ET ();_bgaf .Add_Q ();if _gee {_cbe ,_eaab ,_abad :=_dbe (_fbc .Image ,"\u0049\u006d\u0061\u0067\u0065\u0053\u0069\u0067\u006ea\u0074\u0075\u0072\u0065",_fbc ,_ffgc ,_bgaf );if _abad !=nil {return nil ,_abad ;};_cgab .SetXObjectImageByName (*_cbe ,_eaab );};_ggaf :=_fc .NewXObjectForm ();_ggaf .Resources =_cgab ;_ggaf .BBox =_gg .MakeArrayFromFloats (_eegc );_ggaf .SetContentStream (_bgaf .Bytes (),_fbbd ());_bfe :=_gg .MakeDict ();_bfe .Set ("\u004e",_ggaf .ToPdfObject ());return _bfe ,nil ;};func _edgeg (_dgag *_a .ContentCreator ,_fgbd AppearanceStyle ,_agfe ,_daf float64 ){_dgag .Add_q ().Add_re (0,0,_agfe ,_daf ).Add_w (_fgbd .BorderSize ).SetStrokingColor (_fgbd .BorderColor ).SetNonStrokingColor (_fgbd .FillColor ).Add_B ().Add_Q ();};
// GenerateAppearanceDict generates an appearance dictionary for widget annotation `wa` for the `field` in `form`.
// Implements interface model.FieldAppearanceGenerator.
func (_ce FieldAppearance )GenerateAppearanceDict (form *_fc .PdfAcroForm ,field *_fc .PdfField ,wa *_fc .PdfAnnotationWidget )(*_gg .PdfObjectDictionary ,error ){_e .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 );_ ,_fa :=field .GetContext ().(*_fc .PdfFieldText );_ceg ,_bef :=_gg .GetDict (wa .AP );if _bef &&_ce .OnlyIfMissing &&(!_fa ||!_ce .RegenerateTextFields ){_e .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 _ceg ,nil ;};if form .DR ==nil {form .DR =_fc .NewPdfPageResources ();};switch _ege :=field .GetContext ().(type ){case *_fc .PdfFieldText :_cga :=_ege ;switch {case _cga .Flags ().Has (_fc .FieldFlagPassword ):return nil ,nil ;case _cga .Flags ().Has (_fc .FieldFlagFileSelect ):return nil ,nil ;case _cga .Flags ().Has (_fc .FieldFlagComb ):if _cga .MaxLen !=nil {_feb ,_dbf :=_aga (wa ,_cga ,form .DR ,_ce .Style ());if _dbf !=nil {return nil ,_dbf ;};return _feb ,nil ;};};_faa ,_gad :=_da (wa ,_cga ,form .DR ,_ce .Style ());if _gad !=nil {return nil ,_gad ;};return _faa ,nil ;case *_fc .PdfFieldButton :_ef :=_ege ;if _ef .IsCheckbox (){_ccc ,_deb :=_cfdg (wa ,_ef ,form .DR ,_ce .Style ());if _deb !=nil {return nil ,_deb ;};return _ccc ,nil ;};_e .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",_ef .GetType ());case *_fc .PdfFieldChoice :_ff :=_ege ;switch {case _ff .Flags ().Has (_fc .FieldFlagCombo ):_ace ,_fbe :=_efc (form ,wa ,_ff ,_ce .Style ());if _fbe !=nil {return nil ,_fbe ;};return _ace ,nil ;default:_e .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",_ff .Flags ().String ());};default:_e .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",_ege );};return nil ,nil ;};
// 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 *_fc .PdfPage ,name string ,rect []float64 ,opt CheckboxFieldOptions )(*_fc .PdfFieldButton ,error ){if page ==nil {return nil ,_b .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");};if len (name )<=0{return nil ,_b .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 ,_b .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");};_aacab ,_bcf :=_fc .NewStandard14Font (_fc .ZapfDingbatsName );if _bcf !=nil {return nil ,_bcf ;};_gdgc :=_fc .NewPdfField ();_fbf :=&_fc .PdfFieldButton {};_gdgc .SetContext (_fbf );_fbf .PdfField =_gdgc ;_fbf .T =_gg .MakeString (name );_fbf .SetType (_fc .ButtonTypeCheckbox );_gbd :="\u004f\u0066\u0066";if opt .Checked {_gbd ="\u0059\u0065\u0073";};_fbf .V =_gg .MakeName (_gbd );_ceda :=_fc .NewPdfAnnotationWidget ();_ceda .Rect =_gg .MakeArrayFromFloats (rect );_ceda .P =page .ToPdfObject ();_ceda .F =_gg .MakeInteger (4);_ceda .Parent =_fbf .ToPdfObject ();_aee :=rect [2]-rect [0];_age :=rect [3]-rect [1];var _ffc _d .Buffer ;_ffc .WriteString ("\u0071\u000a");_ffc .WriteString ("\u0030 \u0030\u0020\u0031\u0020\u0072\u0067\n");_ffc .WriteString ("\u0042\u0054\u000a");_ffc .WriteString ("\u002f\u005a\u0061D\u0062\u0020\u0031\u0032\u0020\u0054\u0066\u000a");_ffc .WriteString ("\u0045\u0054\u000a");_ffc .WriteString ("\u0051\u000a");_bgac :=_a .NewContentCreator ();_bgac .Add_q ();_bgac .Add_rg (0,0,1);_bgac .Add_BT ();_bgac .Add_Tf (*_gg .MakeName ("\u005a\u0061\u0044\u0062"),12);_bgac .Add_Td (0,0);_bgac .Add_ET ();_bgac .Add_Q ();_becd :=_fc .NewXObjectForm ();_becd .SetContentStream (_bgac .Bytes (),_gg .NewRawEncoder ());_becd .BBox =_gg .MakeArrayFromFloats ([]float64 {0,0,_aee ,_age });_becd .Resources =_fc .NewPdfPageResources ();_becd .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_aacab .ToPdfObject ());_bgac =_a .NewContentCreator ();_bgac .Add_q ();_bgac .Add_re (0,0,_aee ,_age );_bgac .Add_W ().Add_n ();_bgac .Add_rg (0,0,1);_bgac .Translate (0,3.0);_bgac .Add_BT ();_bgac .Add_Tf (*_gg .MakeName ("\u005a\u0061\u0044\u0062"),12);_bgac .Add_Td (0,0);_bgac .Add_Tj (*_gg .MakeString ("\u0034"));_bgac .Add_ET ();_bgac .Add_Q ();_dea :=_fc .NewXObjectForm ();_dea .SetContentStream (_bgac .Bytes (),_gg .NewRawEncoder ());_dea .BBox =_gg .MakeArrayFromFloats ([]float64 {0,0,_aee ,_age });_dea .Resources =_fc .NewPdfPageResources ();_dea .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_aacab .ToPdfObject ());_gagb :=_gg .MakeDict ();_gagb .Set ("\u004f\u0066\u0066",_becd .ToPdfObject ());_gagb .Set ("\u0059\u0065\u0073",_dea .ToPdfObject ());_bdae :=_gg .MakeDict ();_bdae .Set ("\u004e",_gagb );_ceda .AP =_bdae ;_ceda .AS =_gg .MakeName (_gbd );_fbf .Annotations =append (_fbf .Annotations ,_ceda );return _fbf ,nil ;};func _bfba (_dfeb LineAnnotationDef )(*_gg .PdfObjectDictionary ,*_fc .PdfRectangle ,error ){_abcb :=_fc .NewXObjectForm ();_abcb .Resources =_fc .NewPdfPageResources ();_ggac :="";if _dfeb .Opacity < 1.0{_efbd :=_gg .MakeDict ();_efbd .Set ("\u0063\u0061",_gg .MakeFloat (_dfeb .Opacity ));_efdd :=_abcb .Resources .AddExtGState ("\u0067\u0073\u0031",_efbd );if _efdd !=nil {_e .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 ,_efdd ;};_ggac ="\u0067\u0073\u0031";};_eegf ,_aca ,_dfbg ,_cbeg :=_dcca (_dfeb ,_ggac );if _cbeg !=nil {return nil ,nil ,_cbeg ;};_cbeg =_abcb .SetContentStream (_eegf ,nil );if _cbeg !=nil {return nil ,nil ,_cbeg ;};_abcb .BBox =_aca .ToPdfObject ();_ccb :=_gg .MakeDict ();_ccb .Set ("\u004e",_abcb .ToPdfObject ());return _ccb ,_dfbg ,nil ;};
// NewSignatureFieldOpts returns a new initialized instance of options
// used to generate a signature appearance.
func NewSignatureFieldOpts ()*SignatureFieldOpts {return &SignatureFieldOpts {Font :_fc .DefaultFont (),FontSize :10,LineHeight :1,AutoSize :true ,TextColor :_fc .NewPdfColorDeviceGray (0),BorderColor :_fc .NewPdfColorDeviceGray (0),FillColor :_fc .NewPdfColorDeviceGray (1),Encoder :_gg .NewFlateEncoder (),ImagePosition :SignatureImageLeft };};
// CreateCircleAnnotation creates a circle/ellipse annotation object with appearance stream that can be added to
// page PDF annotations.
func CreateCircleAnnotation (circDef CircleAnnotationDef )(*_fc .PdfAnnotation ,error ){_be :=_fc .NewPdfAnnotationCircle ();if circDef .BorderEnabled {_eb ,_dc ,_bb :=circDef .BorderColor .R (),circDef .BorderColor .G (),circDef .BorderColor .B ();_be .C =_gg .MakeArrayFromFloats ([]float64 {_eb ,_dc ,_bb });_cc :=_fc .NewBorderStyle ();_cc .SetBorderWidth (circDef .BorderWidth );_be .BS =_cc .ToPdfObject ();};if circDef .FillEnabled {_gb ,_ed ,_bc :=circDef .FillColor .R (),circDef .FillColor .G (),circDef .FillColor .B ();_be .IC =_gg .MakeArrayFromFloats ([]float64 {_gb ,_ed ,_bc });}else {_be .IC =_gg .MakeArrayFromIntegers ([]int {});};if circDef .Opacity < 1.0{_be .CA =_gg .MakeFloat (circDef .Opacity );};_cdb ,_bbg ,_eg :=_ab (circDef );if _eg !=nil {return nil ,_eg ;};_be .AP =_cdb ;_be .Rect =_gg .MakeArrayFromFloats ([]float64 {_bbg .Llx ,_bbg .Lly ,_bbg .Urx ,_bbg .Ury });return _be .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 ;};
// 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 *_fc .PdfPage ,name string ,rect []float64 ,opt TextFieldOptions )(*_fc .PdfFieldText ,error ){if page ==nil {return nil ,_b .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");};if len (name )<=0{return nil ,_b .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 ,_b .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");};_dfga :=_fc .NewPdfField ();_eggd :=&_fc .PdfFieldText {};_dfga .SetContext (_eggd );_eggd .PdfField =_dfga ;_eggd .T =_gg .MakeString (name );if opt .MaxLen > 0{_eggd .MaxLen =_gg .MakeInteger (int64 (opt .MaxLen ));};if len (opt .Value )> 0{_eggd .V =_gg .MakeString (opt .Value );};_afed :=_fc .NewPdfAnnotationWidget ();_afed .Rect =_gg .MakeArrayFromFloats (rect );_afed .P =page .ToPdfObject ();_afed .F =_gg .MakeInteger (4);_afed .Parent =_eggd .ToPdfObject ();_eggd .Annotations =append (_eggd .Annotations ,_afed );return _eggd ,nil ;};func _adgc (_cfca *_a .ContentCreator ,_eed AppearanceStyle ,_afga ,_bfff float64 ){_cfca .Add_q ().Add_re (0,0,_afga ,_bfff ).Add_re (0,_bfff /2,_afga ,_bfff /2).Add_re (0,0,_afga ,_bfff ).Add_re (_afga /2,0,_afga /2,_bfff ).Add_w (_eed .BorderSize ).SetStrokingColor (_eed .BorderColor ).SetNonStrokingColor (_eed .FillColor ).Add_B ().Add_Q ();};
// 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 _fc .PdfColor ;FillColor _fc .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 ;};const (SignatureImageLeft SignatureImagePosition =iota ;SignatureImageRight ;SignatureImageTop ;SignatureImageBottom ;);func _ab (_df CircleAnnotationDef )(*_gg .PdfObjectDictionary ,*_fc .PdfRectangle ,error ){_fd :=_fc .NewXObjectForm ();_fd .Resources =_fc .NewPdfPageResources ();_af :="";if _df .Opacity < 1.0{_dcf :=_gg .MakeDict ();_dcf .Set ("\u0063\u0061",_gg .MakeFloat (_df .Opacity ));_dcf .Set ("\u0043\u0041",_gg .MakeFloat (_df .Opacity ));_ae :=_fd .Resources .AddExtGState ("\u0067\u0073\u0031",_dcf );if _ae !=nil {_e .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 ,_ae ;};_af ="\u0067\u0073\u0031";};_fde ,_ac ,_de ,_cf :=_cg (_df ,_af );if _cf !=nil {return nil ,nil ,_cf ;};_cf =_fd .SetContentStream (_fde ,nil );if _cf !=nil {return nil ,nil ,_cf ;};_fd .BBox =_ac .ToPdfObject ();_bf :=_gg .MakeDict ();_bf .Set ("\u004e",_fd .ToPdfObject ());return _bf ,_de ,nil ;};
// CheckboxFieldOptions defines optional parameters for a checkbox field a form.
type CheckboxFieldOptions struct{Checked bool ;};func _dcca (_cdff LineAnnotationDef ,_bdcc string )([]byte ,*_fc .PdfRectangle ,*_fc .PdfRectangle ,error ){_fdg :=_fb .Line {X1 :0,Y1 :0,X2 :_cdff .X2 -_cdff .X1 ,Y2 :_cdff .Y2 -_cdff .Y1 ,LineColor :_cdff .LineColor ,Opacity :_cdff .Opacity ,LineWidth :_cdff .LineWidth ,LineEndingStyle1 :_cdff .LineEndingStyle1 ,LineEndingStyle2 :_cdff .LineEndingStyle2 };_efac ,_dbd ,_ecca :=_fdg .Draw (_bdcc );if _ecca !=nil {return nil ,nil ,nil ,_ecca ;};_faee :=&_fc .PdfRectangle {};_faee .Llx =_cdff .X1 +_dbd .Llx ;_faee .Lly =_cdff .Y1 +_dbd .Lly ;_faee .Urx =_cdff .X1 +_dbd .Urx ;_faee .Ury =_cdff .Y1 +_dbd .Ury ;return _efac ,_dbd ,_faee ,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 ;_ccd *AppearanceStyle ;};
// CreateLineAnnotation creates a line annotation object that can be added to page PDF annotations.
func CreateLineAnnotation (lineDef LineAnnotationDef )(*_fc .PdfAnnotation ,error ){_cbd :=_fc .NewPdfAnnotationLine ();_cbd .L =_gg .MakeArrayFromFloats ([]float64 {lineDef .X1 ,lineDef .Y1 ,lineDef .X2 ,lineDef .Y2 });_agbe :=_gg .MakeName ("\u004e\u006f\u006e\u0065");if lineDef .LineEndingStyle1 ==_fb .LineEndingStyleArrow {_agbe =_gg .MakeName ("C\u006c\u006f\u0073\u0065\u0064\u0041\u0072\u0072\u006f\u0077");};_dbc :=_gg .MakeName ("\u004e\u006f\u006e\u0065");if lineDef .LineEndingStyle2 ==_fb .LineEndingStyleArrow {_dbc =_gg .MakeName ("C\u006c\u006f\u0073\u0065\u0064\u0041\u0072\u0072\u006f\u0077");};_cbd .LE =_gg .MakeArray (_agbe ,_dbc );if lineDef .Opacity < 1.0{_cbd .CA =_gg .MakeFloat (lineDef .Opacity );};_bgcc ,_dced ,_eag :=lineDef .LineColor .R (),lineDef .LineColor .G (),lineDef .LineColor .B ();_cbd .IC =_gg .MakeArrayFromFloats ([]float64 {_bgcc ,_dced ,_eag });_cbd .C =_gg .MakeArrayFromFloats ([]float64 {_bgcc ,_dced ,_eag });_ecfe :=_fc .NewBorderStyle ();_ecfe .SetBorderWidth (lineDef .LineWidth );_cbd .BS =_ecfe .ToPdfObject ();_ade ,_cfdc ,_eccb :=_bfba (lineDef );if _eccb !=nil {return nil ,_eccb ;};_cbd .AP =_ade ;_cbd .Rect =_gg .MakeArrayFromFloats ([]float64 {_cfdc .Llx ,_cfdc .Lly ,_cfdc .Urx ,_cfdc .Ury });return _cbd .PdfAnnotation ,nil ;};const (_dg quadding =0;_acb quadding =1;_ded quadding =2;);
// TextFieldOptions defines optional parameter for a text field in a form.
type TextFieldOptions struct{MaxLen int ;Value string ;};