过滤掉 PDF 中除交互式表单字段之外的任何内容

Filter out anything but interactive form fields in PDF's

我正在寻找一种方法来过滤除 PDF 文件中交互式表单域之外的所有对象。 编程语言不是太重要,但如果我能从 Linux 命令行完成它会很高兴,但我对任何事情都非常开放。 例如。选择一个 pdf 输入文件,并输出一个新的 pdf 文件,其中只有第一个交互式表单字段。

最终目标是能够采用已打印但未填写的表单,并仅将已填写的表单字段的内容打印到上面。

我最接近的是使用 ghostscript:

gs -o outfile.pdf -sDEVICE=pdfwrite -dFILTERTEXT -dFILTERIMAGE infile.pdf

但在我的情况下仍然留下很多线条,尽管 -dFILTERIMAGE 也留下了图像。 还有一个 -dFILTERVECTOR 选项,但遗憾的是它也删除了表单域。

I'm looking for a way to filter out all objects apart from interactive form fields in PDF files.

首先,您必须摆脱静态页面内容。使用任意通用 pdf 库,您可以通过清除每一页的内容条目来实现。

例如使用 iText7 的 Java 版本可以按如下方式完成:

try (
    PdfReader pdfReader = new PdfReader(SOURCE);
    PdfWriter pdfWriter = new PdfWriter(RESULT);
    PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter)
) {
    for (int pageNr = 1; pageNr <= pdfDocument.getNumberOfPages(); pageNr++) {
        PdfPage pdfPage = pdfDocument.getPage(pageNr);
        pdfPage.getPdfObject().remove(PdfName.Contents);
        pdfPage.getPdfObject().setModified();
    }
}

(RemoveContent 测试 testRemoveAllPageContentStreams)