pdf.js 只能处理特定的 PDF 文件吗?

4
我正在尝试使用pdf.js将pdf页面转换为画布。我使用了K3N在Render .pdf to single Canvas using pdf.js and ImageData中的答案来实现这一点。代码在Fiddle1中可用。
问题是这似乎只适用于某些pdf文件。
例如,该代码对http://arxiv.org/pdf/1207.0102v2.pdfFiddle2中运行良好。
然而,当我尝试将相同的代码应用于http://infolab.stanford.edu/pub/papers/google.pdf时,在Fiddle3中它无法工作。
为什么会发生这种情况?能否修复?
1个回答

5
它应该适用于所有PDF文件,除非它们已损坏。您在此处遇到的错误是:
XMLHttpRequest无法加载http://infolab.stanford.edu/pub/papers/google.pdf。请求的资源上没有“Access-Control-Allow-Origin”标头。因此,源“http://fiddle.jshell.net”不允许访问。
换句话说,您无法以这种方式加载它,因为http://infolab.stanford.edu/pub/papers/google.pdf不允许您这样做。当您将其放在服务器上并使用适当的响应标头加载时,它很可能会正常工作。
有关此错误的更多信息,请参阅为什么我看到“起源不被Access-Control-Allow-Origin允许”的错误?
如果您不想托管这些文件,可以通过代理传输它们(可以是第三方应用程序或您的服务器)。例如,Ivan Žužak开发了urlreq——一种完全符合我们在此情况下所需的工具。
不要使用PDF文件的直接链接,而是使用Ivan的代理URL:

http://urlreq.appspot.com/req?method=GET&url=http%3A%2F%2Finfolab.stanford.edu%2Fpub%2Fpapers%2Fgoogle.pdf

This text is already in Chinese. It says: "

JSFIDDLE

".

有没有办法在使用pdf.js之前将文件暂时下载到我的服务器上,然后再将其删除? - user3741635
@user3741635 当然,这不是真正的下载,而是将网络数据传输到响应中。可以通过代理来实现这一点。 - Ionică Bizău
使用 urlreq 的一个缺点是浏览器似乎无法缓存文件,每次刷新 PDF 文件都必须重新加载。 - user3741635
@user3741635 嗯,urlreq 只是一个例子。你可以自己构建一个启用了缓存的代理。别忘了点击 按钮进行标记。谢谢。 - Ionică Bizău
谢谢回复。你知道有没有一些参考资料,可以解释如何构建这样的代理吗? - user3741635
@user3741635 你们的服务器端语言是什么?如果是Node.js,你可以看一下wrabbit——这是我写的一个库,它添加了一些包装代码,但代理原则在那里:你提供一个URL,在服务器端发出请求并将其流式传输到客户端。另一方面,你可能想在Ivan的存储库中开启一个功能请求。 :) - Ionică Bizău

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接