在此处附加(推荐)或链接到 PDF 文件:
测试4.pdf
配置:
重现问题的步骤:
什么是预期行为? (添加截图)
没有错误。
什么地方出了错? (添加截图)
输出中的一条路径被分成两部分。
最初的“M”在一个节点中,后面的“L”在下一个节点中。
这些应该在同一个节点中。
链接到查看器(如果托管在 mozilla.github.io/pdf.js 或作为 Firefox/Chrome 扩展程序以外的站点上):
这可能与错误 #9167 有关。
我认为罪魁祸首在这里:
https://github.com/mozilla/pdf.js/blob/a045a00af34b764edda5991d2bcd18541ed60536/src/core/operator_list.js#L533 -L534
我不太熟悉OperatorList
的工作原理,但看起来操作符列表被分成大约 1000 个操作符的块。 有时,块边界位于 PDF 路径定义的中间。 这会产生两个OPS.constructPath
运算符,而后者不是以moveTo
开头。
这听起来有道理吗?
svg.js 应该被修复,而不是修改OperatorList
和它的常量CHUNK_SIZE
。 可能是这样的:如果没有中间路径绘制操作符,连续的OPS.constructPath
操作符应该组合成一个<svg:path>
节点......
我不太熟悉
OperatorList
的工作原理,但看起来操作符列表被分成大约 1000 个操作符的块。
正确的; 这是为了允许在整个OperatorList
(即页面)被解析之前开始呈现,从而减少从页面加载到完全呈现所需的总时间。
这听起来有道理吗?
是的,它应该很容易验证(只需增加很多值,有效地禁用这种分块)。
svg.js 应该被修复,而不是修改
OperatorList
和它的常量CHUNK_SIZE
。
同意,修改常量绝对不是一个可以接受的解决方案。 首先,它只会将错误移到别处。 其次,更重要的是,更改它可能会对画布后端的一般渲染性能产生深远的影响。
可能是这样的:如果没有中间路径绘制操作符,连续的
OPS.constructPath
操作符应该组合成一个<svg:path>
节点......
再一次,这听起来完全合理。
我可以确认,如果我将 CHUNK_SIZE 增加到 10000000,那么问题就会消失。
(我同意这不是一个正确的解决方案)
谢谢你的帮助。
最有用的评论
正确的; 这是为了允许在整个
OperatorList
(即页面)被解析之前开始呈现,从而减少从页面加载到完全呈现所需的总时间。是的,它应该很容易验证(只需增加很多值,有效地禁用这种分块)。
同意,修改常量绝对不是一个可以接受的解决方案。 首先,它只会将错误移到别处。 其次,更重要的是,更改它可能会对画布后端的一般渲染性能产生深远的影响。
再一次,这听起来完全合理。