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

2018-06-23 10:20:55 +08:00
 zjfeng18
因为项目需要,需要用 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 打印,就是没有反应,也无报错,
希望有了解的大神帮忙!谢啦!!
2112 次点击
所在节点    问与答
21 条回复
ijimmy
2018-06-23 10:32:37 +08:00
Python 写个接口调用不是更好?
feiyuanqiu
2018-06-23 10:44:35 +08:00
看看这个会不会有什么帮助 http://php.net/manual/en/function.exec.php#101837
zjfeng18
2018-06-23 10:49:42 +08:00
@ijimmy 我现在是通过 php 调用 python 的,还会传几个参数,你说的接口是什么方式?
qiayue
2018-06-23 10:51:13 +08:00
可能是 php 配置里禁止了 exec 执行
zjfeng18
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
2018-06-23 11:01:32 +08:00
Python 不太熟悉,不过可以用 flask 或 django 之类的框架写一个 Web 服务,然后用 PHP 调用就可以了啊
zjfeng18
2018-06-23 11:06:01 +08:00
@qiayue exec 可以执行了,也给分配了权限,我还给 cmd.exe 与打印机都分配了权限
PHPJit
2018-06-23 11:18:31 +08:00
php 执行 python 是 www 权限,是不是权限的原因哦。
PHPJit
2018-06-23 11:19:39 +08:00
你用 root 权限 cli 模式运行 php 试一下
zjfeng18
2018-06-23 11:22:07 +08:00
好像,通过 php 调用 python 执行 win32api.ShellExecute 都不能执行
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
2018-06-23 11:31:16 +08:00
@PHPJit 大神,在你的提醒下,我在 cmd 下执行 php,发现能正常提交打印,我是 win2008 服务器,通过 cmd 执行时使用的是当前用户操作的,使用 web 执行时是 system 用户
zjfeng18
2018-06-23 11:46:07 +08:00
@feiyuanqiu 这种方式不能打印?不知为什么
zjfeng18
2018-06-23 11:47:10 +08:00
@PHPJit 大神,这是什么原因,是 cmd.exe 权限?应该怎么分配权限?请指教
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
2018-06-23 13:30:58 +08:00
思路不对,应该通过 Web 服务器软件分开调度,而不是通过 PHP 脚本去调用。

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

你直接用 PHP exec,浪费服务器资源不说,而且容易崩。
zjfeng18
2018-06-23 13:35:35 +08:00
@Foolt 因为现有项目是 php 的,要做自动打印 pdf 功能,php 完成操作后,自动调用打印
zjfeng18
2018-06-23 14:32:48 +08:00
@Foolt 兄弟这个权限要设备弄知道吗?急呀
zjfeng18
2018-06-23 14:32:58 +08:00
@feiyuanqiu 兄弟这个权限要设备弄知道吗?急呀
zjfeng18
2018-06-23 17:54:19 +08:00
还没搞定!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/465208

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX