PDF预览之word、excel、ppt转换为pdf,PHP内通过exec()调用笔记.txt

通过之前的总结,命令行上进行 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值