2016-07-08 45 views
4

我已经使用iTextSharp库在PDF中创建了EditTextField。我可以设置FieldNameEditTextField。我也想为它设置DataFormat。我将获得仅包含FieldName和Value的XML文件。所以,当将值合并到PDF模板时,我想检查DataFormat并根据那个我想要转换值和设置。如何获取和设置pdf中所有字段的字段格式

我已经添加了一个EditTextField。我可以为文本字段添加名称。我想将格式(如DateTime格式)添加到TextField。因此,下次我能够从PDF中获取所有文本字段并检查格式并根据格式,我可以通过编程将数据设置为它。

enter image description here

TextField _DOBtext = new TextField(pdfStamper.Writer, 
    new Rectangle(40, 670, 110, 650), "patient-dob"); 
_DOBtext.SetFormat("DateFormat", "mm/dd/yyyy"); // we want to set format like this. 
pdfStamper.AddAnnotation(_DOBtext.GetTextField(), 1); 
pdfStamper.Close(); 

而且在处理相同的PDF填充数据,我们将首先检查AcrofieldName和逻辑写入以下(它不工作代码)

var GetField = pdfStamper.Acrofields.Field.where(u=>u.Key == "patient-dob").FirstOrDefault(); 
var Format = GetField.GetFormat(); // we want like this feature 
if (Format != null) { 
    if (Format.Type = "DateTime") { 
     value=string.Format(data, Format.FormatString)); 
     stamper.AcroFields.SetField(fieldId, value); //fieldId = "patient-dob" 
    } 
} 

请帮我设置并获得DATAFORMAT

(ediit:添加iTextSharp的标签)

回答

1

有时前,我写了一个库来管理PDF AcroForm fillup ..此示例代码从我的填充功能:

private string fill_form(string output_file) 
    { 
     using (PdfReader _pdfReader = new PdfReader(FormPath)) 
     { 
      using (PdfStamper _pdfStamper = new PdfStamper(_pdfReader, new FileStream(output_file, FileMode.Create))) 
      { 
       _pdfStamper.AcroFields.GenerateAppearances = true; 

       foreach (var _field in _pdfStamper.AcroFields.Fields) 
        foreach (TemplateField _spField in _lstFields) 
        { 
         if (_field.Key.Equals(_spField.Name)) 
         { 
          switch (_spField.Type) 
          { 
           case TemplateFieldType.Text: 
            _pdfStamper.AcroFields.SetField(_field.Key, _spField.Value); 
            break; 

           case TemplateFieldType.Checkbox: 
            //TODO: check Value field cannot be set != OnValue, Offvalue 
            if (_spField.Value == _spField.OnValue) 
             _pdfStamper.AcroFields.SetField(_field.Key, _spField.OnValue); 
            else 
             _pdfStamper.AcroFields.SetField(_field.Key, _spField.OffValue); 
            break; 
          } 
         } 
        } 

       _pdfStamper.FormFlattening = true; 
      } 
     } 

     return output_file; 
    } 

正如你可以在内环我做类似于您需要的东西看。 希望这有助于。

+0

类型将仅为** TemplateFieldType.Text **。 但是文本内容可能是Date(mm/dd/yyyy或mm/dd/yyyy hh:mm),PhoneNumber [(xxx)-xxxx-xxxx],子串(起始位置,长度)等。 因此, * FormPath ** PDF模板,我们还需要提供数据类型(DataFormat)信息。 '_pdfStamper.AcroFields.Fields.DataFormat( “串”,StartPos,EndPos)' 和虽然填充OUTPUTFILE,我必须能够根据该格式设置数据 '_pdfStamper.AcroFields.SetField(_field.Key,_spField .Value,Format.Type);' –

+0

我得到了这个......它已经很清楚了..但是因为你没有描述你从你的代码中得到了哪个错误(你称之为*非工作*),我不能建议你什么都没有比工作代码更具体,以允许您访问给定字段。 – weirdgyn

+0

您发送的步骤工作正常。但它只设置数据。所以这个代码没有问题。但是,如果一些PDF文件存在,并且一个PDF希望** DateTime **为“dd/mm/yyyy”格式并且另一个PDF希望“mm/dd/yyyy hh:mm”,那么我们无法对DateFormat值进行硬编码。所以我想要的是:我也想在创建** TextField **时提供格式信息。我试图添加格式。但是没有选择添加它。所以张贴在这里希望我可以得到解决方案。例如:** key = patient-dob **和** value = 07/08/2016 03:33:22 **在pdf中,我必须以“dd/mm/yyyy”格式显示,例如** 07/08/2016 ** –

3

iText不支持类似SetFormat()GetFormat()的原因是因为PDF格式不支持它

但是,您可能会注意到Adobe Acrobat允许您指定字段格式。他们这样做的方式是通过他们的所有产品附带的JavaScript文件。如果其他PDF渲染器(如Chrome,Firefox或IE)支持,我不知道。这个JS文件有一堆内置函数,它们可以用于客户端验证,其中一个函数是AFDate_FormatEx()。你可以看到,在一个PDF在这个截图列举了:

enter image description here

您可能已经注意到上面我强调客户端验证。这是因为这是JS在规范中是可选的,并且在以编程方式与表单进行交互时不是必需的。但是,如果您试图模仿Adobe的产品,您可能想要走这条路。您可以通过像编程方式检索这些设置:

var aditionalActions = reader.AcroFields.Fields["patient-dob"].GetWidget(0).GetAsDict(PdfName.AA); 

并且你可以通过你的PdfFormFieldSetAdditionalActions()设置。

这可能是一个非常脆弱的路径,但它可能适合你。

但是,对我来说我会尝试一些不同的东西,只是劫持另一个领域,我知道我不打算使用。通过规范看,我想我只是选择一些像/TM这只是一个字符串用于导出数据(我认为通过FDF或HTTP POST)字段的名称。

var _DOBtext = new TextField(writer, new iTextSharp.text.Rectangle(0, 0, 110, 650), "patient-dob"); 
var tf = _DOBtext.GetTextField(); 
tf.MappingName = "patient-dob:date:mm/dd/yyyy"; 

,并检索它:

var mappingName = reader.AcroFields.Fields["patient-dob"].GetWidget(0).GetAsString(PdfName.TM); 

你能拿出你想要的任何格式此项,只要是有意义的你。我建议保留该字段的原始名称作为其中的一部分,然后选择适用于您的任何分隔符。无论渲染应用程序如何,该值都应该安全地使用PDF传输。

enter image description here

+0

感谢您的好解释。我正在尝试将您的逻辑添加到我的代码中,并在解决问题后发布状态。 –

+0

生成这些屏幕截图的文件分析工具的名称是什么? –

0

这为我工作(使用iText7)

textBox.SetAdditionalAction(PdfName.F, iText.Kernel.Pdf.Action.PdfAction.CreateJavaScript("AFDate_FormatEx(\"yyyy-mm-dd\");")); 
textBox.SetAdditionalAction(PdfName.K, iText.Kernel.Pdf.Action.PdfAction.CreateJavaScript("AFDate_KeystrokeEx(\"yyyy-mm-dd\");")); 

感谢iText的RUPS工具。

相关问题