我正在尝试将 PDF 版本 1.3 转换为 PDF 版本 1.5 或更高版本。这里的挑战是:我不想像几乎所有论坛一样只更改标题版本。我想更改所有文件版本。
我阅读了这个主题:从 servlet 将 PDF 转换为旧版本?,但首先是 iTextPdf 7 的新版本,不支持 PdfStamper 所以我只是跳过它。
我想我需要创建一个 TMP 文件,将 PDF 写入 TMP,用 TMP 替换原始文件并删除 TMP。但是我怎么能在JAVA中做到这一点?
此代码仅转换 HEADER 版本!我使用 Itext 版本 7。
WriterProperties wp = new WriterProperties();
wp.setPdfVersion(PdfVersion.PDF_1_7);
PdfDocument pdfDoc = new PdfDocument(new PdfReader("source"), new PdfWriter("destination", wp));
pdfDoc.close();
有什么建议?
图片来自 Firefox (PDF v 1.3)图片:无可用文本
在这里你可以下载pdf样本:https : //wetransfer.com/downloads/ce2d2f41ac29c36baa2ac895ebc0473c20210922065257/5889b2
无需将 PDF 1.3 版转换为 PDF 1.5 版或更高版本,因为 PDF 旨在向后兼容。因此,每个 PDF 1.3 文档也已经是 PDF 1.4 文档。和一个 PDF 1.5 文档。和一个 PDF 1.6 文档。...
在评论中,您解释了为什么要更改版本:
但是如果你想在 Firefox 中打开 PDF 1.3,你无法打开它!所以我们有一些客户使用 Firefox 来打开 PDF 格式。Firefox 仅支持 1.5 及以上
鉴于上面讨论的兼容性,这是没有意义的。但有时程序会以一种荒谬的方式运行。因此,我对此进行了测试。
结果:我在这里安装的Firefox 87.0可以接受我在文档中找到的PDF 1.3 和 PDF 1.4文件,没有任何问题!
不幸的是,我这里没有任何 PDF 1.2(或更早版本)文件,因此我无法检查对此类文件的支持。
因此,恐怕您必须回去分析客户的问题,这不是“Firefox 仅支持 1.5 及更高版本”那么简单。
(一些想法:也许您的 PDF 1.3 文件实际上已损坏,因此 Firefox 无法打开它们;它们可能在您这边已经损坏,或者可能在传输到您的客户时损坏。或者您的客户可能有一些较旧的 Firefox 版本在其 PDF 查看器中存在一些错误。)
在此处的评论中,OP 提供了示例文件。对它们进行分析后发现,实际问题是 Firefox 无法正确确定嵌入字体的内置编码。
为了在这方面帮助 Firefox,我们可以提供一个明确的基本编码,因此 Firefox 不需要内置编码。
当您在问题中使用 iText 7 时,这里有一个使用您的示例 PDF 的概念验证:
try ( PdfReader pdfReader = new PdfReader("1100-SD-9000455596.pdf");
PdfWriter pdfWriter = new PdfWriter("1100-SD-9000455596-Fixed.pdf");
PdfDocument pdfDocument = new PdfDocument(pdfReader, pdfWriter) ) {
for (int page = 1; page <= pdfDocument.getNumberOfPages(); page++) {
PdfPage pdfPage = pdfDocument.getPage(page);
PdfResources pdfResources = pdfPage.getResources();
for (Entry<PdfName, PdfObject> fontEntry : pdfResources.getResource(PdfName.Font).entrySet()) {
PdfObject fontObject = fontEntry.getValue();
if (fontObject != null && fontObject.getType() == PdfObject.INDIRECT_REFERENCE) {
fontObject = ((PdfIndirectReference)fontObject).getRefersTo(true);
}
if (fontObject instanceof PdfDictionary) {
PdfDictionary fontDictionary = (PdfDictionary) fontObject;
PdfDictionary encodingDictionary = fontDictionary.getAsDictionary(PdfName.Encoding);
if (encodingDictionary != null) {
if (encodingDictionary.getAsName(PdfName.BaseEncoding) == null &&
encodingDictionary.getAsArray(PdfName.Differences) != null) {
encodingDictionary.put(PdfName.BaseEncoding, PdfName.WinAnsiEncoding);
}
}
}
}
}
}
(FixForFirefox测试testFix1100_SD_9000455596
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句