如何用gsprint打印远程PDF文件(后续拟结合Python实现)
问题解答
核心结论
Ghostscript 和 gsprint 不支持直接读取远程URL的PDF文件,必须先将文件下载到本地,再进行打印操作。
报错原因
/undefinedfilename 错误的本质是:Ghostscript 的输入仅支持本地文件路径、标准输入(stdin)或本地可访问的数据源,远程HTTP/HTTPS URL不在其支持的输入范围内,因此无法识别并加载远程PDF。
解决方案
1. 先下载再打印(唯一可行路径)
不管使用gsprint还是直接用Ghostscript,都需要先把远程PDF下载到本地。你可以优化Python下载代码,添加请求头解决403问题(很多网站会拦截无浏览器标识的请求):
import requests import os url = 'https://www.nceas.ucsb.edu/sites/default/files/2020-04/colorPaletteCheatsheet.pdf' # 添加浏览器请求头避免403拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } r = requests.get(url, headers=headers, stream=True) r.raise_for_status() # 检查请求是否成功 # 保存到临时路径 local_pdf_path = 'M:/temp_print.pdf' with open(local_pdf_path, 'wb') as f: for chunk in r.iter_content(chunk_size=8192): f.write(chunk) # 打印完成后可删除临时文件 # os.remove(local_pdf_path)
2. 本地文件打印的正确命令
使用gsprint打印
去掉多余的-sOutputFile参数(该参数用于生成PDF文件,而非直接打印到打印机):
M:\gs\gsprint.exe -ghostscript "M:\gs\bin\gswin32.exe" -printer "Samsung C1810 Series" -from 1 -to 3 -portrait -copies 1 "M:/temp_print.pdf"
直接使用Ghostscript打印
无需依赖gsprint,直接用Ghostscript命令完成打印:
M:\gs\bin\gswin32.exe -dNOPAUSE -dBATCH -sDEVICE=mswinpr2 -sOutputFile="%printer%Samsung C1810 Series" -dFirstPage=1 -dLastPage=3 -dCopies=1 -dOrientation=Portrait "M:/temp_print.pdf"
3. Python整合下载+打印流程
可以直接在Python中调用系统命令完成全流程:
import requests import os import subprocess url = 'https://www.nceas.ucsb.edu/sites/default/files/2020-04/colorPaletteCheatsheet.pdf' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } r = requests.get(url, headers=headers) r.raise_for_status() local_pdf = 'M:/temp_print.pdf' with open(local_pdf, 'wb') as f: f.write(r.content) # 调用gsprint执行打印 gsprint_cmd = [ 'M:\\gs\\gsprint.exe', '-ghostscript', 'M:\\gs\\bin\\gswin32.exe', '-printer', 'Samsung C1810 Series', '-from', '1', '-to', '3', '-portrait', '-copies', '1', local_pdf ] subprocess.run(gsprint_cmd, check=True) # 清理临时文件 os.remove(local_pdf)
内容的提问来源于stack exchange,提问作者pixeled
相关产品推荐
相关产品推荐

