zjfeng18
V2EX  ›  问与答

PHP 调用 Python 进行 pdf 打印问题求教

  •  
  •   zjfeng18 · Jun 23, 2018 · 2704 views
    This topic created in 2907 days ago, the information mentioned may be changed or developed.
    因为项目需要,需要用 php 调用 python 进行 pdf 打印,
    php 通用 exec()调用 python:
    $c = exec("C:\Python34\python.exe D:\webroot\api\web_print\pg_print.py ",$out,$res);
    pg_print.py 用
    win32api.ShellExecute(0,'print',self.pdf_file_name,win32print.GetDefaultPrinterW(),".", 0)
    实现打印,
    self.pdf_file_name 为打印的 pdf 绝对路径
    用 python 测试是正常打印的,
    但通用 php 调用 python 打印,就是没有反应,也无报错,
    希望有了解的大神帮忙!谢啦!!
    21 replies    2018-06-23 19:01:59 +08:00
    ijimmy
        1
    ijimmy  
       Jun 23, 2018 via iPhone
    Python 写个接口调用不是更好?
    feiyuanqiu
        2
    feiyuanqiu  
       Jun 23, 2018
    看看这个会不会有什么帮助 http://php.net/manual/en/function.exec.php#101837
    zjfeng18
        3
    zjfeng18  
    OP
       Jun 23, 2018
    @ijimmy 我现在是通过 php 调用 python 的,还会传几个参数,你说的接口是什么方式?
    qiayue
        4
    qiayue  
    PRO
       Jun 23, 2018
    可能是 php 配置里禁止了 exec 执行
    zjfeng18
        5
    zjfeng18  
    OP
       Jun 23, 2018
    @feiyuanqiu exec 是能执行的,pg_print.py 中部分代码也执行了,我打印前先将 html 转 pdf 的,这一步成功的,就是调用 win32api.ShellExecute(0,'print',self.pdf_file_name,win32print.GetDefaultPrinterW(),".", 0)打印 pdf 时,没有反应
    ijimmy
        6
    ijimmy  
       Jun 23, 2018 via iPhone
    Python 不太熟悉,不过可以用 flask 或 django 之类的框架写一个 Web 服务,然后用 PHP 调用就可以了啊
    zjfeng18
        7
    zjfeng18  
    OP
       Jun 23, 2018
    @qiayue exec 可以执行了,也给分配了权限,我还给 cmd.exe 与打印机都分配了权限
    PHPJit
        8
    PHPJit  
       Jun 23, 2018
    php 执行 python 是 www 权限,是不是权限的原因哦。
    PHPJit
        9
    PHPJit  
       Jun 23, 2018
    你用 root 权限 cli 模式运行 php 试一下
    zjfeng18
        10
    zjfeng18  
    OP
       Jun 23, 2018
    好像,通过 php 调用 python 执行 win32api.ShellExecute 都不能执行
    feiyuanqiu
        11
    feiyuanqiu  
       Jun 23, 2018
    @zjfeng18 你这里是 php 通过 cmd 调用 python,python 再通过 cmd 调用 print,如果 win32api.ShellExecute 实在调不通的话,可以试试直接用 php 调用 print:

    shell_exec( 'print /d:"EPSON MFC-J265W" c:\file.txt');

    获取默认的打印机需要用到一个 pecl 包 https://pecl.php.net/package/printer 里面的 printer_list() 函数

    $printers = printer_list ( PRINTER_ENUM_DEFAULT );
    zjfeng18
        12
    zjfeng18  
    OP
       Jun 23, 2018
    @PHPJit 大神,在你的提醒下,我在 cmd 下执行 php,发现能正常提交打印,我是 win2008 服务器,通过 cmd 执行时使用的是当前用户操作的,使用 web 执行时是 system 用户
    zjfeng18
        13
    zjfeng18  
    OP
       Jun 23, 2018
    @feiyuanqiu 这种方式不能打印?不知为什么
    zjfeng18
        14
    zjfeng18  
    OP
       Jun 23, 2018
    @PHPJit 大神,这是什么原因,是 cmd.exe 权限?应该怎么分配权限?请指教
    feiyuanqiu
        15
    feiyuanqiu  
       Jun 23, 2018
    @zjfeng18 权限问题上面给的那个链接有个设置方法,可以试试看

    To make it work I just followed the next steps:
    - execute services.msc and find the apache service (In my case wampapache)
    - Right button>Log On tab and change from Local System Account to a user created account, enter the username and the password and restart the service.
    Foolt
        16
    Foolt  
       Jun 23, 2018
    思路不对,应该通过 Web 服务器软件分开调度,而不是通过 PHP 脚本去调用。

    正确的做法是 PHP 鉴权后,跳转到一个授权目录链接,Web 服务器软件(如 Nginx )把授权目录链接全部调给到 Python 处理并返回结果,而不通过 PHP 程序。或者干脆用 Python 搭建一个 Web 服务。

    你直接用 PHP exec,浪费服务器资源不说,而且容易崩。
    zjfeng18
        17
    zjfeng18  
    OP
       Jun 23, 2018
    @Foolt 因为现有项目是 php 的,要做自动打印 pdf 功能,php 完成操作后,自动调用打印
    zjfeng18
        18
    zjfeng18  
    OP
       Jun 23, 2018
    @Foolt 兄弟这个权限要设备弄知道吗?急呀
    zjfeng18
        19
    zjfeng18  
    OP
       Jun 23, 2018
    @feiyuanqiu 兄弟这个权限要设备弄知道吗?急呀
    zjfeng18
        20
    zjfeng18  
    OP
       Jun 23, 2018
    还没搞定!!
    loveyu
        21
    loveyu  
       Jun 23, 2018
    正确的思路可能是这样的,你先用 Python 开启一个 RPC 服务,然后 PHP 调用该 Python 的 RPC 服务, 接着 PHP 就可以直接返回了,然后 Python 在收到打印请求后开始打印。

    总之,PHP cli 与 Web 里面运行时有些差异,特别时这几个命令的调用。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4127 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 10:14 · PVG 18:14 · LAX 03:14 · JFK 06:14
    ♥ Do have faith in what you're doing.