我正在开发一个 node 函数,它可以读取 pdf 文件并从第一页生成图像。
为了实现此目的,我使用 pdf.js 库,我已使用命令
npm install pdfjs-dist
安装了该库。我的代码基本上是 pdf.js 提供的 node example 的副本。
当我执行实现逻辑的代码时,我首先遇到错误HTMLElement未定义。
我通过更改原始代码pdf.js来修复此错误
if (imgData instanceof HTMLElement || !imgData.data)
新的
if ((typeof HTMLElement !== 'undefined' && imgData instanceof HTMLElement) || !imgData.data)
然后,解决了第一个问题,我进入了第二个错误图像未定义。
我修复了此错误,在 pdf.js 源文件的开头添加以下行
var Canvas = require("canvas");
global.Image = Canvas.Image;
完成这两个修复后,一切正常。
我很确定这不是库 pdf.js 的使用方式,所以我想知道我错过了什么。
直接修改库的源代码就像使用大锤进行手术——也许有效,但很难优雅或可持续。您的方法虽然富有创意,但却偏离了最佳实践的道路。
pdf.js
主要是为浏览器环境设计的;因此,您在 Node.js 中遇到的错误是预料之中的,但并非无法克服。
首先,您的手动调整是临时修复,将您绑定到特定的
pdf.js
版本,使更新和维护变得复杂。真正的解决方案在于了解 pdf.js 环境并调整 Node.js 环境来模仿它,而不是重写库。
对于
HTMLElement is not defined
问题,你的条件修复是治标不治本的典型案例。 pdf.js
寻求类似浏览器的环境。您的 Node.js 设置应该为特定于浏览器的对象(如 HTMLElement
和 Image
)提供必要的垫片或填充,而不改变 pdf.js
本身。
关于
Image is not defined
错误,先发制人地要求 canvas
并将 Canvas.Image
全局分配给 Image
可能看起来很聪明,但这是一个可能会导致未来头痛的黑客行为。更复杂的方法是利用现有的 Node.js 包来填充这些 API,或者在应用程序中使用条件逻辑,仅当 pdf.js
在 Node.js 中运行时才提供这些功能。