如何用Tampermonkey脚本将页面PDF转Base64并通过PrintNode API打印?
基于会话登录的PDF通过PrintNode自动打印解决方案
问题分析
目标页面https://example.com/InternalReport.php?id=417660直接返回PDF并由浏览器内置查看器渲染,但直接编码document.body会获取到查看器的HTML结构,而非原始PDF内容,导致PrintNode无法识别。
解决方案
重新请求当前页面URL获取原始PDF二进制数据,转成Base64后再调用PrintNode API发送打印请求。浏览器fetch默认携带当前会话Cookie,无需额外处理登录验证。
完整Tampermonkey脚本
// ==UserScript== // @name PrintNode自动打印会话PDF // @namespace http://tampermonkey.net/ // @version 0.1 // @match https://example.com/InternalReport.php?id=* // @grant none // ==/UserScript== (function() { 'use strict'; // 重新请求当前页面,获取原始PDF二进制数据 fetch(window.location.href, { method: 'GET', credentials: 'include' // 确保携带会话Cookie }) .then(response => response.blob()) .then(blob => { // 将Blob转换为Base64字符串 const reader = new FileReader(); reader.onloadend = function() { // 提取Base64部分(去掉"data:application/pdf;base64,"前缀) const base64Pdf = reader.result.split(',')[1]; // 调用PrintNode API发送打印请求 fetch("https://api.printnode.com/printjobs", { method: "POST", headers: { 'Content-Type': 'application/json', // 注意:需要添加PrintNode API密钥到Authorization头 'Authorization': 'Basic ' + btoa('你的API密钥:') }, body: JSON.stringify({ printerId: "71635092", contentType: "pdf_base64", content: base64Pdf }) }) .then(result => { console.log("打印请求发送成功:", result); }) .catch(err => { console.error("打印请求失败:", err); }); }; reader.readAsDataURL(blob); }) .catch(err => { console.error("获取PDF失败:", err); }); })();
关键说明
- 重新请求URL:当前页面的响应本身就是PDF,直接fetch该URL可获取原始二进制数据,绕过浏览器内置查看器的DOM结构。
- 会话保持:
credentials: 'include'确保请求携带当前登录会话的Cookie,无需手动处理登录验证。 - Base64转换:通过
FileReader将Blob转为DataURL,再提取纯Base64字符串(去掉前缀),符合PrintNode的pdf_base64格式要求。 - API授权:需要在请求头中添加PrintNode的API密钥,格式为
Basic base64(API密钥:),注意末尾的冒号不能省略。
内容的提问来源于stack exchange,提问作者JpaytonWPD
相关产品推荐
相关产品推荐

