使用Print.js打印PDF文件报CORS错误无法打印,求解决方案
问题原因
该报错属于Chrome浏览器的安全策略限制,和代码逻辑、Print.js引入方式无关:
- Print.js打印PDF时会先通过XMLHttpRequest请求加载PDF文件,再做后续打印处理。你是直接双击本地HTML文件,用
file://协议打开页面,Chrome默认禁止file://协议下发起的跨域请求,哪怕PDF和HTML文件存放在同一本地目录也会触发拦截。 - 打印JPG正常是因为图片资源可以通过img标签直接加载,不需要走XMLHttpRequest请求,因此不会触发CORS限制。
可行解决方案
方案1:使用本地HTTP服务器运行页面(最推荐)
不要直接双击打开HTML文件,在项目目录启动一个本地HTTP服务后通过http://协议访问页面即可解决问题,常用的启动方式:
- 如果你安装了Node.js,在项目目录执行命令:
npx serve,访问控制台输出的服务地址(默认http://localhost:3000)即可 - 如果你安装了Python,Python3环境执行命令:
python -m http.server 8000,Python2环境执行命令:python -m SimpleHTTPServer 8000,访问http://localhost:8000即可 - 如果你用VS Code开发,安装Live Server插件后,右键HTML文件选择「Open with Live Server」会自动启动服务并打开页面
方案2:直接传入PDF的base64内容(适合需要本地直接打开文件的场景)
如果不能启动HTTP服务,可以提前将test.pdf转换为base64格式字符串,修改Print.js的调用参数即可跳过文件请求步骤:
function sample(){ printJS({ printable: "替换为你的test.pdf对应的base64字符串", type: "pdf", base64: true }); }
方案3:关闭Chrome安全限制(仅适合本地调试使用)
如果仅用于本地临时调试,可以给Chrome添加启动参数关闭跨域限制,不建议给普通用户使用该方案:
右键Chrome快捷方式,选择「属性」,在「目标」输入框的原有内容末尾添加如下参数,保存后双击该快捷方式打开浏览器再访问本地HTML即可:
--allow-file-access-from-files --disable-web-security --user-data-dir="C:/ChromeTempData"
注意user-data-dir后面的路径可以自定义一个本地空目录。
内容的提问来源于stack exchange,提问作者user10333164
相关产品推荐
相关产品推荐

