如何获取和设置pdf

时间:2016-07-08 08:41:58

标签: c# itext

我使用iTextSharp库在PDF中创建了 EditTextField 。我可以将 FieldName 设置为 EditTextField 。我还想将 DataFormat 设置为它。我将获得仅包含FieldName和Value的XML文件。因此,在将值与PDF模板合并时,我想检查 DataFormat ,并根据我要转换值并设置。

我添加了一个EditTextField。我可以在textfield中添加名称。我想将格式(如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标签)

3 个答案:

答案 0 :(得分:3)

iText不支持Install-WindowsFeature Desktop-Experience SetFormat()之类的原因是因为 PDF格式不支持

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

enter image description here

您可能已经注意到我在客户端验证上的重点。这是因为这是JS,它在规范中是可选的,并且在以编程方式与表单交互时不需要它。但是,如果您试图模仿Adobe的产品,您可能希望沿着这条路走下去。您可以通过以下方式以编程方式检索这些设置:

AFDate_FormatEx()

您可以通过var aditionalActions = reader.AcroFields.Fields["patient-dob"].GetWidget(0).GetAsDict(PdfName.AA); 上的SetAdditionalActions()来设置它。

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

然而,对我来说,我尝试了不同的东西,只是劫持了另一个我知道我不会使用的领域。查看规范我认为我只选择PdfFormField之类的东西,这只是导出数据时用于字段名称的字符串(我想通过FDF或HTTP POST)。

/TM

并检索它:

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";

只要对您有意义,您就可以为此条目提供您想要的任何格式。我建议保留字段的原始名称作为其中的一部分,然后选择适合您的分隔符。无论渲染应用程序如何,该值都应安全地与PDF一起传播。

enter image description here

答案 1 :(得分:1)

前段时间我写了一个库来管理PDF AcroForm填充...这是我填充函数的示例代码:

    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;
    }

正如你在内循环中看到的,我做了类似于你需要的事情。 希望这会有所帮助。

答案 2 :(得分: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工具。