Windows下如何搭建Office文件转PDF服务

2021-06-28  本文已影响0人  hinsideout
后续:没什么卵用,转换速度太慢了叼

一. 本文采用环境为:

1. PHP 7.3.4nts
2. Apache 2.4.39
3. Windows 10 x64
4. OpenOffice 4.10

二. OpenOffice安装部署

1. 去官网 ( http://www.openoffice.org )下载4.10版本,然后正常安装即可,一般建议不要装到C盘吧?。
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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读