后续:没什么卵用,转换速度太慢了叼
一. 本文采用环境为:
1. PHP 7.3.4nts
2. Apache 2.4.39
3. Windows 10 x64
4. OpenOffice 4.10
二. OpenOffice安装部署
2. 安装完后配置下openoffice系统权限
3. cmd到安装目录下的program文件夹,执行如下命令启动服务,启动后去任务管理器看看有没有启动成功 :
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
三. 开启PHP相关扩展
1. 开启 com.allow_dcom = true
2. 开启 extension=php_com_dotnet.dll
3. 重启服务器
四. 在你的PHP项目下新建一个工具类 Office2Pdf,然后在想要调用的地方运行即可,注意命名空间等引用就行,基本细节来的。
// 第一个参数的项目下的原存储路径,第二个参数是文件保存名
$pdfname = Office2Pdf::run('public/storage/', $savename);
<?php
// 这个是我自己项目的命名空间,看情况改成自己的就行
namespace Tools;
class Office2Pdf
{
private static $osm;
public static function init()
{
self::$osm = new \COM("com.sun.star.ServiceManager") or
die ("Please be sure that OpenOffice.org is installed.n");
}
public static function MakePropertyValue($name, $value)
{
$oStruct = self::$osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
$oStruct->Name = $name;
$oStruct->Value = $value;
return $oStruct;
}
public static function transform($input_url, $output_url)
{
$args = array(self::MakePropertyValue("Hidden", true));
$oDesktop = self::$osm->createInstance("com.sun.star.frame.Desktop");
$oWriterDoc = $oDesktop->loadComponentFromURL($input_url, "_blank", 0, $args);
$export_args = array(self::MakePropertyValue("FilterName", "writer_pdf_Export"));
$oWriterDoc->storeToURL($output_url, $export_args);
$oWriterDoc->close(true);
return self::getPdfPages($output_url);
}
/**
* 获取PDF文件页数的函数获取
* 文件应当对当前用户可读(linux下)
* @param [string] $path [文件路径]
* @return int
*/
public static function getPdfPages($path)
{
if (!file_exists($path)) return 0;
if (!is_readable($path)) return 0;
// 打开文件
$fp = @fopen($path, "r");
if (!$fp) {
return 0;
} else {
$max = 0;
while (!feof($fp)) {
$line = fgets($fp, 255);
if (preg_match('/\/Count [0-9]+/', $line, $matches)) {
preg_match('/[0-9]+/', $matches[0], $matches2);
if ($max < $matches2[0]) $max = $matches2[0];
}
}
fclose($fp);
// 返回页数
return $max;
}
}
/*
* func_name:将office转成pdf
* author:ye
* time:2021/6/28 17:34
*
* 1. 路径后面要带文件类型
*
*/
public static function run($savepath, $savename)
{
$savepath = app()->getRootPath() . $savepath;
$data = explode('.', $savename);
array_pop($data);
$pdfname = implode('.', $data);
$pdfname = $pdfname . '.pdf';
$file_url = "file:///" . str_replace("\\", "/", $savepath . $savename);
$pdf_url = "file:///" . str_replace("\\", "/", $savepath . $pdfname);
self::init();
$pages = self::transform($file_url, $pdf_url);
if($pages > 0) return $pdfname;
return false;
}
}