PHP中利用MS Office将docx文档以更近似样式转为PDF

PHP中, 将word文档转为PDF的方法有很多, 比如OpenOffice和LibreOffice等, 但这两种生成的PDF与原word文档差别较大;

目前找到转换效果比较好是用微软的Office来转.

具体步骤如下:

Step1 在Windows下配置好PHP环境, 如Apache+PHP, 可以使用集成环境, 如XAMPP

Step2 在Windows下安装Micrsoft Office 2010/2019

a. 其他版本Office暂未测试

b. 安装Microsoft Office 2007须另安装一个包: Microsoft Save as PDF

c. 也可使用WPS专业版, 但效果可能逊于MS Office

Step3 给PHP安装php_com_dotnet扩展

在php.ini中加入如下代码

extension=php_com_dotnet.dll

并且找到

com.allow_dcom = true
# 上面这行是true, 且去掉前面的分号

Step4 使用如下代码进行转换

<?php

word2pdf();
function word2pdf()
{
    $filenamedoc = dirname(__FILE__) . "/index.docx";
    $filenamepdf = dirname(__FILE__) . "/index.pdf";

    // 或者 
    // $dd = $word = new COM("KWPS.Application") or die("Could not initialise Object.");
    $dd = $word = new COM("Word.Application") or die("Could not initialise Object.");
    // set it to 1 to see the MS Word window (the actual opening of the document)
    $word->Visible = 0;
    // recommend to set to 0, disables alerts like "Do you want MS Word to be the default .. etc"
    $word->DisplayAlerts = 0;
    // open the word 2007-2013 document

    $word->Documents->Open($filenamedoc);
    // save it as word 2003
    // convert word 2007-2013 to PDF

    //判断要生成的文件名是否存在
    if (file_exists($filenamepdf)) {
        //存在就删除
        unlink($filenamepdf);
    }
    $word->ActiveDocument->ExportAsFixedFormat($filenamepdf, 17, false, 0, 0, 0, 0, 7, true, true, 2, true, true, false);
    // quit the Word process
    $word->Quit(false);
    // clean up
    unset($word);
    if (!function_exists('read_pdf')) {
        header('Content-type: application/pdf');
        header('filename=' . $filenamepdf);
        readfile($filenamepdf);
        read_pdf('Python_study.pdf');
    }
    echo 'ok';
}

当然, 要在同一目录下放一个index.docx的word文件

Windows Server 2008 R2下配置PHP7.4+Apache2.4

Step1 下载Apache httpd

1. 打开 https://www.apachelounge.com/download/

2.找到binaries下载, 如Apache 2.4 binaries VS16; 这里以64位的为例, 下载这个文件

httpd-2.4.46-win64-VS16.zip

3.解压缩这个zip文件, 得到文件夹Apache24; 这就是Apache, 将其放到你喜欢的位置如 C:\_server\Apache24

Step2 下载PHP

1. 打开https://windows.php.net/download

2.找到VC15 x64 Thread Safe, 下载Zip; 将其中的文件解压缩到一个空文件夹中, 如php74, 这就是PHP7.4

3.将php74放到你喜欢的位置, 放完之后的路径如C:\_server\php74

Step3 安装Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019

1.打开 https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

2.下载vc_redist.x64.exe, 然后安装

Step4 配置php.ini

1.打开那个php74文件夹,

2.找到php.ini-production文件, 并复制一份

3.将复制体改名为php.ini

4.打开php.ini, 找到语句

;extension_dir=ext

并改为

extension_dir = "C:/你喜欢的那个路径/php74/ext"

注意去掉前面的分号

注意在php.ini和下文的httpd.conf中都是用/代替\吧, 因为目前开源软件貌似更喜欢/这样式的

保存.

Step5 配置httpd.conf

1.打开如C:\_server\Apache24\conf\httpd.conf

2.找到LoadModule区域, 并补充如下代码, 用于连接Apache和PHP

LoadModule  php7_module 'C:/你喜欢的那个/php74/php7apache2_4.dll'
<IfModule php7_module>
    PHPIniDir 'C:/你喜欢的那个/php74/php.ini'        
    AddType application/x-httpd-php .php .html
</IfModule>

<VirtualHost *:80>
    ServerName www.test.com
    DocumentRoot "C:/wwwroot"
    DirectoryIndex index.html index.php

    <Directory "C:/wwwroot">
        Options -Indexes +FollowSymlinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

把上文中的www.test.com改成你绑定的域名;

c:/wwwroot改成你网站的运行目录;

80改成你们的端口

然后再httpd.conf中全文搜索c:/Apache24

并将其改为

c:/你喜欢的那个/Apache24

Step6 测试httpd

1. 在你的网站根目录下建立一个phpinfo.php文件, 内容如下

<?php
  phpinfo();

2.运行如C:\_server\apache24\bin\httpd.exe

3. 这是你在浏览器输入http://localhost:端口/phpinfo.php, 如果能打开你的网站说明之前的操作是有效的;

4.如果你刚才写的域名已经指向了服务器, 且服务器的安全组和防火墙放过了你的端口; 那么你也可以用http://你的域名:端口/phpinfo.php来看一下

Step7 将httpd注册为服务

1.在服务器的”计算机”上点右键->属性->高级系统设置->环境变量->找到如”Administrator的用户变量”里面的PATH->编辑

在变量值里, 不要删除原有的内容(删除可能导致系统混乱, 你可以先复制一份到别处); 在原有内容后继续添加上

;C:\你喜欢的\apache24\bin

然后确定,确定,确定

2. 开始->运行->输入cmd->回车

3.在cmd里运行

httpd -k install

来安装httpd服务

4.安装成功以后, 你就可以

::启动httpd服务
httpd -k start
::停止httpd服务
httpd -k stop
::重启httpd服务
httpd -k restart 

这样就安好了.