PHP 调用 Python 进行 pdf 打印问题求教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zjfeng18
V2EX    问与答

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

  •  
  •   zjfeng18 2018-06-23 10:20:55 +08:00 2471 次点击
    这是一个创建于 2735 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为项目需要,需要用 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  
    PRO
       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     Solana     3823 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 00:58 PVG 08:58 LAX 16:58 JFK 19:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86