PDFbox -如何在Java中测试和调整PDF以符合PDF/A标准

cwtwac6a  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(198)

在Java中,我希望能够读取PDF文件,测试它是否符合PDF/A(PDF存档),如果不符合,则将文件转换为PDF/A。
我可能更喜欢在ApachePDFBox中这样做,因为我已经在那个API中做了一些事情,但我也愿意接受其他API。

oaxa6hgo

oaxa6hgo1#

测试一个PDF文件是否是PDF/A-1b可以通过PDFBox preflight来完成,参见示例here或使用preflight-app。
创建一个工具将文件从PDF转换为PDF/A是一项艰巨的任务,可能需要几个月,甚至几年的时间。如果您查看PDFBox preflight的源代码,您会发现数百条错误消息。因此,您的工具必须能够修复这些错误中的每一个。其中一些是:

  • 非嵌入字体
  • 不带输出意图的颜色使用
  • 不正确的 meta数据
  • JBIG 2编码图像
  • LZW编码数据

只需使用PDFBox preflight检查几个您自己的文件,您就会看到各种各样的问题。
如果你没有几个月或几年的时间,请访问Callas Software GmbHPDF Tools AG的主页购买这样的转换器。

yquaqz18

yquaqz182#

我一直在研究一种将PDF转换为PDF/A的简单方法。最后,我将原始PDF的每一页转换为图像,然后只使用图像重新创建PDF。
这样我就不关心字体,表单或任何其他配置。

public void usingImages(File pdfFile) {
    try (PDDocument docIn = PDDocument.load(pdfFile))
    {   
        try(PDDocument docOut = new PDDocument()) {
            PDFRenderer pdfRenderer = new PDFRenderer(docIn);
            for (int pageIx = 0; pageIx < docIn.getNumberOfPages(); ++pageIx) { 
                //convert the input page to img
                BufferedImage bim = pdfRenderer.renderImageWithDPI(pageIx, 300, ImageType.RGB);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ImageIO.write(bim, "png", baos);
                byte[] toByteArray = baos.toByteArray();
                
                //Create new output page
                PDPage page = new PDPage();
                docOut.addPage(page);
                
                //Insert Image to new page
                PDImageXObject pdImage = PDImageXObject.createFromByteArray(docOut, toByteArray, "Pagina_"+String.valueOf(page));
                
                try (PDPageContentStream contentStream = new PDPageContentStream(docOut, page, PDPageContentStream.AppendMode.APPEND, true, true))
                {
                    // contentStream.drawImage(ximage, 20, 20 );
                    // better method inspired by http://stackoverflow.com/a/22318681/535646
                    // reduce this value if the image is too large
                    float width = page.getCropBox().getWidth();
                    float height = page.getCropBox().getHeight();
                    float scale = width / pdImage.getWidth();
                    if (scale > (height / pdImage.getHeight()))
                        scale = height / pdImage.getHeight();

                    contentStream.drawImage(pdImage, page.getCropBox().getLowerLeftX(), page.getCropBox().getLowerLeftY(), pdImage.getWidth() * scale, pdImage.getHeight() * scale);
                }
            }
            docOut.save(new File(pdfFile.getAbsolutePath() + ".PDFA.pdf"));
        }
    } catch (Exception ex) {
        Logger.getLogger(PDFtoPDFA.class.getName()).log(Level.SEVERE, null, ex);
    }
}

相关问题