首页 > 解决方案 > 缺少后代字体字典

问题描述

如果我在这里破坏了某些过程,请先道歉。

我知道有一个问题与完全相同的问题 PDFBox 返回丢失的后代字体字典但线程突然结束,因为作者无法提供详细信息,不幸的是。同样由于声誉低下,无法继续该线程。

它很好地说明了缺少复合字体的问题。我想知道是否有某种方法可以修复它,因为 PDF 在我们的浏览器中可以正常打开,但我们无法以编程方式处理它。

尝试了各种版本,包括最新的 2.0.21

我将分享PDF

期待你@mkl,@Tilman Hausherr

如果您需要更多详细信息,请告诉我。

我的代码试图将 PDF 转换为图像

       PDDocument document = PDDocument.load(new File(pdfPath+"//"+fileName));
       PDFRenderer pdfRenderer = new PDFRenderer(document);
       for (int page = 0; page < document.getNumberOfPages(); ++page) {
           BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
           }
  

标签: javapdfpdfbox

解决方案


在链接可用时下载文件后,我对其进行了分析。

Adobe Acrobat Reader 在打开文档时显示错误消息。iText RUPS 报告交叉引用问题。因此,第一印象是:该 PDF 已损坏。

尽管如此,我还是仔细看了看,但仔细观察的结果并没有更好……

根据交叉引用和预告片,PDF 应该包含 58 个 ID 为 1 到 58 的间接对象。但事实证明,尽管对象 32 到 49 大部分都被引用了,但其中一些是后代字体。这就解释了为什么 PDFBox 报告缺少后代字体。

此外,根据交叉引用表,对象 50 到 57 和 1 到 10 不在它们应该位于的位置。此外,根据线性化字典,第二个交叉引用表的位置错误,文件长度不正确。

这种被破坏的方式给人的印象是该文件是同一文件的两个略有不同版本的混合;好像尝试下载文件但在某些时候中断并从文件的新版本继续;或者好像某些 PDF 处理器以某种方式更改了文件并试图将更改后的副本保存到同一个文件中但被中断。

总结:PDF完全被破坏了。

如果 PDF 处理器试图修复它,您无法确定您将从哪个版本的文件中获得信息,不同的 PDF 处理器(如果它们能够以某种方式理解它)可能会以不同的方式解释文件。

如果可能,您应该拒绝该文件并请求它的完整版本。

如果不可能,请从似乎最适合修复它的查看器中复制数据,手动检查副本的准确性,然后检查整个提取的数据是否与您在相关帐户中拥有的其他信息的合理性有关。一点祈祷也不会受到伤害。


推荐阅读