当前位置: 首页 > 知识库问答 >
问题:

使用PrintPDF命令行工具打印PDFBox

马绪
2023-03-14

我正在使用DHL Shipping(XML)API请求DHL发货并自动打印响应的发货标签。

系统是这样工作的:

DHL响应XML包含base64编码的pdf,其中包含:

第1页。装运标签(打印在包装上的标签上)

第2页。存档文件(需要单独打印并交给快递员)

为了分离这两个PDF,我首先解码base64,然后使用PDFBox命令行工具执行PDFSplit,最后在各自的打印机上打印各自的文档:

$filename = "dhlexpress_labels/".date("Ymd_his")."_{$_REQUEST['id']}.pdf";
//Get the pdf response from DHL
$data = file_get_contents("path/dhl_request_shipment.php?".http_build_query($_REQUEST));
//Put decoded data in the file
file_put_contents($filename,base64_decode($data));
//Split the file into two
$exec = 'java pdfbox-app-1.8.3.jar PDFSplit -split 1 ' . $filename;
exec($exec);
//Print each file
$exec = 'java pdfbox-app-1.8.3.jar PrintPDF -silentPrint -printerName DHLPrinter ' . str_replace('.pdf',-0.'.pdf',$filename);
exec($exec);
$exec = 'java pdfbox-app-1.8.3.jar PrintPDF -silentPrint -printerName PaperPrinter ' . str_replace('.pdf',-1.'.pdf',$filename);
exec($exec);

问题是:DHL的回复包含一个尺寸为8"x4"贴纸的pdf,它可以在DHLPrinter上完美打印,但在PcopPrinter上它不会打印标签的左侧和顶部5mm。见附图:

我认为这是因为pdf以某种方式覆盖了边距,导致pdf移动到可打印区域之外。

有人知道解决这个问题的方法吗?我希望打印是完全自动化的,并将停止在任何长度这样做。我只是想知道是否有人对如何编辑pdf页边距有任何创造性的想法。

共有1个答案

慎风畔
2023-03-14

我想出了一个解决办法。使用OverlayPDF,我将归档文档覆盖到一个空白PDF上,它显示在中间,如下图所示:居中标签

我刚刚添加了这两行代码,效果非常好:

$exec = java -jar pdfbox-app-2.0.3-20160908.164926-191.jar OverlayPDF blank.pdf '. str_replace('.pdf','-1'.'.pdf',$filename) .' '. str_replace('.pdf','-1'.'.pdf',$filename);
exec($exec);

我尝试使用PrintPDF的“方向”属性,但它实际上使它更小:方向:垂直方向:水平完全混乱。图片包含在下面的评论中。

 类似资料:
  • 简介 我们基于Python SDK实现了命令行工具cloudml,可以方便使用访问Xiaomi Cloud-ML服务。 由于sdk的接口更新较快,命令的使用方式可以通过-h选项获取最新的使用方法。 初始化配置文件 cloudml init 查看帮助 cloudml -h TrainJob相关命令 列举训练job cloudml jobs list 提交训练job cloudml jobs s

  • 工欲善其事,必先利其器。学好SQLite的命令行工具,对于我们学习SQLite本身而言是非常非常有帮助的。最基本的一条就是,它让我们学习SQLite的过程更加轻松愉快。言归正传吧,在SQLite的官方下载网站,提供了支持多个平台的命令行工具,使用该工具我们可以完成大多数常用的SQLite操作,就像sqlplus之于Oracle。以下列表给出了该工具的内置命令: 命令名 命令说明 .help 列出所

  • 命令行工具 meteor help 获取 meteor 命令行使用帮助。运行 meteor help 会列出meteor所有命令。运行meteor help <command>会打印出关于meteor <command>的详细帮助。 meteor create <name> 创建一个名为<name>的子目录,并在里面新建一个Meteor应用。 met

  • web3j的完全jar文件分发包对每一次发布都提供命令行工具。命令行允许你从终端(terminal)使用web3j的一些功能: 这些工具提供: 钱包创建 钱包密码管理 从一个钱包转移到另一个钱包以太币 solidity智能合约封装包的产生 命令行工具可以从github项目存储库的releases页面下载zipfile/tarball包,或者通过源代码自己编译获得;OS X用户也可以通过Homebr

  • 命令行工具 web3j的jar包为每一个版本都提供命令行工具。命令行工具允许你直接通过一些命令使用web3j的一些功能: 钱包创建 钱包密码管理 资金从钱包转移到另一个 solidity编写的智能合同功能打包 请参阅文档以获得命令行相关的进一步的信息。

  • 命令行是程序员的好伙伴 作为一名优秀的程序员,熟练的命令行操作也是必不可少的。在『Laravel 实战教程』系列课程中,我们的很多操作都会使用到命令行,如: Git 操作; 虚拟机管理; 部署到线上等。 工欲善其事、必先利其器,命令行工具的选择也尤其重要。这里为了课程讲解的一致性,也为了避免读者在学习中犯不必要的错误,我们为各个平台挑选了专属的命令行工具,请大家配合使用。 Mac 用户 Mac O