V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zjfeng18
V2EX  ›  问与答

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

  •  
  •   zjfeng18 · 2018-06-23 10:20:55 +08:00 · 2150 次点击
    这是一个创建于 2376 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为项目需要,需要用 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 条回复    2018-06-23 19:01:59 +08:00
    ijimmy
        1
    ijimmy  
       2018-06-23 10:32:37 +08:00 via iPhone
    Python 写个接口调用不是更好?
    feiyuanqiu
        2
    feiyuanqiu  
       2018-06-23 10:44:35 +08:00
    看看这个会不会有什么帮助 http://php.net/manual/en/function.exec.php#101837
    zjfeng18
        3
    zjfeng18  
    OP
       2018-06-23 10:49:42 +08:00
    @ijimmy 我现在是通过 php 调用 python 的,还会传几个参数,你说的接口是什么方式?
    qiayue
        4
    qiayue  
       2018-06-23 10:51:13 +08:00
    可能是 php 配置里禁止了 exec 执行
    zjfeng18
        5
    zjfeng18  
    OP
       2018-06-23 10:51:28 +08:00
    @feiyuanqiu exec 是能执行的,pg_print.py 中部分代码也执行了,我打印前先将 html 转 pdf 的,这一步成功的,就是调用 win32api.ShellExecute(0,'print',self.pdf_file_name,win32print.GetDefaultPrinterW(),".", 0)打印 pdf 时,没有反应
    ijimmy
        6
    ijimmy  
       2018-06-23 11:01:32 +08:00 via iPhone
    Python 不太熟悉,不过可以用 flask 或 django 之类的框架写一个 Web 服务,然后用 PHP 调用就可以了啊
    zjfeng18
        7
    zjfeng18  
    OP
       2018-06-23 11:06:01 +08:00
    @qiayue exec 可以执行了,也给分配了权限,我还给 cmd.exe 与打印机都分配了权限
    PHPJit
        8
    PHPJit  
       2018-06-23 11:18:31 +08:00
    php 执行 python 是 www 权限,是不是权限的原因哦。
    PHPJit
        9
    PHPJit  
       2018-06-23 11:19:39 +08:00
    你用 root 权限 cli 模式运行 php 试一下
    zjfeng18
        10
    zjfeng18  
    OP
       2018-06-23 11:22:07 +08:00
    好像,通过 php 调用 python 执行 win32api.ShellExecute 都不能执行
    feiyuanqiu
        11
    feiyuanqiu  
       2018-06-23 11:29:51 +08:00
    @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
       2018-06-23 11:31:16 +08:00
    @PHPJit 大神,在你的提醒下,我在 cmd 下执行 php,发现能正常提交打印,我是 win2008 服务器,通过 cmd 执行时使用的是当前用户操作的,使用 web 执行时是 system 用户
    zjfeng18
        13
    zjfeng18  
    OP
       2018-06-23 11:46:07 +08:00
    @feiyuanqiu 这种方式不能打印?不知为什么
    zjfeng18
        14
    zjfeng18  
    OP
       2018-06-23 11:47:10 +08:00
    @PHPJit 大神,这是什么原因,是 cmd.exe 权限?应该怎么分配权限?请指教
    feiyuanqiu
        15
    feiyuanqiu  
       2018-06-23 11:57:24 +08:00
    @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  
       2018-06-23 13:30:58 +08:00
    思路不对,应该通过 Web 服务器软件分开调度,而不是通过 PHP 脚本去调用。

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

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

    总之,PHP cli 与 Web 里面运行时有些差异,特别时这几个命令的调用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5688 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:10 · PVG 11:10 · LAX 19:10 · JFK 22:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.