我需要在PDF中填充XFA表单字段(使用Adobe LiveCycle Designer创建).我们正在尝试使用iText(实际上是带有C#的iTextSharp)来解析PDF,填充XFA字段,然后将修改后的PDF保存回来.
我可以通过iText找到的所有示例(很少有iTextSharp示例)讨论修改AcroForm字段.此PDF没有AcroForm字段,仅使用XFA.
指向任何非标准资源的指针都会有所帮助(我已经完成了关于该主题的必要谷歌搜索并且没有找到任何有用的资源).
这里的代码示例对于任何实际完成我正在尝试的人来说都是非常棒的.
我有一个不包含XFA数据的PDF.我想要做的是,以编程方式创建一个XFA表单模板(不是使用Adobe LiveCycle或类似的程序),然后将其嵌入到PDF中,然后填写XFA表单.
这可能吗?或者我必须使用Adobe LiveCycle?
编辑
http://en.wikipedia.org/wiki/XFA#Profiles在此Wiki链接中说明如下:
XFAF(XFA前景)子集 - (在XFA 2.5中引入) - 一种表单,其中XFA表单的每个页面都覆盖PDF背景.它只能用于静态XFA表单.此体系结构仅使用XFA的子集.它可以打包在常规PDF文档中,也可以打包为带有嵌入式PDF的独立XDP文件.在XFAF中,每个XFA字段对应于PDF交互字段(AcroForm字段).
所以我相信,我的要求是可能的,但目前我不知道如何......
我用Adobe LiveCycle Designer创建了一个PDF表单.我现在正努力在PDF填写后以编程方式从PDF中提取数据.
我尝试使用poppler(qt4绑定,但我想这没关系),但显然poppler无法处理XFA表单.虽然evince和okular能够显示表单......
据我了解,PDF包含一个XDP,而XDP又包含XFA表单.我的问题是,如何从PDF中提取数据?
如果有库,c ++,java,python或PHP是我的选择.
我正在尝试获取我的XFA表单中所有字段的简单列表.我正在使用此代码:
private void ListFieldNames()
{
string pdfTemplate = @"C:\Projects\iTextSharp\SReport.pdf";
MemoryStream m = new MemoryStream();
// title the form
this.Text += " - " + pdfTemplate;
// create a new PDF reader based on the PDF template document
PdfReader pdfReader = new PdfReader(pdfTemplate);
PdfStamper pdfStamper = new PdfStamper(pdfReader, m);
AcroFields formFields = pdfStamper.AcroFields;
AcroFields form = pdfReader.AcroFields;
XfaForm xfa = form.Xfa;
StringBuilder sb = new StringBuilder();
sb.Append(xfa.XfaPresent ? "XFA form" : "AcroForm");
sb.Append(Environment.NewLine);
foreach (string key in form.Fields.Keys)
{
sb.Append(key);
sb.Append(Environment.NewLine); …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种将PDF XFA文件转换为普通PDF文件的方法,这些文件可以通过Imagemagick或ghostscript进行处理和/或压缩.我找到的所有选项只是删除了XFA标记,导致出现空文件.
一种方法是使用Adobe acrobat reader并通过虚拟打印机打印文件.但这不是服务器上可接受的选项.
IText也是不可选择的,因为它对于我们需要的东西太贵了.有人有想法或有更好的方法吗?
我在livecycle es 2中创建了一个表单,我正在尝试使用pdftk来填写表单,但它不起作用.它说它成功地填写了它但是当我尝试打开pdf它只是给我一个错误说"如果这个消息最终没有被文档的正确内容替换,你的PDF查看器可能无法显示这种类型的文献."
以下是我用来填写pdf的代码
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$Clicks = "567";
$Impressions = "43,434";
$Cost = "$45.44";
$fdf = '%FDF-1.2
1 0 obj<</FDF<< /Fields[
<</T(Clicks)/V('.$Clicks.')>>
<</T(Impressions)/V('.$Impressions.')>>
<</T(Cost)/V('.$Cost.')>>
] >> >>
endobj
trailer
<</Root 1 0 R>>
%%EOF';
file_put_contents('fields.fdf', $fdf);
$results = shell_exec("pdftk REPORT.pdf fill_form fields.fdf output FINAL_REPORT.pdf flatten");
Run Code Online (Sandbox Code Playgroud)
在做了一些研究之后,我发现在实时循环中创建的pdf表单是作为XFA表单而不是acroforms创建的.不确定区别是什么,但是有没有人做过类似的事情并且能够让它发挥作用.
谢谢
使用Adobe软件保存XFA表单(XFA = XML Forms Architecture)时,会向表单元素添加校验和属性.这个校验和似乎是一个SHA-1摘要,但目前还不清楚实际输入到哈希的内容.有没有人知道如何生成这个?Adobe Acrobat需要此值来验证表单的XML数据中实际存在的内容,但是当我创建正在输入表单的XML哈希时,Adobe Acrobat不接受它.这个校验和属性没有记录在XFA规范中,所以我真的很感激,如果有人可以:
码:
using (FileStream pdf = new FileStream("C:/test.pdf", FileMode.Open))
using (FileStream xml = new FileStream("C:/test.xml", FileMode.Open))
using (FileStream filledPdf = new FileStream("C:/test_f.pdf", FileMode.Create))
{
PdfReader.unethicalreading = true;
PdfReader pdfReader = new PdfReader(pdf);
PdfStamper stamper = new PdfStamper(pdfReader, filledPdf);
stamper.AcroFields.Xfa.FillXfaForm(xml);
stamper.Close();
pdfReader.Close();
}
Run Code Online (Sandbox Code Playgroud)
这段代码没有任何异常,一切似乎都没问题,但如果我打开填充的pdf,Adobe Reader会说出类似的话:
本文档启用了扩展功能.此文档自创建以来已更改,并且无法再使用扩展功能.
某些字段已正确填充,但我无法对其进行编辑.有些字段是空的.如果我通过单击Adobe Reader中的"导入数据"手动选择xml,表单填写正确,所以我猜xml中没有错误.
我假设我需要展平XFA表单,以便在使用Nuance的CSDK的应用程序的UI上正确显示.当我现在处理它时,我收到一条通用消息"请等待......如果此消息最终没有被替换......".
寻找一些示例iTextSharp代码来做到这一点.
我想自动填写双 AcroForm/XFA PDF 表单。我包含了一个 XFA 数据包,所有值都显示在 Adobe Reader 中。我将V=AcroForms 条目中的键设置为新值,所有值都显示为替代 PDF 阅读器。
但是,当我V=在 Adobe Reader 中使用 XFA 和 AcroForm条目打开 PDF 时,只有当前选择的文本字段的值可见:
当 AcroForms 和 XFA 存在时,我在PDF 规范中找不到任何要设置的特殊标志的提及。我假设XFA和Field键的顺序可能很重要,但事实并非如此。
如何更改我的 PDF 文件,以便在启动时在 Adobe Reader 中以及仅支持 AcroForms 而不是 XFA 的 PDF 阅读器中可以看到这些值?
我能够使用pdfbox获取大多数pdf文件的字段名称,但我无法获取字段所得税.它是以某种形式受限制的吗?
虽然它在表单中包含多个字段,但它只显示一个字段.
这是输出:
topmostSubform [0].
我的代码:
PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();
List fields = acroForm.getFields();
@SuppressWarnings("rawtypes")
java.util.Iterator fieldsIter = fields.iterator();
System.out.println(new Integer(fields.size()).toString());
while( fieldsIter.hasNext())
{
PDField field = (PDField)fieldsIter.next();
System.out.println(field.getFullyQualifiedName());
System.out.println(field.getPartialName());
}
Run Code Online (Sandbox Code Playgroud)
用于
public static void main(String[] args) throws IOException {
PDDocument pdDoc = null;
try {
pdDoc = PDDocument.load("income.pdf");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Ggdfgdgdgf feilds = new Ggdfgdgdgf();
feilds.printFields(pdDoc);
}
Run Code Online (Sandbox Code Playgroud)