PDF识别之XFA文件格式

该文章提供了一个Java代码示例,用于读取XFA(XMLFormArchitecture)格式的PDF文件,并将其内容提取为XML文件。利用iTextPDF库,代码首先打开PDF文档,获取AcroForm和XFA数据,然后遍历并转换datasets中的data节点到XML格式,最后输出到文件。
摘要由CSDN通过智能技术生成

有些PDF文件是XFA文件格式,都是XML样式,这种PDF文件需要使用XFA读取方式,下面是JAVA实现方式

package com.xxx.xxx.util.pdf;

import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.xfa.XfaForm;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;

import java.io.File;
import java.io.FileOutputStream;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
 * 读取XFA PDF文件,结果是XML文件
 * @author xxx
 *
 */
public class ReadXFAUtil {

	/**
     * 读取xfa pdf
     * @param str 
     * @throws Exception 
     */
    public static void manipulatePdf(String src,String dest) throws Exception {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(src));
        PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
        XfaForm xfa = form.getXfaForm();

        // Get XFA data under datasets/data.
        Node node = xfa.getDatasetsNode();
        NodeList list = node.getChildNodes();
        for (int i = 0; i < list.getLength(); i++) {
            if ("data".equals(list.item(i).getLocalName())) {
                node = list.item(i);
                break;
            }
        }

        try (FileOutputStream os = new FileOutputStream(dest)) {
            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.transform(new DOMSource(node), new StreamResult(os));
        }

        pdfDoc.close();
    }
    
    public static void main(String[] args) throws Exception {
        String src = "e:/4000-2021-6增值税申报表.pdf";
        String dest = "e:/1.xml";

        ReadXFAUtil.manipulatePdf(src,dest);
    }
}

如有问题,请私信。

xObP8s/gudi/zrPMoaJKU7K5u7e+s7/Os8yhokpBVkHP4LnYv86zzMjn0OjSqtKyv8nS1MGqz7VRUaGjDQoNCtf31d8gUVEgNDA0NTQwMjI5

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liberty888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值