Pdf.js: 加载使用系统字体的 PDF 时出错

创建于 2014-02-04  ·  27评论  ·  资料来源: mozilla/pdf.js

测试文件: https ://dl.dropboxusercontent.com/u/16283445/PORTRAIT.pdf

文件由 Muhimbi PDF 转换器生成。

正文(使用嵌入的 Tahoma 字体)呈现正常; 导致错误的是文件顶部的试用消息。 经过一些调试,我发现此消息引用了系统 Helvetica 字体,并且在出错时不知何故缺少它的字形。

错误日志:

Error: Requesting object that isn't resolved yet Helvetica_path_T pdf.js:205
    at error (http://[skipped]/pdfjs/pdf.js:207:15)
    at Object.PDFObjects_get [as get] (http://[skipped]/pdfjs/pdf.js:4640:9)
    at Object.FontFace.getPathGenerator (http://[skipped]/pdfjs/pdf.js:7675:23)
    at Object.CanvasGraphics.paintChar (http://[skipped]/pdfjs/pdf.js:6105:26)
    at Object.CanvasGraphics_showText [as showText] (http://[skipped]/pdfjs/pdf.js:6291:18)
    at Object.CanvasGraphics_nextLineShowText [as nextLineShowText] (http://[skipped]/pdfjs/pdf.js:6381:12)
    at Object.CanvasGraphics_executeOperatorList [as executeOperatorList] (http://[skipped]/pdfjs/pdf.js:5600:22)
    at Object.InternalRenderTask__next [as _next] (http://[skipped]/pdfjs/pdf.js:4807:39)
    at Object.pdfViewcContinueCallback [as continueCallback] (http://[skipped]/pdfjs/viewer.js:4261:9)
3-pdf-broken 4-font-conversion

最有用的评论

使用pdfjs-dist": "^2.2.2 set disableFontFace: false解决了我这个问题。

pdfjs.getDocument( { url: pdfUrl, disableFontFace: false, }

所有27条评论

这失败了,因为当我们尝试在font_loader.js#L313中获取字体时没有加载字体。
考虑到evaluator.js#L284 ,问题似乎是它根本没有真正加载,因为在这种情况下font.data是未定义的。 原因是所讨论的字体没有嵌入的字体文件,这意味着在 fonts.js 中我们在定义font.data之前返回。 请参阅fonts.js#L2256fonts.js#L2303
在实践中这对我们来说不是一个更大的问题的原因是它似乎只影响字体资源包含在例如XObject字典中的 PDF(如这个问题)。

不幸的是,我不知道如何解决这个问题,因为在当前代码中构建没有字体文件的font.data似乎很困难。 如果我们在 PDF.js 中嵌入标准字体,也许这会“免费”解决?

PS 我还注意到修复此问题将解决 http://bthorben.github.io/pdfRepo/#crashed 中列出的一个(或两个)文件。

是否有类似以下之一的解决方案:

1 - 允许使用某些默认字体或某些已用于精确文件的字体的选项
2 - 允许跳过渲染此项目的选项
如果缺少某些字体,这有助于继续使用 pdf 文件,并且仅作为警告输出,而不是作为中断错误输出。

你怎么认为?

我们更喜欢第一个选项,但是我们还没有嵌入任何字体,而是依靠系统来包含某些功能的字体。 我们当然可以忽略,一旦我们找到如何正确地存根它(对于这些字体,我们可以在请求时生成空字母轮廓)

至少打开 .catch(...) 这个错误的可能性,而不是停止一切,直到找到更好的解决方案。 不幸的是,这个问题破坏了我们生活环境中的功能,这很糟糕。

有没有可用的解决方法? 还是@xwcg建议的某种错误捕获机制?

在这里提交了一个欺骗: https ://bugzilla.mozilla.org/show_bug.cgi?id=1463728

大家好,
我得到了同样的错误。
我可以知道在正式修复之前是否有任何临时解决此问题的方法?

对此有任何更新吗?,它从 2014 年开始,仍未解决

@diego-lipinski-de-castro 仅供参考,如果您将 ignoreErrors: true 传递给 getDocument 函数,#9809 合并修复了这个问题。 如果你使用 npm pdfjs-dist 它还没有更新。 我刚刚从源代码和曾经抱怨字体的 PDF 构建,现在可以使用画布输出正确处理。 一切似乎都很好。

@sirisian感谢您的更新。 期待发布

@sirisian你知道 npm pdfjs-dist 什么时候更新吗? 如果有 npm 的解决方法?
谢谢

npm pdfjs-dist 的此修复版本的任何更新?

你好,我也遇到这个错误。 有没有办法用默认字体替换系统上不存在的字体?

@timvandermeij我们什么时候可以在 pdfjs-dist 中看到这个修复?

使用pdfjs-dist": "^2.2.2 set disableFontFace: false解决了我这个问题。

pdfjs.getDocument( { url: pdfUrl, disableFontFace: false, }

在我看来,每当 pdf.js 无法以特定字体加载文本时,它应该使用它_可以_显示的替代字体(例如,用户在字体首选项中设置的默认字体)加载相同的文本,而不是停止渲染页面并抛出错误。 这是 Firefox 61 和更早版本中禁用“允许页面选择自己的字体,而不是上面的选择”选项时的行为。 在我看来,以替代字体显示文本总比什么都不显示要好。

使用pdfjs-dist": "^2.2.2 set disableFontFace: false解决了我这个问题。

pdfjs.getDocument( { url: pdfUrl, disableFontFace: false, }

这个解决了我的问题,我正在使用 pdfjs-dist ^2.0.943
谢谢

我正在开发一个需要 IE 11 且安全设置(由 IT 团队管理)不允许下载自定义字体的项目。 这导致 PDF 渲染在渲染时大部分为空白,仅显示几个标题和斜体字符。

设置disableFontFace: true会导致 IE 11(实际上是所有其他浏览器)中的相反。 大多数字体然后呈现,但它引入了一系列错误,如下所示:

Warning: getPathGenerator - ignoring character: "Error: Requesting object that isn't resolved yet Times_path_i.".

这些错误都表示消息的Times_path_*部分中的不同字符。 文档加载了大部分内容,但标题、斜体和其他变体在视觉上缺失(尽管由于顶部的透明文本层可以选择空文本)

因此,我陷入了在除此托管版本的 IE 11 之外的所有浏览器中进行完整字体渲染(由于管理员强制执行有关字体的安全设置)或由于尝试对 IE 11 实施修复而在各处呈现半损坏字体之间的问题。

有什么建议?

有什么消息吗?

大家好,
我尝试了所有可能的事情,没有什么可以解决这个错误。
有更新吗?

这对我们来说是一个重大的影响。 为什么要设置 disableFontFace=false 的解决方法? 我的理解是,使用 disableFontFace=true,pdf 中有(或没有)什么嵌入字体都没有关系。 这是不正确的吗?

有什么消息吗?

6 年前@AllSeeingEye遇到了一个问题,而今天这个库有 594 个未解决的问题。 没有人给出关于这个错误或什么的 af *吗? 一个对我来说不可行的错误,可能需要寻找其他库,如 pdf-lib。

今天是个好日子!

在尝试使用disableFontFace参数解决文本层渲染问题时遇到了一些类似的问题。

disableFontFace: false上,一些文档如下所示:
image

虽然在disableFontFace: true上之前的文档渲染良好,但另一个文档存在问题:
image

所有这些单元格都不是空的。
有些文档以一种方式呈现良好,有些则以另一种方式呈现。
我该怎么做?

我遇到了与@Hatgor 类似的问题
为了解决这个问题,是否可以进行修复或修复? 上述解决方案不起作用。 :|

我有完全相同的问题。 尝试在运行 amazonlinux2 的 Node12 上的 lambda 中运行它——这意味着默认情况下没有安装字体。 如果我们可以将标准的 14 种字体默认嵌入到 pdfjs 中,或者公开一个 API 来加载它们,而不是依赖于将它们安装在基本系统中,那就太好了。 到目前为止,我将字体安装到系统的努力一直......不太成功。

在这一点上,我想我可能会使用另一个库(如 pdf-lib)对每个 PDF 进行预处理,以明确嵌入 14 种标准字体,然后将其传递给该库进行渲染。 有点过分和烦人,但如果它解决了问题......

在用 amazonlinux2 修改了几个小时来安装字体之后,我可以通过将 disableFontFace 显式设置为 false 来渲染未包含的字体,但是随后 PDF 中的嵌入字体会失败,并出现与@Hatgor评论中相同的符号。

好的,到目前为止,在预处理 PDF 以嵌入字体方面还没有骰子。 是否有一种方法可以注入未嵌入 PDF 中的字体? 我可以在其他地方托管必要的 .ttf(s),但我没有在 API 中看到任何用于加载任意字体的内容。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

patelsumit5192 picture patelsumit5192  ·  3评论

brandonros picture brandonros  ·  3评论

sujit-baniya picture sujit-baniya  ·  3评论

hp011235 picture hp011235  ·  4评论

azetutu picture azetutu  ·  4评论