zjfeng18
V2EX  ›  问与答

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

  •  
  •   zjfeng18 · Jun 23, 2018 · 2976 views
    This topic created in 3064 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
    ijimmy
    Jun 23, 2018 via iPhone
    1
    Python 写个接口调用不是更好?
    feiyuanqiu
    feiyuanqiu
    Jun 23, 2018
    2
    看看这个会不会有什么帮助 http://php.net/manual/en/function.exec.php#101837
    zjfeng18
    zjfeng18
    OP
    Jun 23, 2018
    3
    @ijimmy 我现在是通过 php 调用 python 的,还会传几个参数,你说的接口是什么方式?
    qiayue
    qiayue
    Jun 23, 2018
    4
    可能是 php 配置里禁止了 exec 执行
    zjfeng18
    zjfeng18
    OP
    Jun 23, 2018
    5
    @feiyuanqiu exec 是能执行的,pg_print.py 中部分代码也执行了,我打印前先将 html 转 pdf 的,这一步成功的,就是调用 win32api.ShellExecute(0,'print',self.pdf_file_name,win32print.GetDefaultPrinterW(),".", 0)打印 pdf 时,没有反应
    ijimmy
    ijimmy
    Jun 23, 2018 via iPhone
    6
    Python 不太熟悉,不过可以用 flask 或 django 之类的框架写一个 Web 服务,然后用 PHP 调用就可以了啊
    zjfeng18
    zjfeng18
    OP
    Jun 23, 2018
    7
    @qiayue exec 可以执行了,也给分配了权限,我还给 cmd.exe 与打印机都分配了权限
    PHPJit
    PHPJit
    Jun 23, 2018
    8
    php 执行 python 是 www 权限,是不是权限的原因哦。
    PHPJit
    PHPJit
    Jun 23, 2018
    9
    你用 root 权限 cli 模式运行 php 试一下
    zjfeng18
    zjfeng18
    OP
    Jun 23, 2018
    10
    好像,通过 php 调用 python 执行 win32api.ShellExecute 都不能执行
    feiyuanqiu
    feiyuanqiu
    Jun 23, 2018
    11
    @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
    zjfeng18
    OP
    Jun 23, 2018
    12
    @PHPJit 大神,在你的提醒下,我在 cmd 下执行 php,发现能正常提交打印,我是 win2008 服务器,通过 cmd 执行时使用的是当前用户操作的,使用 web 执行时是 system 用户
    zjfeng18
    zjfeng18
    OP
    Jun 23, 2018
    13
    @feiyuanqiu 这种方式不能打印?不知为什么
    zjfeng18
    zjfeng18
    OP
    Jun 23, 2018
    14
    @PHPJit 大神,这是什么原因,是 cmd.exe 权限?应该怎么分配权限?请指教
    feiyuanqiu
    feiyuanqiu
    Jun 23, 2018
    15
    @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
    Foolt
    Jun 23, 2018
    16
    思路不对,应该通过 Web 服务器软件分开调度,而不是通过 PHP 脚本去调用。

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

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

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