通过之前的总结,命令行上进行 word转换pdf没有问题,今天整合到php项目中,出现了一些问题,做个总结:
1.在php中需要调用系统命令,先查看手册,查找系统函数:
http://php.net/manual/zh/book.exec.php
可知,支持的函数有:
exec()
passthru()
system()
shell_exec() == 执行运算符(``),例如:
$output = shell_exec('ls -l');
$output = echo `ls -l`;
2.在php中需要调用系统命令,出于安全因素,一般禁用,我们需要开启
php --ini // 查看加载的配置文件,主要是 php.ini
disable_functions中去除我们想执行的系统函数
重启php-fpm,使用配置生效
3.这里选择 'exec()' 函数,感觉比较合适。下面描述下,代码里碰到的几个坑:
命令行运行:java -jar /data/download/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar 董学敏简历.doc 董学敏简历.pdf
是没有问题的!
1>复制过来直接用
$command = 'java -jar /data/download/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar 董学敏简历.doc 董学敏简历.pdf';
exec($command, $output, $return_var);
dump($command);
dump($output); // 输出 []
dd($return_var); // 输出 127
/*
127 - 错误代码原因:
找不到命令
想到 'java' 命令,未写系统路径,然而 'ls' 命令有效,不用全路径
*/
/*
这里引入非常关键的一个知识:
Linux Shell Exit And Exit Code(我描述的汉语式英语可能不对。。。)
网上搜索到几篇:
http://www.faqs.org/docs/abs/HTML/exit-status.html
http://www.virtsync.com/c-error-codes-include-errno(这个不知道准不准)
可以分析错误代码原因
*/
2.修改全路径后
$command = '/usr/java/default/bin/java -jar /data/download/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar 董学敏简历.doc 董学敏简历.pdf';
exec($command, $output, $return_var);
dump($command);
dump($output); // 输出 []
dd($return_var); // 输出 1
/*
1 - 错误代码:
'我真的不太清楚。。。'
*/
/*
继续搜索,关于 'exec()' 调试的一个方案:
exec()本身会将输出返回到 $output 参数,但是不是错误不输出???
所以这里的方案就是将 '标准错误输出' 输出给 '标准输出'
命令后追加:
' > 2&1'
*/
3.开启调试后
$command = '/usr/java/default/bin/java -jar /data/download/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar 董学敏简历.doc 董学敏简历.pdf > 2&1';
exec($command, $output, $return_var);
dump($command);
dump($output); // 输出 []
/*
array:10 [▼
0 => "Dec 18, 2017 4:25:13 PM com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection connect"
1 => "INFO: connected"
2 => "Dec 18, 2017 4:25:13 PM com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection disposing"
3 => "INFO: disconnected"
4 => "Exception in thread "main" java.lang.IllegalArgumentException: inputFile doesn't exist: /data/download/??????????????????.doc"
5 => "\tat com.artofsolving.jodconverter.openoffice.converter.AbstractOpenOfficeDocumentConverter.convert(AbstractOpenOfficeDocumentConverter.java:90)"
6 => "\tat com.artofsolving.jodconverter.openoffice.converter.AbstractOpenOfficeDocumentConverter.convert(AbstractOpenOfficeDocumentConverter.java:74)"
7 => "\tat com.artofsolving.jodconverter.openoffice.converter.AbstractOpenOfficeDocumentConverter.convert(AbstractOpenOfficeDocumentConverter.java:70)"
8 => "\tat com.artofsolving.jodconverter.cli.ConvertDocument.convertOne(ConvertDocument.java:154)"
9 => "\tat com.artofsolving.jodconverter.cli.ConvertDocument.main(ConvertDocument.java:133)"
]
*/
dd($return_var); // 输出 1
/*
可以看到调试错误了:
输入文件名,不存在。因为中文变为乱码的问题!
*/
/*
我换成英文就OK了,我们确实可以通过代码,修改机制,还借助英文来处理下,但是有点麻烦,不是我们想要的。
解决方法:
1.exec()先执行
'export LANG=en_US.UTF-8;'
2.
$locale = 'zh_CN.UTF-8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);
(看来应该就是非 UTF-8 编码的问题)
参考资料:
https://mikecoder.cn/?post=135
https://segmentfault.com/q/1010000004623093/
*/
4.指定字符集后
$set_charset = 'export LANG=en_US.UTF-8;';
$command = '/usr/java/default/bin/java -jar /data/download/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar 董学敏简历.doc 董学敏简历.pdf > 2&1';
exec($set_charset . $command, $output, $return_var);
dump($set_charset . $command);
dump($output); // 输出 []
/*
// 第一种设置显示
array:4 [▼
0 => "Dec 18, 2017 4:45:17 PM com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection connect"
1 => "INFO: connected"
2 => "Dec 18, 2017 4:45:17 PM com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection disposing"
3 => "INFO: disconnected"
]
// 第二种设置显示
array:4 [▼
0 => "十二月 18, 2017 4:37:33 下午 com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection connect"
1 => "信息: connected"
2 => "十二月 18, 2017 4:37:33 下午 com.artofsolving.jodconverter.openoffice.connection.AbstractOpenOfficeConnection disposing"
3 => "信息: disconnected"
]
*/
dd($return_var); // 输出 0
PDF预览之word、excel、ppt转换为pdf,PHP内通过exec()调用笔记.txt
最新推荐文章于 2024-06-25 18:05:06 发布