unipdf/annotator/annotator.go

191 lines
53 KiB
Go
Raw Normal View History

2020-08-27 21:45:09 +00:00
//
// 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.
2020-09-14 09:32:45 +00:00
package annotator ;import (_d "bytes";_ga "errors";_g "github.com/unidoc/unipdf/v3/common";_df "github.com/unidoc/unipdf/v3/contentstream";_gg "github.com/unidoc/unipdf/v3/contentstream/draw";_gdb "github.com/unidoc/unipdf/v3/core";_f "github.com/unidoc/unipdf/v3/internal/textencoding";_gd "github.com/unidoc/unipdf/v3/model";_ba "math";_fb "strings";_b "unicode";);const (_bd quadding =0;_fbd quadding =1;_ab quadding =2;);func _ecb (_babff RectangleAnnotationDef ,_dacbe string )([]byte ,*_gd .PdfRectangle ,*_gd .PdfRectangle ,error ){_cdfe :=_gg .Rectangle {X :0,Y :0,Width :_babff .Width ,Height :_babff .Height ,FillEnabled :_babff .FillEnabled ,FillColor :_babff .FillColor ,BorderEnabled :_babff .BorderEnabled ,BorderWidth :2*_babff .BorderWidth ,BorderColor :_babff .BorderColor ,Opacity :_babff .Opacity };_dafa ,_degd ,_fag :=_cdfe .Draw (_dacbe );if _fag !=nil {return nil ,nil ,nil ,_fag ;};_ffbd :=&_gd .PdfRectangle {};_ffbd .Llx =_babff .X +_degd .Llx ;_ffbd .Lly =_babff .Y +_degd .Lly ;_ffbd .Urx =_babff .X +_degd .Urx ;_ffbd .Ury =_babff .Y +_degd .Ury ;return _dafa ,_degd ,_ffbd ,nil ;};
// NewComboboxField generates a new combobox form field with partial name `name` at location `rect`
// on specified `page` and with field specific options `opt`.
func NewComboboxField (page *_gd .PdfPage ,name string ,rect []float64 ,opt ComboboxFieldOptions )(*_gd .PdfFieldChoice ,error ){if page ==nil {return nil ,_ga .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");};if len (name )<=0{return nil ,_ga .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 ,_ga .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");};_dfb :=_gd .NewPdfField ();_feaa :=&_gd .PdfFieldChoice {};_dfb .SetContext (_feaa );_feaa .PdfField =_dfb ;_feaa .T =_gdb .MakeString (name );_feaa .Opt =_gdb .MakeArray ();for _ ,_egg :=range opt .Choices {_feaa .Opt .Append (_gdb .MakeString (_egg ));};_feaa .SetFlag (_gd .FieldFlagCombo );_cae :=_gd .NewPdfAnnotationWidget ();_cae .Rect =_gdb .MakeArrayFromFloats (rect );_cae .P =page .ToPdfObject ();_cae .F =_gdb .MakeInteger (4);_cae .Parent =_feaa .ToPdfObject ();_feaa .Annotations =append (_feaa .Annotations ,_cae );return _feaa ,nil ;};
2020-08-27 21:45:09 +00:00
2020-09-07 00:23:12 +00:00
// GenerateAppearanceDict generates an appearance dictionary for widget annotation `wa` for the `field` in `form`.
// Implements interface model.FieldAppearanceGenerator.
2020-09-14 09:32:45 +00:00
func (_gf FieldAppearance )GenerateAppearanceDict (form *_gd .PdfAcroForm ,field *_gd .PdfField ,wa *_gd .PdfAnnotationWidget )(*_gdb .PdfObjectDictionary ,error ){_g .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 );_ ,_bfe :=field .GetContext ().(*_gd .PdfFieldText );_cbc ,_cac :=_gdb .GetDict (wa .AP );if _cac &&_gf .OnlyIfMissing &&(!_bfe ||!_gf .RegenerateTextFields ){_g .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 _cbc ,nil ;};if form .DR ==nil {form .DR =_gd .NewPdfPageResources ();};switch _gb :=field .GetContext ().(type ){case *_gd .PdfFieldText :_gc :=_gb ;switch {case _gc .Flags ().Has (_gd .FieldFlagPassword ):return nil ,nil ;case _gc .Flags ().Has (_gd .FieldFlagFileSelect ):return nil ,nil ;case _gc .Flags ().Has (_gd .FieldFlagComb ):if _gc .MaxLen !=nil {_ffc ,_aca :=_gfcg (wa ,_gc ,form .DR ,_gf .Style ());if _aca !=nil {return nil ,_aca ;};return _ffc ,nil ;};};_agca ,_agf :=_fc (wa ,_gc ,form .DR ,_gf .Style ());if _agf !=nil {return nil ,_agf ;};return _agca ,nil ;case *_gd .PdfFieldButton :_fbe :=_gb ;if _fbe .IsCheckbox (){_de ,_fdf :=_ceage (wa ,_fbe ,form .DR ,_gf .Style ());if _fdf !=nil {return nil ,_fdf ;};return _de ,nil ;};_g .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",_fbe .GetType ());case *_gd .PdfFieldChoice :_daf :=_gb ;switch {case _daf .Flags ().Has (_gd .FieldFlagCombo ):_ed ,_eag :=_ead (form ,wa ,_daf ,_gf .Style ());if _eag !=nil {return nil ,_eag ;};return _ed ,nil ;default:_g .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",_daf .Flags ().String ());};default:_g .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",_gb );};return nil ,nil ;};
2020-09-07 00:23:12 +00:00
// 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 ;};
2020-09-14 09:32:45 +00:00
// AppearanceFontStyle defines font style characteristics for form fields,
// used in the filling/flattening process.
type AppearanceFontStyle struct{
2020-09-07 00:23:12 +00:00
2020-09-14 09:32:45 +00:00
// 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 ;
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// 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 ;
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// 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 _ead (_agdg *_gd .PdfAcroForm ,_ebgf *_gd .PdfAnnotationWidget ,_feb *_gd .PdfFieldChoice ,_cda AppearanceStyle )(*_gdb .PdfObjectDictionary ,error ){_ecc ,_fgf :=_gdb .GetArray (_ebgf .Rect );if !_fgf {return nil ,_ga .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_dag ,_fbef :=_gd .NewPdfRectangle (*_ecc );if _fbef !=nil {return nil ,_fbef ;};_fab ,_age :=_dag .Width (),_dag .Height ();_g .Log .Debug ("\u0043\u0068\u006f\u0069\u0063\u0065\u002c\u0020\u0077\u0061\u0020\u0042S\u003a\u0020\u0025\u0076",_ebgf .BS );_bcc ,_fbef :=_df .NewContentStreamParser (_aaaa (_feb .PdfField )).Parse ();if _fbef !=nil {return nil ,_fbef ;};_dfgg ,_bcacg :=_gdb .GetDict (_ebgf .MK );if _bcacg {_fdac ,_ :=_gdb .GetDict (_ebgf .BS );_bcbf :=_cda .applyAppearanceCharacteristics (_dfgg ,_fdac ,nil );if _bcbf !=nil {return nil ,_bcbf ;};};_dgc :=_gdb .MakeDict ();for _ ,_eg :=range _feb .Opt .Elements (){if _daea ,_eeaa :=_gdb .GetArray (_eg );_eeaa &&_daea .Len ()==2{_eg =_daea .Get (1);};var _gge string ;if _cede ,_dbgg :=_gdb .GetString (_eg );_dbgg {_gge =_cede .Decoded ();}else if _ceb ,_bbcc :=_gdb .GetName (_eg );_bbcc {_gge =_ceb .String ();}else {_g .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",_eg );return nil ,_ga .New ("\u006e\u006f\u0074\u0020\u0061\u0020\u006e\u0061\u006d\u0065\u002f\u0073t\u0072\u0069\u006e\u0067");};if len (_gge )> 0{_fea ,_afa :=_bfb (_feb .PdfField ,_fab ,_age ,_gge ,_cda ,_bcc ,_agdg .DR ,_dfgg );if _afa !=nil {return nil ,_afa ;};_dgc .Set (*_gdb .MakeName (_gge ),_fea .ToPdfObject ());};};_aaa :=_gdb .MakeDict ();_aaa .Set ("\u004e",_dgc );return _aaa ,nil ;};
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// SignatureLine represents a line of information in the signature field appearance.
type SignatureLine struct{Desc string ;Text string ;};func _ebee (_agg *_df .ContentCreator ,_geab AppearanceStyle ,_daec ,_cgf float64 ){_agg .Add_q ().Add_re (0,0,_daec ,_cgf ).Add_w (_geab .BorderSize ).SetStrokingColor (_geab .BorderColor ).SetNonStrokingColor (_geab .FillColor ).Add_B ().Add_Q ();};func (_eff *AppearanceStyle )applyRotation (_bfac *_gdb .PdfObjectDictionary ,_bea ,_aag float64 ,_cdag *_df .ContentCreator )(float64 ,float64 ){if !_eff .AllowMK {return _bea ,_aag ;};if _bfac ==nil {return _bea ,_aag ;};_cde ,_ :=_gdb .GetNumberAsFloat (_bfac .Get ("\u0052"));if _cde ==0{return _bea ,_aag ;};_dcf :=-_cde ;_babf :=_gg .Path {Points :[]_gg .Point {_gg .NewPoint (0,0).Rotate (_dcf ),_gg .NewPoint (_bea ,0).Rotate (_dcf ),_gg .NewPoint (0,_aag ).Rotate (_dcf ),_gg .NewPoint (_bea ,_aag ).Rotate (_dcf )}}.GetBoundingBox ();_cdag .RotateDeg (_cde );_cdag .Translate (_babf .X ,_babf .Y );return _babf .Width ,_babf .Height ;};type quadding int ;func _aaaa (_bba *_gd .PdfField )string {if _bba ==nil {return "";};_cabg ,_gbce :=_bba .GetContext ().(*_gd .PdfFieldText );if !_gbce {return _aaaa (_bba .Parent );};if _cabg .DA !=nil {return _cabg .DA .Str ();};return _aaaa (_cabg .Parent );};
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// 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 *_gd .PdfColorDeviceRGB ;BorderEnabled bool ;BorderWidth float64 ;BorderColor *_gd .PdfColorDeviceRGB ;Opacity float64 ;};func _ceage (_bedc *_gd .PdfAnnotationWidget ,_fef *_gd .PdfFieldButton ,_dbbb *_gd .PdfPageResources ,_fbaa AppearanceStyle )(*_gdb .PdfObjectDictionary ,error ){_cbed ,_bdf :=_gdb .GetArray (_bedc .Rect );if !_bdf {return nil ,_ga .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_bfage ,_cdf :=_gd .NewPdfRectangle (*_cbed );if _cdf !=nil {return nil ,_cdf ;};_fbc ,_ccba :=_bfage .Width (),_bfage .Height ();_cga ,_afe :=_fbc ,_ccba ;_g .Log .Debug ("\u0043\u0068\u0065\u0063kb\u006f\u0078\u002c\u0020\u0077\u0061\u0020\u0042\u0053\u003a\u0020\u0025\u0076",_bedc .BS );_dacb ,_cdf :=_gd .NewStandard14Font ("\u005a\u0061\u0070f\u0044\u0069\u006e\u0067\u0062\u0061\u0074\u0073");if _cdf !=nil {return nil ,_cdf ;};_ebce ,_aaf :=_gdb .GetDict (_bedc .MK );if _aaf {_gee ,_ :=_gdb .GetDict (_bedc .BS );_abbb :=_fbaa .applyAppearanceCharacteristics (_ebce ,_gee ,_dacb );if _abbb !=nil {return nil ,_abbb ;};};_ggce :=_gd .NewXObjectForm ();{_fdff :=_df .NewContentCreator ();if _fbaa .BorderSize > 0{_ebee (_fdff ,_fbaa ,_fbc ,_ccba );};if _fbaa .DrawAlignmentReticle {_fed :=_fbaa ;_fed .BorderSize =0.2;_ade (_fdff ,_fed ,_fbc ,_ccba );};_fbc ,_ccba =_fbaa .applyRotation (_ebce ,_fbc ,_ccba ,_fdff );_aed :=_fbaa .AutoFontSizeFraction *_ccba ;_aab ,_cecf :=_dacb .GetRuneMetrics (_fbaa .CheckmarkRune );if !_cecf {return nil ,_ga .New ("\u0067l\u0079p\u0068\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_dfg :=_dacb .Encoder ();_eef :=_dfg .Encode (string (_fbaa .CheckmarkRune ));_gcc :=_aab .Wx *_aed /1000.0;_ebcc :=705.0;_gfga :=_ebcc /1000.0*_aed ;_gea :=2.0;_ceec :=1.0;if _gcc < _fbc {_gea =(_fbc -_gcc )/2.0;};if _gfga < _ccba {_ceec =(_ccba -_gfga )/2.0;};_fdff .Add_q ().Add_g (0).Add_BT ().Add_Tf ("\u005a\u0061\u0044\u0062",_aed ).Add_Td (_gea ,_ceec ).Add_Tj (*_gdb .MakeStringFromBytes (_eef )).Add_ET ().Add_Q ();_ggce .Resources =_gd .NewPdfPageResources ();_ggce .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_dacb .ToPdfObject ());_ggce .BBox =_gdb .MakeArrayFromFloats ([]float64 {0,0,_cga ,_afe });_ggce .SetContentStream (_fdff .Bytes (),_abd ());};_daca :=_gd .NewXObjectForm ();{_gda :=_df .NewContentCreator ();if _fbaa .BorderSize > 0{_ebee (_gda ,_fbaa ,_fbc ,_ccba );};_daca .BBox =_gdb .MakeArrayFromFloats ([]float64 {0,0,_cga ,_afe });_daca .SetContentStream (_gda .Bytes (),_abd ());};_bgc :=_gdb .MakeDict ();_bgc .Set ("\u004f\u0066\u0066",_daca .ToPdfObject ());_bgc .Set ("\u0059\u0065\u0073",_ggce .ToPdfObject ());_beda :=_gdb .MakeDict ();_beda .Set ("\u004e",_bgc );return _beda ,nil ;};
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// NewSignatureFieldOpts returns a new initialized instance of options
// used to generate a signature appearance.
func NewSignatureFieldOpts ()*SignatureFieldOpts {return &SignatureFieldOpts {Font :_gd .DefaultFont (),FontSize :10,LineHeight :1,AutoSize :true ,TextColor :_gd .NewPdfColorDeviceGray (0),BorderColor :_gd .NewPdfColorDeviceGray (0),FillColor :_gd .NewPdfColorDeviceGray (1)};};func _cb (_cd CircleAnnotationDef )(*_gdb .PdfObjectDictionary ,*_gd .PdfRectangle ,error ){_ge :=_gd .NewXObjectForm ();_ge .Resources =_gd .NewPdfPageResources ();_gad :="";if _cd .Opacity < 1.0{_ea :=_gdb .MakeDict ();_ea .Set ("\u0063\u0061",_gdb .MakeFloat (_cd .Opacity ));_ea .Set ("\u0043\u0041",_gdb .MakeFloat (_cd .Opacity ));_eb :=_ge .Resources .AddExtGState ("\u0067\u0073\u0031",_ea );if _eb !=nil {_g .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 ,_eb ;};_gad ="\u0067\u0073\u0031";};_ff ,_bed ,_ag ,_gdg :=_ee (_cd ,_gad );if _gdg !=nil {return nil ,nil ,_gdg ;};_gdg =_ge .SetContentStream (_ff ,nil );if _gdg !=nil {return nil ,nil ,_gdg ;};_ge .BBox =_bed .ToPdfObject ();_cg :=_gdb .MakeDict ();_cg .Set ("\u004e",_ge .ToPdfObject ());return _cg ,_ag ,nil ;};
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// 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 *_gd .PdfPage ,name string ,rect []float64 ,opt TextFieldOptions )(*_gd .PdfFieldText ,error ){if page ==nil {return nil ,_ga .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");};if len (name )<=0{return nil ,_ga .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 ,_ga .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");};_aadb :=_gd .NewPdfField ();_dgb :=&_gd .PdfFieldText {};_aadb .SetContext (_dgb );_dgb .PdfField =_aadb ;_dgb .T =_gdb .MakeString (name );if opt .MaxLen > 0{_dgb .MaxLen =_gdb .MakeInteger (int64 (opt .MaxLen ));};if len (opt .Value )> 0{_dgb .V =_gdb .MakeString (opt .Value );};_fefd :=_gd .NewPdfAnnotationWidget ();_fefd .Rect =_gdb .MakeArrayFromFloats (rect );_fefd .P =page .ToPdfObject ();_fefd .F =_gdb .MakeInteger (4);_fefd .Parent =_dgb .ToPdfObject ();_dgb .Annotations =append (_dgb .Annotations ,_fefd );return _dgb ,nil ;};func _ade (_dcc *_df .ContentCreator ,_daed AppearanceStyle ,_gfb ,_caca float64 ){_dcc .Add_q ().Add_re (0,0,_gfb ,_caca ).Add_re (0,_caca /2,_gfb ,_caca /2).Add_re (0,0,_gfb ,_caca ).Add_re (_gfb /2,0,_gfb /2,_caca ).Add_w (_daed .BorderSize ).SetStrokingColor (_daed .BorderColor ).SetNonStrokingColor (_daed .FillColor ).Add_B ().Add_Q ();};
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// CreateCircleAnnotation creates a circle/ellipse annotation object with appearance stream that can be added to
// page PDF annotations.
func CreateCircleAnnotation (circDef CircleAnnotationDef )(*_gd .PdfAnnotation ,error ){_be :=_gd .NewPdfAnnotationCircle ();if circDef .BorderEnabled {_db ,_fa ,_bg :=circDef .BorderColor .R (),circDef .BorderColor .G (),circDef .BorderColor .B ();_be .C =_gdb .MakeArrayFromFloats ([]float64 {_db ,_fa ,_bg });_cc :=_gd .NewBorderStyle ();_cc .SetBorderWidth (circDef .BorderWidth );_be .BS =_cc .ToPdfObject ();};if circDef .FillEnabled {_e ,_a ,_ac :=circDef .FillColor .R (),circDef .FillColor .G (),circDef .FillColor .B ();_be .IC =_gdb .MakeArrayFromFloats ([]float64 {_e ,_a ,_ac });}else {_be .IC =_gdb .MakeArrayFromIntegers ([]int {});};if circDef .Opacity < 1.0{_be .CA =_gdb .MakeFloat (circDef .Opacity );};_bb ,_ace ,_bbg :=_cb (circDef );if _bbg !=nil {return nil ,_bbg ;};_be .AP =_bb ;_be .Rect =_gdb .MakeArrayFromFloats ([]float64 {_ace .Llx ,_ace .Lly ,_ace .Urx ,_ace .Ury });return _be .PdfAnnotation ,nil ;};
2020-09-07 00:23:12 +00:00
2020-09-14 09:32:45 +00:00
// CheckboxFieldOptions defines optional parameters for a checkbox field a form.
type CheckboxFieldOptions struct{Checked bool ;};func (_acd *AppearanceStyle )applyAppearanceCharacteristics (_ebdg *_gdb .PdfObjectDictionary ,_gebf *_gdb .PdfObjectDictionary ,_bbb *_gd .PdfFont )error {if !_acd .AllowMK {return nil ;};if _gebf !=nil {if _ggf ,_aad :=_gdb .GetNumberAsFloat (_gebf .Get ("\u0057"));_aad ==nil {_acd .BorderSize =_ggf ;};};if CA ,_eaaf :=_gdb .GetString (_ebdg .Get ("\u0043\u0041"));_eaaf &&_bbb !=nil {_fdacd :=CA .Bytes ();if len (_fdacd )!=0{_eadb :=[]rune (_bbb .Encoder ().Decode (_fdacd ));if len (_eadb )==1{_acd .CheckmarkRune =_eadb [0];};};};if BC ,_fgfg :=_gdb .GetArray (_ebdg .Get ("\u0042\u0043"));_fgfg {_dce ,_ddad :=BC .ToFloat64Array ();if _ddad !=nil {return _ddad ;};switch len (_dce ){case 1:_acd .BorderColor =_gd .NewPdfColorDeviceGray (_dce [0]);case 3:_acd .BorderColor =_gd .NewPdfColorDeviceRGB (_dce [0],_dce [1],_dce [2]);case 4:_acd .BorderColor =_gd .NewPdfColorDeviceCMYK (_dce [0],_dce [1],_dce [2],_dce [3]);default:_g .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 (_dce ));};};if BG ,_bgdf :=_gdb .GetArray (_ebdg .Get ("\u0042\u0047"));_bgdf {_dga ,_deee :=BG .ToFloat64Array ();if _deee !=nil {return _deee ;};switch len (_dga ){case 1:_acd .FillColor =_gd .NewPdfColorDeviceGray (_dga [0]);case 3:_acd .FillColor =_gd .NewPdfColorDeviceRGB (_dga [0],_dga [1],_dga [2]);case 4:_acd .FillColor =_gd .NewPdfColorDeviceCMYK (_dga [0],_dga [1],_dga [2],_dga [3]);default:_g .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 (_dga ));};};return 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 (_cdgb FieldAppearance )WrapContentStream (page *_gd .PdfPage )error {_bdfd ,_dgg :=page .GetAllContentStreams ();if _dgg !=nil {return _dgg ;};_agag :=_df .NewContentStreamParser (_bdfd );_bbae ,_dgg :=_agag .Parse ();if _dgg !=nil {return _dgg ;};_bbae .WrapIfNeeded ();_adgd :=[]string {_bbae .String ()};return page .SetContentStreams (_adgd ,_abd ());};
// FieldAppearance implements interface model.FieldAppearanceGenerator and generates appearance streams
// for fields taking into account what value is in the field. A common use case is for generating the
// appearance stream prior to flattening fields.
//
// If `OnlyIfMissing` is true, the field appearance is generated only for fields that do not have an
// appearance stream specified.
// If `RegenerateTextFields` is true, all text fields are regenerated (even if OnlyIfMissing is true).
type FieldAppearance struct{OnlyIfMissing bool ;RegenerateTextFields bool ;_da *AppearanceStyle ;};
2020-08-27 21:45:09 +00:00
// 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.
2020-09-14 09:32:45 +00:00
Font *_gd .PdfFont ;
2020-08-27 21:45:09 +00:00
// 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.
2020-09-14 09:32:45 +00:00
Size float64 ;};type CircleAnnotationDef struct{X float64 ;Y float64 ;Width float64 ;Height float64 ;FillEnabled bool ;FillColor *_gd .PdfColorDeviceRGB ;BorderEnabled bool ;BorderWidth float64 ;BorderColor *_gd .PdfColorDeviceRGB ;Opacity 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 *_gd .PdfColorDeviceRGB ;Opacity float64 ;LineWidth float64 ;LineEndingStyle1 _gg .LineEndingStyle ;LineEndingStyle2 _gg .LineEndingStyle ;};
// 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 _dbf (_acf RectangleAnnotationDef )(*_gdb .PdfObjectDictionary ,*_gd .PdfRectangle ,error ){_afc :=_gd .NewXObjectForm ();_afc .Resources =_gd .NewPdfPageResources ();_ddec :="";if _acf .Opacity < 1.0{_efbd :=_gdb .MakeDict ();_efbd .Set ("\u0063\u0061",_gdb .MakeFloat (_acf .Opacity ));_efbd .Set ("\u0043\u0041",_gdb .MakeFloat (_acf .Opacity ));_effc :=_afc .Resources .AddExtGState ("\u0067\u0073\u0031",_efbd );if _effc !=nil {_g .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 ,_effc ;};_ddec ="\u0067\u0073\u0031";};_gbd ,_cbaf ,_fecg ,_efe :=_ecb (_acf ,_ddec );if _efe !=nil {return nil ,nil ,_efe ;};_efe =_afc .SetContentStream (_gbd ,nil );if _efe !=nil {return nil ,nil ,_efe ;};_afc .BBox =_cbaf .ToPdfObject ();_afca :=_gdb .MakeDict ();_afca .Set ("\u004e",_afc .ToPdfObject ());return _afca ,_fecg ,nil ;};func (_cdc *AppearanceStyle )processDA (_gada *_gd .PdfField ,_cgc *_df .ContentStreamOperations ,_dgd ,_bbe *_gd .PdfPageResources ,_dde *_df .ContentCreator )(*AppearanceFont ,bool ,error ){var _ggb *AppearanceFont ;var _fcg bool ;if _cdc .Fonts !=nil {if _cdc .Fonts .Fallback !=nil {_ggb =_cdc .Fonts .Fallback ;};if _fbb :=_cdc .Fonts .FieldFallbacks ;_fbb !=nil {if _fbfc ,_eee :=_fbb [_gada .PartialName ()];_eee {_ggb =_fbfc ;}else if _ggag ,_cbb :=_gada .FullName ();_cbb ==nil {if _fbbg ,_ecd :=_fbb [_ggag ];_ecd {_ggb =_fbbg ;};};};_fcg =_cdc .Fonts .ForceReplace ;};var _cgd string ;var _dfc float64 ;var _bbf bool ;if _cgc !=nil {for _ ,_fceg :=range *_cgc {if _fceg .Operand =="\u0054\u0066"&&len (_fceg .Params )==2{if _cfa ,_eab :=_gdb .GetNameVal (_fceg .Params [0]);_eab {_cgd =_cfa ;};if _gbcg ,_fbcb :=_gdb .GetNumberAsFloat (_fceg .Params [1]);_fbcb ==nil {_dfc =_gbcg ;};_bbf =true ;continue ;};_dde .AddOperand (*_fceg );};};var _egb *AppearanceFont ;var _ceac _gdb .PdfObject ;if _fcg &&_ggb !=nil {_egb =_ggb ;}else {if _dgd !=nil &&_cgd !=""{if _fdfd ,_dagc :=_dgd .GetFontByName (*_gdb .MakeName (_cgd ));_dagc {if _cfad ,_adg :=_gd .NewPdfFontFromPdfObject (_fdfd );_adg ==nil {_ceac =_fdfd ;_egb =&AppearanceFont {Name :_cgd ,Font :_cfad ,Size :_dfc };}else {_g .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",_adg );};};};if _egb ==nil &&_ggb !=nil {_egb =_ggb ;};if _egb ==nil {_dcbc ,_aafe :=_gd .NewStandard14Font ("\u0048e\u006c\u0076\u0065\u0074\u0069\u0063a");if _aafe !=nil {return nil ,false ,_aafe ;};_egb =&AppearanceFont {Name :"\u0048\u0065\u006c\u0076",Font :_dcbc ,Size :_dfc };};};_cgba :=*_gdb .MakeName (_egb .Name );if _ceac ==nil {_ceac =_egb .Font .ToPdfObject ();};if _dgd !=nil &&!_dgd .HasFontByName (_cgba ){_dgd .SetFontByName (_cgba ,_ceac );};if _bbe !=nil &&!_bbe .HasFontByName (_cgba ){_bbe .SetFontByName (_cgba ,_ceac );};return _egb ,_bbf ,nil ;};
// Style returns the appearance style of `fa`. If not specified, returns default style.
func (_ae FieldAppearance )Style ()AppearanceStyle {if _ae ._da !=nil {return *_ae ._da ;};return AppearanceStyle {AutoFontSizeFraction :0.65,CheckmarkRune :'✔',BorderSize :0.0,BorderColor :_gd .NewPdfColorDeviceGray (0),FillColor :_gd .NewPdfColorDeviceGray (1),MultilineLineHeight :1.2,MultilineVAlignMiddle :false ,DrawAlignmentReticle :false ,AllowMK :true };};func _fc (_cec *_gd .PdfAnnotationWidget ,_cdb *_gd .PdfFieldText ,_abb *_gd .PdfPageResources ,_cacf AppearanceStyle )(*_gdb .PdfObjectDictionary ,error ){_ccf :=_gd .NewPdfPageResources ();_bfg ,_aeb :=_gdb .GetArray (_cec .Rect );if !_aeb {return nil ,_ga .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_dac ,_gdbe :=_gd .NewPdfRectangle (*_bfg );if _gdbe !=nil {return nil ,_gdbe ;};_bfc ,_dfa :=_dac .Width (),_dac .Height ();_aga ,_dee :=_bfc ,_dfa ;_cbe ,_ced :=_gdb .GetDict (_cec .MK );if _ced {_ebg ,_ :=_gdb .GetDict (_cec .BS );_dafd :=_cacf .applyAppearanceCharacteristics (_cbe ,_ebg ,nil );if _dafd !=nil {return nil ,_dafd ;};};_gaf ,_gdbe :=_df .NewContentStreamParser (_aaaa (_cdb .PdfField )).Parse ();if _gdbe !=nil {return nil ,_gdbe ;};_aee :=_df .NewContentCreator ();if _cacf .BorderSize > 0{_ebee (_aee ,_cacf ,_bfc ,_dfa );};if _cacf .DrawAlignmentReticle {_ec :=_cacf ;_ec .BorderSize =0.2;_ade (_aee ,_ec ,_bfc ,_dfa );};_aee .Add_BMC ("\u0054\u0078");_aee .Add_q ();_bfc ,_dfa =_cacf .applyRotation (_cbe ,_bfc ,_dfa ,_aee );_aee .Add_BT ();_gac ,_agfd ,_gdbe :=_cacf .processDA (_cdb .PdfField ,_gaf ,_abb ,_ccf ,_aee );if _gdbe !=nil {return nil ,_gdbe ;};_fcag :=_gac .Font ;_dbd :=_gac .Size ;_eagd :=_gdb .MakeName (_gac .Name );_bgb :=_dbd ==0;if _bgb &&_agfd {_dbd =_dfa *_cacf .AutoFontSizeFraction ;};_dbb :=_fcag .Encoder ();if _dbb ==nil {_g .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");_dbb =_f .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};_bge ,_gdbe :=_fcag .GetFontDescriptor ();if _gdbe !=nil {_g .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 _fdd string ;if _cf ,_cea :=_gdb .GetString (_cdb .V );_cea {_fdd =_cf .Decoded ();};if len (_fdd )==0{return nil ,nil ;};_ecf :=[]string {_fdd };_aa :=false ;if _cdb .Flags ().Has (_gd .FieldFlagMultiline ){_aa =true ;_fdd =_fb .Replace (_fdd ,"\u000d\u000a","\u000a",-1);_fdd =_fb .Replace (_fdd ,"\u000d","\u000a",-1);_ecf =_fb .Split (_fdd ,"\u000a");};_bab :=0.0;_edd :=0;if _dbb !=nil {_dg :=len (_ecf );_fce :=0;for _fce < _dg {var _gaa float64 ;_geb :=-1;_gae :=0.0;for _gfc ,_fbf :=range _ecf [_fce ]{if _fbf ==' '{_geb =_gfc ;_gaa =_gae ;};_dd ,_gfg :=_fcag .GetRuneMetrics (_fbf );if !_gfg {_g .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",_fbf );continue ;};_gae +=_dd .Wx ;if _aa &&!_bgb &&_dbd *_gae /1000.0> _bfc &&_geb > 0{_bdg :=_ecf [_fce ][_geb +1:];if _fce < len (_ecf )-1{_ecf [_fce +1]+=_bdg ;}else {_ecf =append (_ecf ,_bdg );_dg ++;};_ecf [_fce ]=_ecf [_fce ][0:_geb ];_gae =_gaa ;break ;};};if _gae > _bab {_bab =_gae ;};_ecf [_fce ]=string (_dbb .Encode (_ecf [_fce ]));if len (_ecf [_fce ])> 0{_edd ++;};_fce ++;};};_dcb :=2.0;if _dbd ==0||_bgb &&_bab > 0&&_dcb +_bab *_dbd /1000.0> _bfc {_dbd =0.95*1000.0*(_bfc -_dcb )/_bab ;};_fg :=_bd ;{if _bfa ,_gcd :=_gdb .GetIntVal (_cdb .Q );_gcd {switch _bfa {case 0:_fg =_bd ;case 1:_fg =_fbd ;case 2:_fg =_ab ;default:_g .Log .D
2020-08-27 21:45:09 +00:00
2020-09-07 00:23:12 +00:00
// CreateRectangleAnnotation creates a rectangle annotation object that can be added to page PDF annotations.
2020-09-14 09:32:45 +00:00
func CreateRectangleAnnotation (rectDef RectangleAnnotationDef )(*_gd .PdfAnnotation ,error ){_fbbb :=_gd .NewPdfAnnotationSquare ();if rectDef .BorderEnabled {_eeb ,_bdac ,_gfgc :=rectDef .BorderColor .R (),rectDef .BorderColor .G (),rectDef .BorderColor .B ();_fbbb .C =_gdb .MakeArrayFromFloats ([]float64 {_eeb ,_bdac ,_gfgc });_dbgge :=_gd .NewBorderStyle ();_dbgge .SetBorderWidth (rectDef .BorderWidth );_fbbb .BS =_dbgge .ToPdfObject ();};if rectDef .FillEnabled {_agcb ,_eacd ,_fbab :=rectDef .FillColor .R (),rectDef .FillColor .G (),rectDef .FillColor .B ();_fbbb .IC =_gdb .MakeArrayFromFloats ([]float64 {_agcb ,_eacd ,_fbab });}else {_fbbb .IC =_gdb .MakeArrayFromIntegers ([]int {});};if rectDef .Opacity < 1.0{_fbbb .CA =_gdb .MakeFloat (rectDef .Opacity );};_cdad ,_egbd ,_gecf :=_dbf (rectDef );if _gecf !=nil {return nil ,_gecf ;};_fbbb .AP =_cdad ;_fbbb .Rect =_gdb .MakeArrayFromFloats ([]float64 {_egbd .Llx ,_egbd .Lly ,_egbd .Urx ,_egbd .Ury });return _fbbb .PdfAnnotation ,nil ;};func _abd ()_gdb .StreamEncoder {return _gdb .NewFlateEncoder ()};func _edb (_bef LineAnnotationDef )(*_gdb .PdfObjectDictionary ,*_gd .PdfRectangle ,error ){_cgfb :=_gd .NewXObjectForm ();_cgfb .Resources =_gd .NewPdfPageResources ();_dba :="";if _bef .Opacity < 1.0{_cfd :=_gdb .MakeDict ();_cfd .Set ("\u0063\u0061",_gdb .MakeFloat (_bef .Opacity ));_dafdg :=_cgfb .Resources .AddExtGState ("\u0067\u0073\u0031",_cfd );if _dafdg !=nil {_g .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 ,_dafdg ;};_dba ="\u0067\u0073\u0031";};_ebb ,_bbef ,_abff ,_gce :=_fbee (_bef ,_dba );if _gce !=nil {return nil ,nil ,_gce ;};_gce =_cgfb .SetContentStream (_ebb ,nil );if _gce !=nil {return nil ,nil ,_gce ;};_cgfb .BBox =_bbef .ToPdfObject ();_dfag :=_gdb .MakeDict ();_dfag .Set ("\u004e",_cgfb .ToPdfObject ());return _dfag ,_abff ,nil ;};
2020-08-27 21:45:09 +00:00
// 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.
2020-09-14 09:32:45 +00:00
Font *_gd .PdfFont ;
2020-08-27 21:45:09 +00:00
// 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.
2020-09-14 09:32:45 +00:00
TextColor _gd .PdfColor ;
2020-08-27 21:45:09 +00:00
// FillColor represents the background color of the appearance annotation area.
2020-09-14 09:32:45 +00:00
FillColor _gd .PdfColor ;
2020-08-27 21:45:09 +00:00
// BorderSize represents border size of the appearance annotation area.
BorderSize float64 ;
// BorderColor represents the border color of the appearance annotation area.
2020-09-14 09:32:45 +00:00
BorderColor _gd .PdfColor ;};
2020-08-27 21:45:09 +00:00
2020-09-14 09:32:45 +00:00
// 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 *_gd .PdfSignature ,lines []*SignatureLine ,opts *SignatureFieldOpts )(*_gd .PdfFieldSignature ,error ){if signature ==nil {return nil ,_ga .New ("\u0073\u0069\u0067na\u0074\u0075\u0072\u0065\u0020\u0063\u0061\u006e\u006e\u006f\u0074\u0020\u0062\u0065\u0020\u006e\u0069\u006c");};_afag ,_ccgg :=_fde (lines ,opts );if _ccgg !=nil {return nil ,_ccgg ;};_fecd :=_gd .NewPdfFieldSignature (signature );_fecd .Rect =_gdb .MakeArrayFromFloats (opts .Rect );_fecd .AP =_afag ;return _fecd ,nil ;};
2020-08-27 21:45:09 +00:00
2020-09-07 00:23:12 +00:00
// NewCheckboxField generates a new checkbox field with partial name `name` at location `rect`
// on specified `page` and with field specific options `opt`.
2020-09-14 09:32:45 +00:00
func NewCheckboxField (page *_gd .PdfPage ,name string ,rect []float64 ,opt CheckboxFieldOptions )(*_gd .PdfFieldButton ,error ){if page ==nil {return nil ,_ga .New ("\u0070a\u0067e\u0020\u006e\u006f\u0074\u0020s\u0070\u0065c\u0069\u0066\u0069\u0065\u0064");};if len (name )<=0{return nil ,_ga .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 ,_ga .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0072\u0061\u006e\u0067\u0065");};_caf ,_gab :=_gd .NewStandard14Font (_gd .ZapfDingbatsName );if _gab !=nil {return nil ,_gab ;};_bgbe :=_gd .NewPdfField ();_gfce :=&_gd .PdfFieldButton {};_bgbe .SetContext (_gfce );_gfce .PdfField =_bgbe ;_gfce .T =_gdb .MakeString (name );_gfce .SetType (_gd .ButtonTypeCheckbox );_edcb :="\u004f\u0066\u0066";if opt .Checked {_edcb ="\u0059\u0065\u0073";};_gfce .V =_gdb .MakeName (_edcb );_dgba :=_gd .NewPdfAnnotationWidget ();_dgba .Rect =_gdb .MakeArrayFromFloats (rect );_dgba .P =page .ToPdfObject ();_dgba .F =_gdb .MakeInteger (4);_dgba .Parent =_gfce .ToPdfObject ();_cfg :=rect [2]-rect [0];_afg :=rect [3]-rect [1];var _cecb _d .Buffer ;_cecb .WriteString ("\u0071\u000a");_cecb .WriteString ("\u0030 \u0030\u0020\u0031\u0020\u0072\u0067\n");_cecb .WriteString ("\u0042\u0054\u000a");_cecb .WriteString ("\u002f\u005a\u0061D\u0062\u0020\u0031\u0032\u0020\u0054\u0066\u000a");_cecb .WriteString ("\u0045\u0054\u000a");_cecb .WriteString ("\u0051\u000a");_agb :=_df .NewContentCreator ();_agb .Add_q ();_agb .Add_rg (0,0,1);_agb .Add_BT ();_agb .Add_Tf (*_gdb .MakeName ("\u005a\u0061\u0044\u0062"),12);_agb .Add_Td (0,0);_agb .Add_ET ();_agb .Add_Q ();_fbbf :=_gd .NewXObjectForm ();_fbbf .SetContentStream (_agb .Bytes (),_gdb .NewRawEncoder ());_fbbf .BBox =_gdb .MakeArrayFromFloats ([]float64 {0,0,_cfg ,_afg });_fbbf .Resources =_gd .NewPdfPageResources ();_fbbf .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_caf .ToPdfObject ());_agb =_df .NewContentCreator ();_agb .Add_q ();_agb .Add_re (0,0,_cfg ,_afg );_agb .Add_W ().Add_n ();_agb .Add_rg (0,0,1);_agb .Translate (0,3.0);_agb .Add_BT ();_agb .Add_Tf (*_gdb .MakeName ("\u005a\u0061\u0044\u0062"),12);_agb .Add_Td (0,0);_agb .Add_Tj (*_gdb .MakeString ("\u0034"));_agb .Add_ET ();_agb .Add_Q ();_geef :=_gd .NewXObjectForm ();_geef .SetContentStream (_agb .Bytes (),_gdb .NewRawEncoder ());_geef .BBox =_gdb .MakeArrayFromFloats ([]float64 {0,0,_cfg ,_afg });_geef .Resources =_gd .NewPdfPageResources ();_geef .Resources .SetFontByName ("\u005a\u0061\u0044\u0062",_caf .ToPdfObject ());_abcc :=_gdb .MakeDict ();_abcc .Set ("\u004f\u0066\u0066",_fbbf .ToPdfObject ());_abcc .Set ("\u0059\u0065\u0073",_geef .ToPdfObject ());_dbgb :=_gdb .MakeDict ();_dbgb .Set ("\u004e",_abcc );_dgba .AP =_dbgb ;_dgba .AS =_gdb .MakeName (_edcb );_gfce .Annotations =append (_gfce .Annotations ,_dgba );return _gfce ,nil ;};func _fde (_dabe []*SignatureLine ,_fcagb *SignatureFieldOpts )(*_gdb .PdfObjectDictionary ,error ){if _fcagb ==nil {_fcagb =NewSignatureFieldOpts ();};var _ebf error ;var _aabb *_gdb .PdfObjectName ;_eagc :=_fcagb .Font ;if _eagc !=nil {_aeg ,_ :=_eagc .GetFontDescriptor ();if _aeg !=nil {if _ffg ,_ecdb :=_aeg .FontName .(*_gdb .PdfObjectName );_ecdb {_aabb =_ffg ;};};if _aabb ==nil {_aabb =_gdb .MakeName ("\u0046\u006f\u006et\u0031");};}else {if _eagc ,_ebf =_gd .NewStandard14Font ("\u0048e\u006c\u0076\u0065\u0074\u0069\u0063a");_ebf !=nil {return nil ,_ebf ;};_aabb =_gdb .MakeName ("\u0048\u0065\u006c\u0076");};_fddd :=_fcagb .FontSize ;if _fddd <=0{_fddd =10;};if _fcagb .LineHeight <=0{_fcagb .LineHeight =1;};_bcbc :=_fcagb .LineHeight *_fddd ;_fcgd ,_cfada :=_eagc .GetRuneMetrics (' ');if !_cfada {return nil ,_ga .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");};_eed :=_fcgd .Wx ;var _dgaf float64 ;var _bccb []string ;for _ ,_dgca :=range _dabe {if
2020-08-27 21:45:09 +00:00
2020-09-14 09:32:45 +00:00
// AppearanceStyle defines style parameters for appearance stream generation.
type AppearanceStyle struct{
2020-08-27 21:45:09 +00:00
2020-09-14 09:32:45 +00:00
// How much of Rect height to fill when autosizing text.
AutoFontSizeFraction float64 ;
2020-08-27 21:45:09 +00:00
2020-09-14 09:32:45 +00:00
// CheckmarkRune is a rune used for check mark in checkboxes (for ZapfDingbats font).
CheckmarkRune rune ;BorderSize float64 ;BorderColor _gd .PdfColor ;FillColor _gd .PdfColor ;
2020-08-27 21:45:09 +00:00
2020-09-14 09:32:45 +00:00
// Multiplier for lineheight for multi line text.
MultilineLineHeight float64 ;MultilineVAlignMiddle bool ;
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// Visual guide checking alignment of field contents (debugging).
DrawAlignmentReticle bool ;
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// Allow field MK appearance characteristics to override style settings.
AllowMK bool ;
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// Fonts holds appearance styles for fonts.
Fonts *AppearanceFontStyle ;};func _gfcg (_fcef *_gd .PdfAnnotationWidget ,_cba *_gd .PdfFieldText ,_aea *_gd .PdfPageResources ,_ebga AppearanceStyle )(*_gdb .PdfObjectDictionary ,error ){_fda :=_gd .NewPdfPageResources ();_dbg ,_dfad :=_gdb .GetArray (_fcef .Rect );if !_dfad {return nil ,_ga .New ("\u0069\u006e\u0076a\u006c\u0069\u0064\u0020\u0052\u0065\u0063\u0074");};_eac ,_agcd :=_gd .NewPdfRectangle (*_dbg );if _agcd !=nil {return nil ,_agcd ;};_eea ,_bfag :=_eac .Width (),_eac .Height ();_fga ,_bfgb :=_eea ,_bfag ;_bfgf ,_eeg :=_gdb .GetDict (_fcef .MK );if _eeg {_beg ,_ :=_gdb .GetDict (_fcef .BS );_ccfc :=_ebga .applyAppearanceCharacteristics (_bfgf ,_beg ,nil );if _ccfc !=nil {return nil ,_ccfc ;};};_dfe ,_eeg :=_gdb .GetIntVal (_cba .MaxLen );if !_eeg {return nil ,_ga .New ("\u006d\u0061\u0078\u006c\u0065\u006e\u0020\u006e\u006ft\u0020\u0073\u0065\u0074");};if _dfe <=0{return nil ,_ga .New ("\u006d\u0061\u0078\u004c\u0065\u006e\u0020\u0069\u006ev\u0061\u006c\u0069\u0064");};_dbe :=float64 (_eea )/float64 (_dfe );_gefg ,_agcd :=_df .NewContentStreamParser (_aaaa (_cba .PdfField )).Parse ();if _agcd !=nil {return nil ,_agcd ;};_gfca :=_df .NewContentCreator ();if _ebga .BorderSize > 0{_ebee (_gfca ,_ebga ,_eea ,_bfag );};if _ebga .DrawAlignmentReticle {_fdaa :=_ebga ;_fdaa .BorderSize =0.2;_ade (_gfca ,_fdaa ,_eea ,_bfag );};_gfca .Add_BMC ("\u0054\u0078");_gfca .Add_q ();_eea ,_bfag =_ebga .applyRotation (_bfgf ,_eea ,_bfag ,_gfca );_gfca .Add_BT ();_efd ,_ccb ,_agcd :=_ebga .processDA (_cba .PdfField ,_gefg ,_aea ,_fda ,_gfca );if _agcd !=nil {return nil ,_agcd ;};_gbc :=_efd .Font ;_bcb :=_gdb .MakeName (_efd .Name );_ebc :=_efd .Size ;_dcg :=_ebc ==0;if _dcg &&_ccb {_ebc =_bfag *_ebga .AutoFontSizeFraction ;};_afb :=_gbc .Encoder ();if _afb ==nil {_g .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");_afb =_f .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};var _fba string ;if _bfde ,_bbc :=_gdb .GetString (_cba .V );_bbc {_fba =_bfde .Decoded ();};_gfca .Add_Tf (*_bcb ,_ebc );var _fe float64 ;for _ ,_afd :=range _fba {_ffe ,_agfa :=_gbc .GetRuneMetrics (_afd );if !_agfa {_g .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",_afd );continue ;};_dfd :=_ffe .Wy ;if int (_dfd )<=0{_dfd =_ffe .Wx ;};if _dfd > _fe {_fe =_dfd ;};};if int (_fe )==0{_g .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");_fe =1000;};_fdfc ,_agcd :=_gbc .GetFontDescriptor ();if _agcd !=nil {_g .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 _cca float64 ;if _fdfc !=nil {_cca ,_agcd =_fdfc .GetCapHeight ();if _agcd !=nil {_g .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",_agcd );};};if int (_cca )<=0{_g .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\u0
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// SetStyle applies appearance `style` to `fa`.
func (_dae *FieldAppearance )SetStyle (style AppearanceStyle ){_dae ._da =&style };
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// CreateLineAnnotation creates a line annotation object that can be added to page PDF annotations.
func CreateLineAnnotation (lineDef LineAnnotationDef )(*_gd .PdfAnnotation ,error ){_gcg :=_gd .NewPdfAnnotationLine ();_gcg .L =_gdb .MakeArrayFromFloats ([]float64 {lineDef .X1 ,lineDef .Y1 ,lineDef .X2 ,lineDef .Y2 });_dccf :=_gdb .MakeName ("\u004e\u006f\u006e\u0065");if lineDef .LineEndingStyle1 ==_gg .LineEndingStyleArrow {_dccf =_gdb .MakeName ("C\u006c\u006f\u0073\u0065\u0064\u0041\u0072\u0072\u006f\u0077");};_cfadc :=_gdb .MakeName ("\u004e\u006f\u006e\u0065");if lineDef .LineEndingStyle2 ==_gg .LineEndingStyleArrow {_cfadc =_gdb .MakeName ("C\u006c\u006f\u0073\u0065\u0064\u0041\u0072\u0072\u006f\u0077");};_gcg .LE =_gdb .MakeArray (_dccf ,_cfadc );if lineDef .Opacity < 1.0{_gcg .CA =_gdb .MakeFloat (lineDef .Opacity );};_gff ,_ggfd ,_aade :=lineDef .LineColor .R (),lineDef .LineColor .G (),lineDef .LineColor .B ();_gcg .IC =_gdb .MakeArrayFromFloats ([]float64 {_gff ,_ggfd ,_aade });_gcg .C =_gdb .MakeArrayFromFloats ([]float64 {_gff ,_ggfd ,_aade });_ceg :=_gd .NewBorderStyle ();_ceg .SetBorderWidth (lineDef .LineWidth );_gcg .BS =_ceg .ToPdfObject ();_ffb ,_acbf ,_agac :=_edb (lineDef );if _agac !=nil {return nil ,_agac ;};_gcg .AP =_ffb ;_gcg .Rect =_gdb .MakeArrayFromFloats ([]float64 {_acbf .Llx ,_acbf .Lly ,_acbf .Urx ,_acbf .Ury });return _gcg .PdfAnnotation ,nil ;};func _fbee (_ddb LineAnnotationDef ,_fbge string )([]byte ,*_gd .PdfRectangle ,*_gd .PdfRectangle ,error ){_afad :=_gg .Line {X1 :0,Y1 :0,X2 :_ddb .X2 -_ddb .X1 ,Y2 :_ddb .Y2 -_ddb .Y1 ,LineColor :_ddb .LineColor ,Opacity :_ddb .Opacity ,LineWidth :_ddb .LineWidth ,LineEndingStyle1 :_ddb .LineEndingStyle1 ,LineEndingStyle2 :_ddb .LineEndingStyle2 };_caef ,_cabf ,_cag :=_afad .Draw (_fbge );if _cag !=nil {return nil ,nil ,nil ,_cag ;};_ddc :=&_gd .PdfRectangle {};_ddc .Llx =_ddb .X1 +_cabf .Llx ;_ddc .Lly =_ddb .Y1 +_cabf .Lly ;_ddc .Urx =_ddb .X1 +_cabf .Urx ;_ddc .Ury =_ddb .Y1 +_cabf .Ury ;return _caef ,_cabf ,_ddc ,nil ;};
2020-08-31 21:12:07 +00:00
2020-09-14 09:32:45 +00:00
// TextFieldOptions defines optional parameter for a text field in a form.
type TextFieldOptions struct{MaxLen int ;Value string ;};func _bfb (_gfdd *_gd .PdfField ,_cgb ,_gbb float64 ,_daeac string ,_fac AppearanceStyle ,_bcd *_df .ContentStreamOperations ,_gged *_gd .PdfPageResources ,_acb *_gdb .PdfObjectDictionary )(*_gd .XObjectForm ,error ){_dcge :=_gd .NewPdfPageResources ();_eaga ,_cef :=_cgb ,_gbb ;_fdg :=_df .NewContentCreator ();if _fac .BorderSize > 0{_ebee (_fdg ,_fac ,_cgb ,_gbb );};if _fac .DrawAlignmentReticle {_bgf :=_fac ;_bgf .BorderSize =0.2;_ade (_fdg ,_bgf ,_cgb ,_gbb );};_fdg .Add_BMC ("\u0054\u0078");_fdg .Add_q ();_fdg .Add_BT ();_cgb ,_gbb =_fac .applyRotation (_acb ,_cgb ,_gbb ,_fdg );_ggd ,_gfdb ,_aff :=_fac .processDA (_gfdd ,_bcd ,_gged ,_dcge ,_fdg );if _aff !=nil {return nil ,_aff ;};_afdf :=_ggd .Font ;_bgg :=_ggd .Size ;_bgd :=_gdb .MakeName (_ggd .Name );_agef :=_bgg ==0;if _agef &&_gfdb {_bgg =_gbb *_fac .AutoFontSizeFraction ;};_dfdd :=_afdf .Encoder ();if _dfdd ==nil {_g .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");_dfdd =_f .NewIdentityTextEncoder ("\u0049\u0064\u0065\u006e\u0074\u0069\u0074\u0079\u002d\u0048");};if len (_daeac )==0{return nil ,nil ;};_eaf :=2.0;_caa :=0.0;if _dfdd !=nil {for _ ,_fbdf :=range _daeac {_bedca ,_bda :=_afdf .GetRuneMetrics (_fbdf );if !_bda {_g .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",_fbdf );continue ;};_caa +=_bedca .Wx ;};_daeac =string (_dfdd .Encode (_daeac ));};if _bgg ==0||_agef &&_caa > 0&&_eaf +_caa *_bgg /1000.0> _cgb {_bgg =0.95*1000.0*(_cgb -_eaf )/_caa ;};_cab :=1.0*_bgg ;_bgfg :=2.0;{_ccd :=_cab ;if _agef &&_bgfg +_ccd > _gbb {_bgg =0.95*(_gbb -_bgfg );_cab =1.0*_bgg ;_ccd =_cab ;};if _gbb > _ccd {_bgfg =(_gbb -_ccd )/2.0;_bgfg +=1.50;};};_fdg .Add_Tf (*_bgd ,_bgg );_fdg .Add_Td (_eaf ,_bgfg );_fdg .Add_Tj (*_gdb .MakeString (_daeac ));_fdg .Add_ET ();_fdg .Add_Q ();_fdg .Add_EMC ();_beca :=_gd .NewXObjectForm ();_beca .Resources =_dcge ;_beca .BBox =_gdb .MakeArrayFromFloats ([]float64 {0,0,_eaga ,_cef });_beca .SetContentStream (_fdg .Bytes (),_abd ());return _beca ,nil ;};