unipdf/fdf/fdf.go

32 lines
30 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 fdf provides support for loading form field data from Form Field Data (FDF) files.
2020-08-31 21:12:07 +00:00
package fdf ;import (_fa "bufio";_fe "bytes";_a "encoding/hex";_g "errors";_gg "fmt";_acg "github.com/unidoc/unipdf/v3/common";_cec "github.com/unidoc/unipdf/v3/core";_ce "io";_ac "os";_f "regexp";_be "sort";_b "strconv";_e "strings";);
2020-08-27 21:45:09 +00:00
// FieldValues implements interface model.FieldValueProvider.
// Returns a map of field names to values (PdfObjects).
2020-08-31 21:12:07 +00:00
func (fdf *Data )FieldValues ()(map[string ]_cec .PdfObject ,error ){_cg ,_ff :=fdf .FieldDictionaries ();if _ff !=nil {return nil ,_ff ;};var _eec []string ;for _bde :=range _cg {_eec =append (_eec ,_bde );};_be .Strings (_eec );_cd :=map[string ]_cec .PdfObject {};for _ ,_ga :=range _eec {_fd :=_cg [_ga ];_da :=_cec .TraceToDirectObject (_fd .Get ("\u0056"));_cd [_ga ]=_da ;};return _cd ,nil ;};type fdfParser struct{_dcd int ;_cda int ;_aea map[int64 ]_cec .PdfObject ;_cbd _ce .ReadSeeker ;_ddg *_fa .Reader ;_bfb int64 ;_fac *_cec .PdfObjectDictionary ;};func (_gab *fdfParser )readAtLeast (_fed []byte ,_ggf int )(int ,error ){_ecc :=_ggf ;_dd :=0;_ad :=0;for _ecc > 0{_bf ,_ed :=_gab ._ddg .Read (_fed [_dd :]);if _ed !=nil {_acg .Log .Debug ("\u0045\u0052\u0052O\u0052\u0020\u0046\u0061i\u006c\u0065\u0064\u0020\u0072\u0065\u0061d\u0069\u006e\u0067\u0020\u0028\u0025\u0064\u003b\u0025\u0064\u0029\u0020\u0025\u0073",_bf ,_ad ,_ed .Error ());return _dd ,_g .New ("\u0066\u0061\u0069\u006c\u0065\u0064\u0020\u0072\u0065a\u0064\u0069\u006e\u0067");};_ad ++;_dd +=_bf ;_ecc -=_bf ;};return _dd ,nil ;};
2020-08-27 21:45:09 +00:00
// FieldDictionaries returns a map of field names to field dictionaries.
2020-08-31 21:12:07 +00:00
func (fdf *Data )FieldDictionaries ()(map[string ]*_cec .PdfObjectDictionary ,error ){_ee :=map[string ]*_cec .PdfObjectDictionary {};for _ae :=0;_ae < fdf ._ea .Len ();_ae ++{_dc ,_bd :=_cec .GetDict (fdf ._ea .Get (_ae ));if _bd {_bb ,_ :=_cec .GetString (_dc .Get ("\u0054"));if _bb !=nil {_ee [_bb .Str ()]=_dc ;};};};return _ee ,nil ;};var _daa =_f .MustCompile ("\u0025\u0025\u0045O\u0046");func (_gcc *fdfParser )getFileOffset ()int64 {_ba ,_ :=_gcc ._cbd .Seek (0,_ce .SeekCurrent );_ba -=int64 (_gcc ._ddg .Buffered ());return _ba ;};func (_abd *fdfParser )parseFdfVersion ()(int ,int ,error ){_abd ._cbd .Seek (0,_ce .SeekStart );_ggd :=20;_beb :=make ([]byte ,_ggd );_abd ._cbd .Read (_beb );_bba :=_fff .FindStringSubmatch (string (_beb ));if len (_bba )< 3{_bdd ,_cca ,_edf :=_abd .seekFdfVersionTopDown ();if _edf !=nil {_acg .Log .Debug ("F\u0061\u0069\u006c\u0065\u0064\u0020\u0072\u0065\u0063\u006f\u0076\u0065\u0072\u0079\u0020\u002d\u0020\u0075n\u0061\u0062\u006c\u0065\u0020\u0074\u006f\u0020\u0066\u0069nd\u0020\u0076\u0065r\u0073i\u006f\u006e");return 0,0,_edf ;};return _bdd ,_cca ,nil ;};_acb ,_aef :=_b .Atoi (_bba [1]);if _aef !=nil {return 0,0,_aef ;};_eg ,_aef :=_b .Atoi (_bba [2]);if _aef !=nil {return 0,0,_aef ;};_acg .Log .Debug ("\u0046\u0064\u0066\u0020\u0076\u0065\u0072\u0073\u0069\u006f\u006e\u0020%\u0064\u002e\u0025\u0064",_acb ,_eg );return int (_acb ),int (_eg ),nil ;};var _cdd =_f .MustCompile ("\u0028\u005c\u0064\u002b)\\\u0073\u002b\u0028\u005c\u0064\u002b\u0029\u005c\u0073\u002b\u006f\u0062\u006a");func (_fcc *fdfParser )parse ()error {_fcc ._cbd .Seek (0,_ce .SeekStart );_fcc ._ddg =_fa .NewReader (_fcc ._cbd );for {_fcc .skipComments ();_bbe ,_bbec :=_fcc ._ddg .Peek (20);if _bbec !=nil {_acg .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u003a\u0020\u0046\u0061\u0069\u006c\u0020\u0074\u006f\u0020r\u0065a\u0064\u0020\u0069\u006e\u0064\u0069\u0072\u0065\u0063\u0074\u0020\u006f\u0062\u006a");return _bbec ;};if _e .HasPrefix (string (_bbe ),"\u0074r\u0061\u0069\u006c\u0065\u0072"){_fcc ._ddg .Discard (7);_fcc .skipSpaces ();_fcc .skipComments ();_fffb ,_ :=_fcc .parseDict ();_fcc ._fac =_fffb ;break ;};_gcfe :=_cdd .FindStringSubmatchIndex (string (_bbe ));if len (_gcfe )< 6{_acg .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u003a\u0020U\u006e\u0061\u0062l\u0065\u0020\u0074\u006f \u0066\u0069\u006e\u0064\u0020\u006f\u0062\u006a\u0065\u0063\u0074\u0020\u0073\u0069\u0067\u006e\u0061\u0074\u0075\u0072\u0065\u0020\u0028\u0025\u0073\u0029",string (_bbe ));return _g .New ("\u0075\u006e\u0061b\u006c\u0065\u0020\u0074\u006f\u0020\u0064\u0065\u0074\u0065\u0063\u0074\u0020\u0069\u006e\u0064\u0069\u0072\u0065\u0063\u0074\u0020\u006f\u0062\u006a\u0065\u0063\u0074\u0020s\u0069\u0067\u006e\u0061\u0074\u0075\u0072\u0065");};_gbe ,_bbec :=_fcc .parseIndirectObject ();if _bbec !=nil {return _bbec ;};switch _ceb :=_gbe .(type ){case *_cec .PdfIndirectObject :_fcc ._aea [_ceb .ObjectNumber ]=_ceb ;case *_cec .PdfObjectStream :_fcc ._aea [_ceb .ObjectNumber ]=_ceb ;default:return _g .New ("\u0074\u0079\u0070\u0065\u0020\u0065\u0072\u0072\u006f\u0072");};};return nil ;};func (_af *fdfParser )readTextLine ()(string ,error ){var _faca _fe .Buffer ;for {_cc ,_cgg :=_af ._ddg .Peek (1);if _cgg !=nil {_acg .Log .Debug ("\u0045\u0072\u0072\u006f\u0072\u0020\u0025\u0073",_cgg .Error ());return _faca .String (),_cgg ;};if (_cc [0]!='\r')&&(_cc [0]!='\n'){_efa ,_ :=_af ._ddg .ReadByte ();_faca .WriteByte (_efa );}else {break ;};};return _faca .String (),nil ;};func (_gb *fdfParser )parseName ()(_cec .PdfObjectName ,error ){var _cf _fe .Buffer ;_efe :=false ;for {_gce ,_cfd :=_gb ._ddg .Peek (1);if _cfd ==_ce .EOF {break ;};if _cfd !=nil {return _cec .PdfObjectName (_cf .String ()),_cfd ;};if !_efe {if _gce [0]=='/'{_efe =true ;_gb ._ddg .ReadByte ();}else if _gce [0]=='%'{_gb .readComment ();_gb .skipSpaces ();}else {_acg .Log .Debug ("\u0045\u0052\u0052\u004f\u0052\u0020N\u0061\u006d\u0065\u0020\u0073\u0074\u0061\u0072\u0074\u0069\u006e\u0067\u0020w\u0069\u0074\u0068\u0020\u0025\u0073\u0020(\u0025\u0020\u0078\u0029",_gce ,_gce )
// Load loads FDF form data from `r`.
func Load (r _ce .ReadSeeker )(*Data ,error ){_bg ,_aa :=_abcb (r );if _aa !=nil {return nil ,_aa ;};_ec ,_aa :=_bg .Root ();if _aa !=nil {return nil ,_aa ;};_gf ,_ggb :=_cec .GetArray (_ec .Get ("\u0046\u0069\u0065\u006c\u0064\u0073"));if !_ggb {return nil ,_g .New ("\u0066\u0069\u0065\u006c\u0064\u0073\u0020\u006d\u0069s\u0073\u0069\u006e\u0067");};return &Data {_ea :_gf ,_fee :_ec },nil ;};
2020-08-27 21:45:09 +00:00
// LoadFromPath loads FDF form data from file path `fdfPath`.
2020-08-31 21:12:07 +00:00
func LoadFromPath (fdfPath string )(*Data ,error ){_d ,_fc :=_ac .Open (fdfPath );if _fc !=nil {return nil ,_fc ;};defer _d .Close ();return Load (_d );};func (_fbc *fdfParser )parseNull ()(_cec .PdfObjectNull ,error ){_ ,_efg :=_fbc ._ddg .Discard (4);return _cec .PdfObjectNull {},_efg ;};func (_cff *fdfParser )trace (_fcd _cec .PdfObject )_cec .PdfObject {switch _beg :=_fcd .(type ){case *_cec .PdfObjectReference :_efgd ,_cbba :=_cff ._aea [_beg .ObjectNumber ].(*_cec .PdfIndirectObject );if _cbba {return _efgd .PdfObject ;};_acg .Log .Debug ("\u0054\u0079\u0070\u0065\u0020\u0065\u0072\u0072\u006f\u0072");return nil ;case *_cec .PdfIndirectObject :return _beg .PdfObject ;};return _fcd ;};func (_fbd *fdfParser )parseBool ()(_cec .PdfObjectBool ,error ){_cfa ,_bded :=_fbd ._ddg .Peek (4);if _bded !=nil {return _cec .PdfObjectBool (false ),_bded ;};if (len (_cfa )>=4)&&(string (_cfa [:4])=="\u0074\u0072\u0075\u0065"){_fbd ._ddg .Discard (4);return _cec .PdfObjectBool (true ),nil ;};_cfa ,_bded =_fbd ._ddg .Peek (5);if _bded !=nil {return _cec .PdfObjectBool (false ),_bded ;};if (len (_cfa )>=5)&&(string (_cfa [:5])=="\u0066\u0061\u006cs\u0065"){_fbd ._ddg .Discard (5);return _cec .PdfObjectBool (false ),nil ;};return _cec .PdfObjectBool (false ),_g .New ("\u0075n\u0065\u0078\u0070\u0065c\u0074\u0065\u0064\u0020\u0062o\u006fl\u0065a\u006e\u0020\u0073\u0074\u0072\u0069\u006eg");};
2020-08-27 21:45:09 +00:00
2020-08-31 21:12:07 +00:00
// Root returns the Root of the FDF document.
func (_fdc *fdfParser )Root ()(*_cec .PdfObjectDictionary ,error ){if _fdc ._fac !=nil {if _bddd ,_bbg :=_fdc .trace (_fdc ._fac .Get ("\u0052\u006f\u006f\u0074")).(*_cec .PdfObjectDictionary );_bbg {if _gcb ,_bafcc :=_fdc .trace (_bddd .Get ("\u0046\u0044\u0046")).(*_cec .PdfObjectDictionary );_bafcc {return _gcb ,nil ;};};};var _ebgf []int64 ;for _bgd :=range _fdc ._aea {_ebgf =append (_ebgf ,_bgd );};_be .Slice (_ebgf ,func (_gagc ,_abce int )bool {return _ebgf [_gagc ]< _ebgf [_abce ]});for _ ,_cfg :=range _ebgf {_agd :=_fdc ._aea [_cfg ];if _fca ,_agbc :=_fdc .trace (_agd ).(*_cec .PdfObjectDictionary );_agbc {if _bbb ,_ccfg :=_fdc .trace (_fca .Get ("\u0046\u0044\u0046")).(*_cec .PdfObjectDictionary );_ccfg {return _bbb ,nil ;};};};return nil ,_g .New ("\u0046\u0044\u0046\u0020\u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};func (_bac *fdfParser )parseObject ()(_cec .PdfObject ,error ){_acg .Log .Trace ("\u0052e\u0061d\u0020\u0064\u0069\u0072\u0065c\u0074\u0020o\u0062\u006a\u0065\u0063\u0074");_bac .skipSpaces ();for {_cfag ,_eda :=_bac ._ddg .Peek (2);if _eda !=nil {return nil ,_eda ;};_acg .Log .Trace ("\u0050e\u0065k\u0020\u0073\u0074\u0072\u0069\u006e\u0067\u003a\u0020\u0025\u0073",string (_cfag ));if _cfag [0]=='/'{_aba ,_fdb :=_bac .parseName ();_acg .Log .Trace ("\u002d\u003e\u004ea\u006d\u0065\u003a\u0020\u0027\u0025\u0073\u0027",_aba );return &_aba ,_fdb ;}else if _cfag [0]=='('{_acg .Log .Trace ("\u002d>\u0053\u0074\u0072\u0069\u006e\u0067!");return _bac .parseString ();}else if _cfag [0]=='['{_acg .Log .Trace ("\u002d\u003e\u0041\u0072\u0072\u0061\u0079\u0021");return _bac .parseArray ();}else if (_cfag [0]=='<')&&(_cfag [1]=='<'){_acg .Log .Trace ("\u002d>\u0044\u0069\u0063\u0074\u0021");return _bac .parseDict ();}else if _cfag [0]=='<'{_acg .Log .Trace ("\u002d\u003e\u0048\u0065\u0078\u0020\u0073\u0074\u0072\u0069\u006e\u0067\u0021");return _bac .parseHexString ();}else if _cfag [0]=='%'{_bac .readComment ();_bac .skipSpaces ();}else {_acg .Log .Trace ("\u002d\u003eN\u0075\u006d\u0062e\u0072\u0020\u006f\u0072\u0020\u0072\u0065\u0066\u003f");_cfag ,_ =_bac ._ddg .Peek (15);_efea :=string (_cfag );_acg .Log .Trace ("\u0050\u0065\u0065k\u0020\u0073\u0074\u0072\u003a\u0020\u0025\u0073",_efea );if (len (_efea )> 3)&&(_efea [:4]=="\u006e\u0075\u006c\u006c"){_aff ,_ddga :=_bac .parseNull ();return &_aff ,_ddga ;}else if (len (_efea )> 4)&&(_efea [:5]=="\u0066\u0061\u006cs\u0065"){_dg ,_bgc :=_bac .parseBool ();return &_dg ,_bgc ;}else if (len (_efea )> 3)&&(_efea [:4]=="\u0074\u0072\u0075\u0065"){_fec ,_bbc :=_bac .parseBool ();return &_fec ,_bbc ;};_bge :=_cbb .FindStringSubmatch (string (_efea ));if len (_bge )> 1{_cfag ,_ =_bac ._ddg .ReadBytes ('R');_acg .Log .Trace ("\u002d\u003e\u0020\u0021\u0052\u0065\u0066\u003a\u0020\u0027\u0025\u0073\u0027",string (_cfag [:]));_bbcf ,_bc :=_cea (string (_cfag ));return &_bbcf ,_bc ;};_fbe :=_eecb .FindStringSubmatch (string (_efea ));if len (_fbe )> 1{_acg .Log .Trace ("\u002d\u003e\u0020\u004e\u0075\u006d\u0062\u0065\u0072\u0021");return _bac .parseNumber ();};_fbe =_ade .FindStringSubmatch (string (_efea ));if len (_fbe )> 1{_acg .Log .Trace ("\u002d\u003e\u0020\u0045xp\u006f\u006e\u0065\u006e\u0074\u0069\u0061\u006c\u0020\u004e\u0075\u006d\u0062\u0065r\u0021");_acg .Log .Trace ("\u0025\u0020\u0073",_fbe );return _bac .parseNumber ();};_acg .Log .Debug ("\u0045R\u0052\u004f\u0052\u0020U\u006e\u006b\u006e\u006f\u0077n\u0020(\u0070e\u0065\u006b\u0020\u0022\u0025\u0073\u0022)",_efea );return nil ,_g .New ("\u006f\u0062\u006a\u0065\u0063t\u0020\u0070\u0061\u0072\u0073\u0069\u006e\u0067\u0020\u0065\u0072\u0072\u006fr\u0020\u002d\u0020\u0075\u006e\u0065\u0078\u0070\u0065\u0063\u0074\u0065\u0064\u0020\u0070\u0061\u0074\u0074\u0065\u0072\u006e");};};};func _ceff (_aae string )(*fdfParser ,error ){_eecd :=fdfParser {};_ffb :=[]byte (_aae );_ebg :=_fe .NewReader (_ffb );_eecd ._cbd =_ebg ;_eecd ._aea =map[int64 ]_cec .PdfObject {};_abc :=_fa .NewReader (_ebg );_eecd ._ddg =_abc ;_eecd ._bfb =int64 (len (_aae ));return &_eecd ,_eecd .parse ();};func (_baca *fdfPa
// Data represents forms data format (FDF) file data.
type Data struct{_fee *_cec .PdfObjectDictionary ;_ea *_cec .PdfObjectArray ;};