如何获取和设置pdf中所有字段的字段格式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取和设置pdf中所有字段的字段格式相关的知识,希望对你有一定的参考价值。
我使用iTextSharp库在PDF中创建了EditTextField。我可以将FieldName设置为EditTextField。我还想将DataFormat设置为它。我将获得仅包含FieldName和Value的XML文件。因此,在将Value合并到PDF模板时,我想检查DataFormat,并根据我要转换值和设置。
我添加了一个EditTextField。我可以在textfield中添加名称。我想将格式(如DateTime格式)添加到TextField。因此,下次我能够从PDF获取所有文本字段并检查格式并根据格式,我能够以编程方式将数据设置为它。
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
(编辑:添加iTextSharp标签)
iText不支持像SetFormat()
和GetFormat()
之类的原因是因为PDF格式不支持它。
但是,您可能会注意到Adobe Acrobat允许您指定字段格式。他们这样做的方式是通过他们所有产品附带的javascript文件。如果其他PDF渲染器(如Chrome,Firefox或IE)支持这一点,我不知道。这个JS文件有一堆内置函数可以用于客户端验证,其中一个函数是AFDate_FormatEx()
。您可以在此屏幕截图中看到PDF中的内容:
您可能已经注意到我在客户端验证上的重点。那是因为这是JS,它在规范中是可选的,并且在以编程方式与表单交互时不需要它。但是,如果您试图模仿Adobe的产品,您可能希望沿着这条路走下去。您可以通过以下方式以编程方式检索这些设置:
var aditionalActions = reader.AcroFields.Fields["patient-dob"].GetWidget(0).GetAsDict(PdfName.AA);
你可以通过你的SetAdditionalActions()
上的PdfFormField
之类的东西来设置它。
这可能是一条非常脆弱的路径,但它可能适合您。
然而,对我来说,我会尝试不同的东西,只是劫持另一个我知道我不会使用的领域。仔细查看规范,我想我会选择像/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一起传播。
前段时间我写了一个库来管理PDF AcroForm填充...这是我的fill函数的示例代码:
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;
}
正如你在内循环中看到的,我做了类似于你需求的事情。希望这可以帮助。
这对我有用(使用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工具。
以上是关于如何获取和设置pdf中所有字段的字段格式的主要内容,如果未能解决你的问题,请参考以下文章