使用PHP API为Citizen标签打印机

时间:2016-05-07 07:57:33

标签: php printing

任何帮助将不胜感激。我们正在尝试连接php系统,以自动将DPD标签打印到Citizen标签打印机。我们正在探索使用安装得很好的php_printer,可以从我们的代码中看到打印机,DPD api调用正在DPD网站上成功生成新的货物。

问题

  1. 首先,这是使用php_printer从PHP应用程序向Citizen标签打印机发送原始打印数据的最佳方法,还是有更好的方法?
  2. 其次,我们将很快进行一些实时测试,但似乎在DPD api get Label调用中存在格式问题,我们检索原始公民打印数据以直接发送到打印机以触发打印。
  3. API示例中的预期数据

    \M3000\c0000\e\O0220\f290\n\a\LD11PISIH12
    2911A0803340387DPD
    2911A0603500375www.dpd.co.uk
    1911A1003800095Responsible Delivery - CO Neutral
    1911A08037802572
    2911A0603780354Sender
    2911A0603780346GEOPOSTUK LTD
    2911A0603780338ROEBUCK LANE
    2911A0603780330SMETHWICK
    2911A0603780322BIRMINGHAM
    ------ etc
    

    我们在输出.txt文件中收到下面的数据样本,因为在file_put_contents之后,文件中没有出现斜杠,而在我们的读者中,它们显示为空格或黑色圆圈。

    我们收到的实际数据

    M3000c0000eO0220f290naLD11PISIH12
    2911A0803340387DPD
    2911A0603500375www.dpd.co.uk
    1911A1003800095Responsible Delivery - CO   Neutral
    1911A08037802572
    2911A0603780354Sender
    2911A0603780346GEOPOSTUK LTD
    2911A0603780338ROEBUCK LANE
    2911A0603780330SMETHWICK
    2911A0603780322BIRMINGHAM
    

    有人可以建议我们需要配置的php标头或输出设置,以确保不会从请求中删除任何内容吗?

    将代码示例发送到DPD以获取标签: -

    $shipmentId = 123456789;
    $method = '/shipping/shipment/' . $shipmentId . '/label/';
    
    $url = 'https://api.dpd.co.uk . $method;
    $options = array(
    'http' => array(
        'method' => 'GET',
        'Host' => 'api.dpd.co.uk',
        //'header' => "Accept: text/html\r\n" .
        'header' => "Accept: text/vnd.citizen-clp" .
        "GEOClient: account/" . $account_number . "\r\n" .
        "GEOSession: " . $session . "\r\n"
     )
    );
    
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);
    file_put_contents("dpd_test_citizen_clp.txt", $result);
    

    提前致谢!

3 个答案:

答案 0 :(得分:2)

对于那些需要知道如何实际打印此文件的人,数据采用Citizen PRN格式,可以使用Windows COPY命令直接发送到打印机。

从命令提示符:

COPY /B C:\FILENAME.PRN \\ComputerName\PrinterName

您需要为可在\\ComputerName\PrinterName

访问的Citizen打印机创建打印机共享

如果您在本地运行PHP来实现此目的,那么您可以使用:

file_put_contents("C:\dpd.prn", $data)
exec("COPY /B C:\DPD.PRN \\ComputerName\PrinterName")

如果您发现本地安装PHP太令人生畏或复杂,请考虑使用AutoHotKey等基本脚本语言:https://autohotkey.com/

编辑: 我已经编写了一个nodejs应用程序,您可以使用websocket连接到将发送给它的数据复制到本地公民打印机:https://github.com/MacroMan/DPDLocalPrinter

答案 1 :(得分:0)

更新:这实际上是DPD的API更改,因为它们从返回的输入中删除了\。所以上面的代码都很好,输出就像预期的那样。

答案 2 :(得分:0)

经过几个小时的不工作后,我想我会分享我们的解决方案。上面列出的所有内容都是正确的,我们唯一做错的事情(我现在感到愚蠢!)是从Postman复制API响应,而不是将file_push_contents('data.prn', $response)复制到新文件中。

复制并粘贴邮递员的回复,或DPD API文档会删除使其工作所需的所有位!