我的目标是用iText填写交互式PDF xfa表单。一切正常,但不幸的是,某些字段有JavaScript操作,我无法通过fillXfaForm()方法填充它们。我的问题是:如何以编程方式(在Java中)实现它?有可能吗?
我可以通过启用JS的Adobe Reader导入工具手动完成。
请参阅PDF表格:http://www.finanse.mf.gov.pl/documents/766655/1481810/PIT-40(20)_v1-0E_2014.pdf
我的代码:
public class Pit40DocumentMerger {
public static final String PDF_FORM = "resources/pit40.pdf";
public static final String XML_SOURCE = "resources/xml_file.xml";
public static final String PDF_RESULT = "resources/result.pdf";
public static void main(String[] args) throws IOException, DocumentException, ParserConfigurationException, SAXException, TransformerFactoryConfigurationError, TransformerException {
Pit40DocumentMerger pit40 = new Pit40DocumentMerger();
pit40.fillPdfWithXmlData(PDF_FORM, XML_SOURCE, PDF_RESULT);
}
public void fillPdfWithXmlData(String src, String xml, String dest)
throws IOException, DocumentException {
PdfReader.unethicalreading = true;
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
AcroFields form = stamper.getAcroFields();
XfaForm xfa = form.getXfa();
xfa.fillXfaForm(new FileInputStream(xml));
stamper.close();
reader.close();
}
}
资源/xml_file.xml:
<?xml version="1.0" encoding="UTF-8"?>
<xfa:data xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
<Deklaracja xmlns="http://crd.gov.pl/wzor/2014/12/12/1921/" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2011/06/21/eD/DefinicjeTypy/">
<Naglowek>
<KodFormularza kodPodatku="PIT" kodSystemowy="PIT-40 (20)" rodzajZobowiazania="Z" wersjaSchemy="1-0E">PIT-40</KodFormularza>
<WariantFormularza>20</WariantFormularza>
<CelZlozenia poz="P_6">1</CelZlozenia>
<Rok>2014</Rok>
<KodUrzedu>0402</KodUrzedu>
</Naglowek>
<Podmiot1 rola="Płatnik">
<etd:OsobaNiefizyczna>
<etd:NIP>9999999999</etd:NIP>
<etd:PelnaNazwa>MyCompanyName</etd:PelnaNazwa>
<etd:REGON>23123123112312</etd:REGON>
</etd:OsobaNiefizyczna>
</Podmiot1>
<Podmiot2 rola="Podatnik">
<etd:OsobaFizyczna>
<etd:PESEL>99121308372</etd:PESEL>
<etd:ImiePierwsze>NAME</etd:ImiePierwsze>
<etd:Nazwisko>SURNAME</etd:Nazwisko>
<etd:DataUrodzenia>2015-03-12</etd:DataUrodzenia>
</etd:OsobaFizyczna>
<etd:AdresZamieszkania rodzajAdresu="RAD">
<etd:AdresPol>
<etd:KodKraju>PL</etd:KodKraju>
<etd:Wojewodztwo>WOJEWODZTWO</etd:Wojewodztwo>
<etd:Powiat>POWIAT</etd:Powiat>
<etd:Gmina>GMINA</etd:Gmina>
<etd:Ulica>ULICA</etd:Ulica>
<etd:NrDomu>3</etd:NrDomu>
<etd:NrLokalu>24</etd:NrLokalu>
<etd:Miejscowosc>MIEJSCOWOSC</etd:Miejscowosc>
<etd:KodPocztowy>55-555</etd:KodPocztowy>
<etd:Poczta>POCZTA</etd:Poczta>
</etd:AdresPol>
</etd:AdresZamieszkania>
</Podmiot2>
<PozycjeSzczegolowe>
<P_24>3</P_24>
<P_25>50000.00</P_25>
<P_27>50000.00</P_27>
<P_28>2000</P_28>
<P_31/>
<P_32/>
<P_33/>
<P_34/>
<P_35/>
<P_36/>
<P_37/>
<P_38/>
<P_39/>
<P_40/>
<P_42/>
<P_43/>
<P_44/>
<P_45/>
<P_46/>
<P_49/>
<P_51/>
<P_52/>
<P_53>50000.00</P_53>
<P_54>0.00</P_54>
<P_55>50000.00</P_55>
<P_56>2000</P_56>
<P_57/>
<P_60/>
<P_61/>
<P_62>50000</P_62>
<P_63>8443.98</P_63>
<P_65>8443.98</P_65>
<P_71>8444</P_71>
<P_72>6444</P_72>
</PozycjeSzczegolowe>
<Pouczenie>Za uchybienie obowiązkom płatnika grozi odpowiedzialność przewidziana w Kodeksie karnym skarbowym.</Pouczenie>
<Zalaczniki/>
</Deklaracja>
</xfa:data>
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
应更改为
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest), '\0', true);
如此信息所示。
代码: 这段代码没有异常,一切似乎都很好,但是如果我打开填充的pdf,Adobe Reader会说这样的话: 此文档启用了扩展功能。此文档自创建以来已更改,无法再使用扩展功能。 有些字段填写正确,但我无法编辑。某些字段为空。若我通过单击Adobe Reader中的“导入数据”手动选择xml,则表单填写正确,所以我猜xml中并没有错误。
我有一个基于XFA的pdf表单,我们需要使用java来填充它。你能建议最好的方法吗。我能够使用iText为pdf生成xfa xml。 我有从上面的代码生成的Pdf和Xfa XML。你能不能建议我如何继续下去,因为我似乎没有主意了。我试图检查XFA文档,但似乎不对。我没有xml,pdf非常复杂,因为它有许多字段,是一个动态XFA pdf表单。 您的帮助和建议将受到衷心的感谢。
考虑到字段名称结构可能发生了变化,我尝试像第一次那样阅读format/fields。(代码如下)。但是,现在它告诉我没有要读取的字段()。 所以,我开始做一些搜索,并找到了参考另一种类型的PDF结构,他们可以切换到;XFA.老实说,我还没有找到任何令人满意的文档/示例,但我确实找到了一些代码,看起来应该可以在XFA PDF的结构中阅读。(代码如下)。我尝试了两种不同的方法。第一个基本说明XfaFi
问题内容: 我有以下代码,出现错误“ PHP致命错误:常量表达式包含无效操作”。当我在构造函数中定义变量时,它可以正常工作。我正在使用Laravel框架。 我已经看到了这个问题:PHP错误:致命错误:常量表达式包含无效的操作,但是我的代码未将任何内容声明为静态,因此无法回答我的问题。 问题答案: 如上所述这里 类成员变量称为“属性”。您可能还会看到使用其他术语(例如“属性”或“字段”)来引用它们,
我需要将预填充的PDF/XFA表单设置为只读(因为在没有输入的情况下,例如文本、复选框、单选按钮等可以更改其值)。 对于常规AcroForms PDF和静态XFA表单,我可以通过在PdfStamper实例上调用setFormFlatting(true)来实现这一点。对于动态XFA表单,我必须将XDP的“字段”节点的“访问”属性设置为“只读”。 问题是,如何检测表单是否是动态XFA?不区分静态或动态
我在android和iText上遇到了一些问题,如果有人能帮忙的话。 android应用程序编写多个页面,每个页面包含不同的表。我没有允许一个表跨越一个页面,而是为每个页面添加一个表,并为下一个页面创建一个新表。这样我就可以控制页面总数、页眉和页脚。 我的问题是Android adobe pdf阅读器显示文档很好,正是我正在寻找的。但是,当我在PC上打开一个窗口以访问平板电脑上的 /mnt/sdc