我试图将PDF版本1.3转换为PDF版本1.5或更高版本。这里的挑战是:我不想只改变标题版本,就像几乎所有论坛写的一样。我想更改所有的文件版本。
我读过这个主题:将PDF从servlet转换为旧版本?,但首先是iTextPdf 7的新版本,不支持PdfStamper,所以我跳过它。
我认为我需要创建一个TMP文件,将PDF写入TMP,用TMP替换原件并删除TMP。但是我如何在JAVA中做到这一点呢?
此代码只转换标头版本!我使用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();有什么建议吗?
火狐图片(PDF-1.3) 图片:没有文本
在这里您可以下载pdf示例:https://wetransfer.com/downloads/ce2d2f41ac29c36baa2ac895ebc0473c20210922065257/5889b2
发布于 2021-09-21 14:38:27
不需要将PDF版本1.3转换为PDF版本1.5或更高版本,因为PDF是向后兼容的。因此,每一份PDF 1.3文件也已经是一份PDF 1.4文件。和一份PDF 1.5文件。还有一份PDF 1.6文件。..。
在一条评论中,您解释了为什么要更改版本:
但是如果你想在Firefox中打开PDF1.3,你不能打开它!因此,我们有一些客户端使用firefox来打开PDF格式。Firefox只支持1.5及以上版本
鉴于上面讨论的兼容性,这是没有意义的。但有时程序会以一种荒谬的方式表现出来。因此,我测试了这个。
结果:我在这里安装的Firefox87.0接受PDF1.3和PDF1.4文件,我在文档中找到了这些文件,没有任何问题!
不幸的是,这里没有任何PDF1.2(或更早的)文件,所以我无法检查对这些文件的支持。
因此,恐怕您必须重新分析您的客户所面临的问题,它并不像"Firefox只支持1.5和更高版本“那样简单。
(一些想法:也许您的PDF1.3文件实际上是坏的,Firefox也因此而无法打开它们;它们可能已经在您这边被破坏了,或者在传输到您的客户端时被破坏了。)或者您的客户端有一些旧版本的Firefox,它的PDF查看器中有一些bug。)
实际问题的修正
在这里的注释中,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);
}
}
}
}
}
}(https://github.com/mkl-public/testarea-itext7/blob/master/src/test/java/mkl/testarea/itext7/font/FixForFirefox.java#L48 test testFix1100_SD_9000455596__)
https://stackoverflow.com/questions/69265360
复制相似问题