首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用java转换PDF文件版本(不仅仅是头文件版本!)

用java转换PDF文件版本(不仅仅是头文件版本!)
EN

Stack Overflow用户
提问于 2021-09-21 08:00:17
回答 1查看 473关注 0票数 0

我试图将PDF版本1.3转换为PDF版本1.5或更高版本。这里的挑战是:我不想只改变标题版本,就像几乎所有论坛写的一样。我想更改所有的文件版本。

我读过这个主题:将PDF从servlet转换为旧版本?,但首先是iTextPdf 7的新版本,不支持PdfStamper,所以我跳过它。

我认为我需要创建一个TMP文件,将PDF写入TMP,用TMP替换原件并删除TMP。但是我如何在JAVA中做到这一点呢?

此代码只转换标头版本!我使用Itext版本7。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的概念证明:

代码语言:javascript
复制
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__)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69265360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档