<p>pdf.js 不适用于 requirejs</p>

创建于 2016-05-03  ·  18评论  ·  资料来源: mozilla/pdf.js

以下 HTML 演示了该问题:

<html> <head> <title>Flexpaper React/Require Sandbox</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.js"></script> <script> require(['pdf'], function(pdf) { console.log('PDFJS Module: ' + pdf); console.log('PDFJS Global: ' + window.PDFJS); }); </script> </head> </html>

pdf.js,检测“require”和“define”函数的存在,因此不会设置全局PDFJS实例。 但是,它也不会通过模块加载器返回对该实例的引用。

因为在上面的例子中“pdf”和“window.PDFJS”都没有定义,所以不能在使用 require 的应用程序中使用该库。 无论是否使用 require 加载 pdf.js 都是如此。

请注意,这在 1.0.1040 版本中正常工作,但在 1.4.20 和 1.5.188 中失败。 我没有使用 3 以外的版本进行测试。 Chrome 和 Safari 之间的所有三个版本的行为都是一致的。

最有用的评论

由于我也在 RequireJS 中正确引用时遇到了一些困难,因此我将留下我的解决方案,它是 RequireJS 配置的一部分:

paths: {
    'pdfjs-dist/build/pdf': 'myfolder/pdf.min',
    'pdfjs-dist/build/pdf.worker': 'myfolder/pdf.worker.min'
}

当您这样做时,您甚至不必按照示例中的建议将工作人员的路径分配给PDFJS.workerSrc ,因为会自动找到工作人员。

所有18条评论

什么是“pdf”? 你能提供完整的例子吗?

当然,我将设置一个 Github 存储库来更完整地演示。

这是回购: https :

'pdf' 是 require 试图返回该函数的模块引用。 在这种情况下,Requirejs 正在动态加载 pdf.js 并尝试将“模块引用”返回给回调函数,但是未设置模块引用。 您可以通过浏览器的网络调试器看到动态加载。

这通常不会有什么大不了的,除了 pdf.js 中的某些东西检测到模块加载器存在,然后没有设置全局 PDFJS 对象。 由于两者都不存在,因此当页面上有 requirejs 时,您无法使用该库。

请注意,即使您不使用 require 加载对象,也会发生这种情况。 我在页面上放了一个注释掉的对 pdf.js 的脚本引用。 如果将其放在 require 之前,则全局将被正确设置。 如果将其放在 require 之后,则不会设置全局。

代码有两个问题:

  1. 模块不是以其名称引用,请使用“pdfjs-dist/build/pdf”(如果您将 pdfjs-dist 移动到不同的地方,请使用 require.config 来更改位置)
  2. 您正在使用 document.write,它会擦除​​文档

尝试类似:

        require.config({paths: {'pdfjs-dist': './node_modules/pdfjs-dist'}});
        require(['pdfjs-dist/build/pdf'], function(pdf) {
            console.log('PDFJS Module: ' + pdf + '<br>');
            console.log('PDFJS Global: ' + window.PDFJS);
        });

关闭作为回答。

请注意,这适用于版本 1.0.1040

在此版本上工作是 requirejs 将脚本加载为常规脚本标记的副作用——并不表示它与 require.js 兼容

设置全局 PDFJS 实例

全局 PDFJS 将在未来版本中删除,因此如果您使用 requirejs,您可以通过pdf.PDFJS / 使用相同的对象

关于第 1 点:
我没有使用 node 在那个例子中包含 pdf.js 。 我下载了官方发行版,将 pdf.js 复制到示例的根目录中。 因此,将其引用为“pdf”是正确的。 您可以通过查看网络调试器中的示例来验证这一点,您将看到文件已被 require 正确下载。

关于第 2 点:
这样做是为了简化示例。 无论示例做什么,引用都是未定义的,并且无法使用库。 具体来说,切换到 console.log 也会将引用显示为未定义。

关于在未来版本中删除的 Global PDFJS:
我对此很好,但是当 pdf 未定义时,应该如何通过 pdf.PDFJS 引用库?

我没有使用 node 在那个例子中包含 pdf.js

我没有假设您使用的是 node.js。

下载官方发行版并将pdf.js复制到示例的根目录中。

PDF.js 是一个库,由许多文件组成,例如 pdfjs-dist/build/pdf 模块可以加载 pdfjs-dist/build/pdf.worker 模块

因此,将其引用为“pdf”是正确的。

您仍然需要使用定义中列出的任何 AMD 名称,请参阅https://github.com/MartinSnyder/pdfjs-with-requirejs/blob/master/pdf.js#L21

您是否尝试使用指向完整库的 require.config 上面的示例?

您是否尝试使用指向完整库的 require.config 上面的示例?

我现在刚刚完成,它像你说的那样工作。

这是否意味着您不能为此使用此处找到的“已下载”发行版?
https://mozilla.github.io/pdf.js/getting_started/#download

只要您使用节点“pdfjs-dist”包就可以了,但是下载的版本不应该与此一起使用?

只要您使用节点“pdfjs-dist”包就可以了,但是下载的版本不应该与此一起使用?

我认为它与主题无关,但您仍然可以使用此包中的 pdf.js/pdf.worker.js 文件,将 requirejs 'pdfjs-dist' 指向压缩位置(自 pdf.js 和 pdf. worker.js 文件位于 build 文件夹中)。

您仍然需要使用定义中列出的任何 AMD 名称,请参阅https://github.com/MartinSnyder/pdfjs-with-requirejs/blob/master/pdf.js#L21

这是我的理解中遗漏的关键部分。 谢谢你花时间向我解释。

你好,我有类似的问题,所以我不打算开一个新的,但在这里问,我希望没问题。
我正在尝试使用 require.js 实现基于https://github.com/mozilla/pdf.js/blob/master/examples/components/simpleviewer.js 的查看器。 但是当我同时需要 pdf.js 和 pdf_viewer.js 文件时, PDFJS.PDFViewer 是未定义的。

这是示例存储库: https :

@Lazzi您的main.js模块对于 AMD 来说看起来很奇怪,请尝试:

define('main', ['pdfjs-dist/build/pdf', 'pdfjs-dist/web/pdf_viewer'], function(pdfjsLib, viewer, require) {

兼容性不是 AMD,所以我不知道它将如何工作。

是的,它不是 AMD,但 require.js 也支持这种模块定义: http ://requirejs.org/docs/api.html#cjsmodule

但是,您提议的更改并没有解决我的问题..

@Lazzi我明白了,让我们试试 #7332(AFAIK AMD 名称很重要)

@yurydelendik它有效! 你很有帮助。 谢谢你。

这可能对你有用,也可以放在你的 require.config 中

    map: {
        '*': {
            'pdfjs-dist/build/pdf.worker' : 'path/to/your/install/pdf.worker'
        }
    },

map 函数本质上是一个全局字符串替换,'*' 是使用字符串替换的依赖项——主要用于为其他库包含不同版本的库。 就像有 2 个版本的 JQuery 并行运行一样。 小心使用 -- 因为它只进行字符串替换,如果其他依赖项匹配,您可能最终会替换它们中的路径。

在这种情况下,'*' 可能只是主要的 pdf.js 依赖项。

由于我也在 RequireJS 中正确引用时遇到了一些困难,因此我将留下我的解决方案,它是 RequireJS 配置的一部分:

paths: {
    'pdfjs-dist/build/pdf': 'myfolder/pdf.min',
    'pdfjs-dist/build/pdf.worker': 'myfolder/pdf.worker.min'
}

当您这样做时,您甚至不必按照示例中的建议将工作人员的路径分配给PDFJS.workerSrc ,因为会自动找到工作人员。

谢谢@dmaxweiler! 我遇到了同样的问题——我在使用 RequireJS 时也无法正确加载 pdf.js。 您的解决方案对我有用! 惊人的。 谢谢你的帮助。

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