在java中转换PDF文件版本(不仅是标题版本!)

布拉兹库斯

我正在尝试将 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将版本号添加到HTML文件(不仅是CSS和JS文件)

Boost系统1.69.0不仅是标题吗?

Gnuplot - Windows 终端并保存为 png/pdf ...(不仅是 .EMF)

使用ls别名仅列出隐藏文件(不仅是点文件)

使用浏览按钮从Shiny UI(不仅是目录)获取文件路径,而无需上传文件

重命名目录中的文件不仅是文件夹

如何在Java中测试类是否正确实现了Serializable(不仅是Serializable的实例)

R中转换(或变异)的并行版本?

ngModel,设置整个对象,不仅是ngOptios的值

突出显示整个UIButton,不仅是左侧的图像?

Laravel价格验证仅接受正数,而不仅是0

iPad方向在iOS中不仅是四个

每个月ssh卡住了(不仅是ssh)

不仅是多个集合的交集,而且并集和更新

DirectCast是否有任何窗口,不仅是主窗口?

在pdf java中转换布局

我可以从终端获得OSX的动物名称,而不仅仅是版本吗?

Outlook:检测多个帐户的传入电子邮件,如何摆脱搜索文件夹本身(不仅是旧的搜索虚拟文件夹)

可以在 VSTS 版本中转换 ELMAH 主题吗?

如何在 tensorflow 版本 2 中转换以下内容

Paket依赖组不仅仅是解决版本冲突的一种方法吗?

在ggplot2中明确设置面板尺寸(不仅是绘图尺寸)

您如何显示每周数据,不仅是本月,而是用户的全部数据

在Javascript中将对象作为参数传递-不仅是参数,还包括根据变量构建的参数

如何在R中一次创建数据帧(不仅是一个)

如何检测用户是否在 PHP 或 Jquery 中使用 Apple 设备 [不仅是 iOS]

质数函数返回所有数字,不仅是质数

Dafny要求字符串的前提不仅是空格

当城市名称等于某个国家的名称时(不仅是),CLGeocoder返回错误的结果