在Java中,我希望能够读取PDF文件,测试它是否符合PDF/A(PDF存档),如果不符合,则将文件转换为PDF/A。我可能更喜欢在ApachePDFBox中这样做,因为我已经在那个API中做了一些事情,但我也愿意接受其他API。
oaxa6hgo1#
测试一个PDF文件是否是PDF/A-1b可以通过PDFBox preflight来完成,参见示例here或使用preflight-app。创建一个工具将文件从PDF转换为PDF/A是一项艰巨的任务,可能需要几个月,甚至几年的时间。如果您查看PDFBox preflight的源代码,您会发现数百条错误消息。因此,您的工具必须能够修复这些错误中的每一个。其中一些是:
只需使用PDFBox preflight检查几个您自己的文件,您就会看到各种各样的问题。如果你没有几个月或几年的时间,请访问Callas Software GmbH或PDF Tools AG的主页购买这样的转换器。
Callas Software GmbH
PDF Tools AG
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); } }
2条答案
按热度按时间oaxa6hgo1#
测试一个PDF文件是否是PDF/A-1b可以通过PDFBox preflight来完成,参见示例here或使用preflight-app。
创建一个工具将文件从PDF转换为PDF/A是一项艰巨的任务,可能需要几个月,甚至几年的时间。如果您查看PDFBox preflight的源代码,您会发现数百条错误消息。因此,您的工具必须能够修复这些错误中的每一个。其中一些是:
只需使用PDFBox preflight检查几个您自己的文件,您就会看到各种各样的问题。
如果你没有几个月或几年的时间,请访问
Callas Software GmbH
或PDF Tools AG
的主页购买这样的转换器。yquaqz182#
我一直在研究一种将PDF转换为PDF/A的简单方法。最后,我将原始PDF的每一页转换为图像,然后只使用图像重新创建PDF。
这样我就不关心字体,表单或任何其他配置。