【问题标题】:Convert Word doc, docx and Excel xls, xlsx to PDF with PHP使用 PHP 将 Word doc、docx 和 Excel xls、xlsx 转换为 PDF
【发布时间】:2011-07-29 03:46:26
【问题描述】:

我正在寻找一种使用 PHP 将 Word 和 Excel 文件转换为 PDF 的方法。

这样做的原因是我需要能够将各种格式的文件合并到一个文档中。我知道,如果我能够将所有内容转换为 PDF,我就可以使用 PDFMerger(使用 fpdf)将 PDF 合并到一个文件中。

我已经能够从其他文件类型/图像创建 PDF,但我被 Word Docs 卡住了。 (我想我可能能够使用我已经用来从 html 代码创建 Excel 文件的 PHPExcel 库来转换 Excel 文件。

我不使用 Zend 框架,所以希望有人能够指出我正确的方向。

或者,如果有一种方法可以从 Word 文档创建图像 (jpg) 文件,那将是可行的。

【问题讨论】:

  • 试用 Google Documents API code.google.com/apis/documents
  • 当然,您需要将文件上传到 Google Cloud 和现有的 Google 帐户。
  • 遗憾的是,由于正在存储的数据,文件必须安全地存储在服务器上,并且不能传输到谷歌的服务器。
  • Google Documents API 3.0 现已弃用。他们已经搬到Google Drive API
  • 您找到解决方案了吗?

标签: php


【解决方案1】:

另一种方法是直接在 libreoffice 命令上使用参数:

libreoffice --convert-to pdf /path/to/file.{doc,docx}

- - - - - - - - - - - - 解释 - - - - - - - - - - - -

首先,您需要下载并安装 LibreOffice。可以从Here下载
现在打开您的终端/命令提示符,然后转到 libreOffice 根目录,对于 Windows,它可能是 OS/Program Files/LibreOffice/program 在这里您会找到一个可执行的 soffice.exe

在这里您可以直接通过上述命令进行转换,也可以使用:
soffice 代替 libreoffice

【讨论】:

  • 能否请您花点功夫解释一下流程?
  • 我从我的 cmd 提示符 'libreoffice' 无法识别为内部或外部命令、可运行程序或批处理文件。
  • 您需要安装 libreoffice,然后检查 libreoffice 可执行文件的位置。如果您在 Windows 中,您可能必须使用 libreoffice.exe --convert-to pdf /path/fo/file.odc
  • 感谢您的努力。我已经更新了答案。
【解决方案2】:

任何希望在 Ubuntu/linux 中使用 php 执行此操作的人 -

Ubuntu 默认安装了 libre office。任何人都可以使用 shell 命令来使用 headless libre office。

shell_exec('/usr/bin/libreoffice --headless --convert-to pdf:writer_pdf_Export --outdir /var/www/html/demo/public_html/src/var/output /var/www/html/demo/public_html/src/var/source/sample.doc');

希望它能帮助像我这样的人。

【讨论】:

    【解决方案3】:

    根据我的经验,最简单的方法是使用 Cloudmersive 免费的原生 PHP 库,只需调用 convertDocumentDocxToPdf:

    <?php
    require_once(__DIR__ . '/vendor/autoload.php');
    
    // Configure API key authorization: Apikey
    $config = Swagger\Client\Configuration::getDefaultConfiguration()->setApiKey('Apikey', 'YOUR_API_KEY');
    
    
    
    $apiInstance = new Swagger\Client\Api\ConvertDocumentApi(
    
    
        new GuzzleHttp\Client(),
        $config
    );
    $input_file = "/path/to/file.txt"; // \SplFileObject | Input file to perform the operation on.
    
    try {
        $result = $apiInstance->convertDocumentDocxToPdf($input_file);
        print_r($result);
    } catch (Exception $e) {
        echo 'Exception when calling ConvertDocumentApi->convertDocumentDocxToPdf: ', $e->getMessage(), PHP_EOL;
    }
    ?>
    

    确保将 $input_file 替换为适当的文件路径。如果您愿意,也可以将其配置为使用字节数组。结果将是转换后的 PDF 文件的字节数。

    【讨论】:

      【解决方案4】:

      对于特定于 PHP 的你可以试试PHPWord - 这个库是用纯 PHP 编写的,并提供了一组类来写入和读取不同的文档文件格式(包括 .doc 和 .docx)。主要缺点是转换后的文件质量参差不齐。

      或者,如果您想要更高质量的选项,您可以使用像Zamzar 这样的文件转换 API。您可以使用它将wide range 的办公格式(和其他格式)转换为 PDF,并且可以从任何平台(Windows、Linux、OS X 等)调用。

      转换文件的 PHP 代码如下所示:

      <?php
      $endpoint = "https://api.zamzar.com/v1/jobs";
      $apiKey = "API_KEY";
      $sourceFilePath = "/my.doc"; // Or docx/xls/xlsx etc
      $targetFormat = "pdf";
      
      $postData = array(
        "source_file" => $sourceFile,
        "target_format" => $targetFormat
      );
      
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $endpoint);
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
      curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
      curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_USERPWD, $apiKey . ":");
      $body = curl_exec($ch);
      curl_close($ch);
      
      $response = json_decode($body, true);
      print_r($response);
      ?>
      

      全面披露:我是 Zamzar API 的首席开发人员。

      【讨论】:

        【解决方案5】:

        1) 我正在使用 WAMP。

        2) 我已经安装了 Open Office(来自 apache http://www.openoffice.org/download/)。

        3) $output_dir = "C:/wamp/www/projectfolder/"; 这是我要创建输出文件的项目文件夹。

        4) 我已经把我的输入文件放在这里C:/wamp/www/projectfolder/wordfile.docx";

        然后我运行我的代码..(如下所示)

        <?php
            set_time_limit(0);
            function MakePropertyValue($name,$value,$osm){
            $oStruct = $osm->Bridge_GetStruct("com.sun.star.beans.PropertyValue");
            $oStruct->Name = $name;
            $oStruct->Value = $value;
            return $oStruct;
            }
            function word2pdf($doc_url, $output_url){
        
            //Invoke the OpenOffice.org service manager
            $osm = new COM("com.sun.star.ServiceManager") or die ("Please be sure that OpenOffice.org is installed.\n");
            //Set the application to remain hidden to avoid flashing the document onscreen
            $args = array(MakePropertyValue("Hidden",true,$osm));
            //Launch the desktop
            $oDesktop = $osm->createInstance("com.sun.star.frame.Desktop");
            //Load the .doc file, and pass in the "Hidden" property from above
            $oWriterDoc = $oDesktop->loadComponentFromURL($doc_url,"_blank", 0, $args);
            //Set up the arguments for the PDF output
            $export_args = array(MakePropertyValue("FilterName","writer_pdf_Export",$osm));
            //print_r($export_args);
            //Write out the PDF
            $oWriterDoc->storeToURL($output_url,$export_args);
            $oWriterDoc->close(true);
            }
        
            $output_dir = "C:/wamp/www/projectfolder/";
            $doc_file = "C:/wamp/www/projectfolder/wordfile.docx";
            $pdf_file = "outputfile_name.pdf";
        
            $output_file = $output_dir . $pdf_file;
            $doc_file = "file:///" . $doc_file;
            $output_file = "file:///" . $output_file;
            word2pdf($doc_file,$output_file);
            ?>
        

        【讨论】:

        • 我已经搜索了这个解决方案一个星期,我找到了一些 php 类(不是免费的),使用 zend 等。谢谢 Vineesh,它对我有用。您想分享一下,如何设置纸张尺寸、边距和其他打印设置。 *对不起,我的英语。
        • 在linux中我们如何安装以及它如何与linux apace2一起工作?
        • @Vineesh 错误 - 找不到合适的窗口系统,正在退出。
        【解决方案6】:

        经过这么多的谷歌搜索,我找到了一些解决方案。累了也可以尝试一下,寻找好的解决方案。

        常见使用 SOAP API

        您需要用户名和密码才能发出 SOAP 请求 https://www.livedocx.com

        使用这个进行注册 https://www.livedocx.com/user/account_registration.aspx 并按照相应的步骤操作。

        在您的 .php 文件中使用以下代码。

        ini_set ('soap.wsdl_cache_enabled', 0);
        
        // you will get this username and pass while register
        define ('USERNAME', 'Username'); 
        define ('PASSWORD', 'Password');
        
        // SOAP WSDL endpoint
        define ('ENDPOINT', 'https://api.livedocx.com/2.1/mailmerge.asmx?wsdl');
         
        // Define timezone
        date_default_timezone_set('Europe/Berlin');
        $soap = new SoapClient(ENDPOINT);
        $soap->LogIn(
            array(
                'username' => USERNAME,
                'password' => PASSWORD
            )
        );
        $data = file_get_contents('test.doc');
        $soap->SetLocalTemplate(
            array(
                'template' => base64_encode($data),
                'format'   => 'doc'
            )
        );
        $soap->CreateDocument();
        $result = $soap->RetrieveDocument(
            array(
                'format' => 'pdf'
            )
        );
        $data = $result->RetrieveDocumentResult;
        file_put_contents('tree.pdf', base64_decode($data));
        $soap->LogOut();
        unset($soap);
        

        点击此链接了解更多信息http://www.phplivedocx.org/

        对于 Ubuntu

        需要安装 OpenOffice 和 Unoconv。

        从命令提示符

        apt-get remove --purge unoconv
        git clone https://github.com/dagwieers/unoconv
        cd unoconv
        sudo make install
        

        现在在您的 PHP 脚本中添加以下代码并确保文件应该是可执行的。

        shell_exec('/usr/bin/unoconv -f pdf  folder/test.docx');
        shell_exec('/usr/bin/unoconv -f pdf  folder/sachin.png');
        

        希望此解决方案对您有所帮助。

        【讨论】:

          【解决方案7】:

          步骤 1. 在您的系统中安装“Apache_OpenOffice_4.1.2” 第 2 步。从 github 或其他任何地方下载“unoconv”库。

          -> C:\Program Files (x86)\OpenOffice 4\program\python.exe = open office 安装目录路径

          -> D:\wamp\www\doc_to_pdf\libobasis4.4-pyuno\unoconv = 库文件夹路径

          -> D:/wamp/www/doc_to_pdf/files/'.$pdf_File_name.' = pdf的路径和文件名

          -> D:/wamp/www/doc_to_pdf/files/'.$doc_file_name = 文档文件的路径。

          如果 pdf 未创建,则最后一步是 转到->控制面板\所有控制面板项目\管理工具->服务->找到“wampapache”->右键单击并单击属性->单击登录选项卡,然后选中允许服务与桌面交互的复选框

          创建示例 .php 文件并放入以下代码并在 wamp 或 xampp 服务器上运行

          $result = exec('"C:\Program Files (x86)\OpenOffice 4\program\python.exe" D:\wamp\www\doc_to_pdf\libobasis4.4-pyuno\unoconv -f pdf -o D:/wamp/www/doc_to_pdf/files/'.$pdf_File_name.' D:/wamp/www/doc_to_pdf/files/'.$doc_file_name);
          

          此代码在 windows-8 操作系统中为我工作

          【讨论】:

          • 很好,适合我。
          【解决方案8】:

          当谈到主题词 2007 docx、词 97-2004 docpdf 和所有其他类型的 MS Office 希望“从 y 转换为 z”时,我的 2 美分但实际上他们不想成为”。根据我目前的经验,不能依赖 LibreOffice 或 OpenOffice 的转换。尽管.doc 文档往往比word 2007 的.docx 得到更好的支持。一般来说,在不破坏任何东西的情况下,很难将.docx 转换为.doc

          .docx 对于.doc 不是二进制的模板也往往非常有用。

          .doc 到 PDF 的转换在大多数情况下都非常可靠。如果您仍然可以影响 word 文档的设计或内容,那么这可能会令人满意,但在我的情况下,文档是由外国公司提供的,即使在生成 .docx 模板之后,在某些情况下,生成的 .docx 必须在生成 PDF 之前,用补充文本稍微修改一下。


          基于 Windows!

          所有这些问题让我得出结论,我发现的唯一真正可靠的转换方法是在 PHP 中使用 COM 类,让 MS Word 或 Excel 应用程序为您完成所有工作。我将仅举一个将.docx 转换为.doc 和/或PDF 的示例。如果您没有安装 MS Office,您可以下载 60 天的trial 版本,这将为您提供足够的空间进行测试。

          默认情况下,COM.net 扩展名在 php.ini 中被注释掉,只需搜索行 php_com_dotnet.dll 并像这样取消注释

            extension=php_com_dotnet.dll
          

          重启网络服务器(IIS 不是 pre,Apache 也可以)。

          下面的代码演示了它的简单性。

            $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('yourdocument.docx');
            // save it as word 2003
            $word->ActiveDocument->SaveAs('newdocument.doc');
            // convert word 2007-2013 to PDF
            $word->ActiveDocument->ExportAsFixedFormat('yourdocument.pdf', 17, false, 0, 0, 0, 0, 7, true, true, 2, true, true, false);
            // quit the Word process
            $word->Quit(false);
            // clean up
            unset($word);
          

          这只是一个小演示。我只能说,如果涉及到转换,这是我可以使用甚至推荐的唯一真正可靠的选择。

          【讨论】:

          • 这对我来说在本地 Xampp 上运行良好,扩展名为:php_com_dotnet.dll 已启用。但是当我上线时,我怀疑我需要在 Windows 主机上进行 COM 扩展。所以这可能是共享主机的问题。
          • @shasi 共享托管环境不适用于此类解决方案,并且很少适合任何需要自定义标准化的解决方案。您不仅需要 PHP 中的 COM 扩展,还需要同一主机上的 Word 可执行文件。
          • Word 可执行文件是什么意思?
          • @shasi 申请的话 ;)
          • 非常感谢。我在 Windows 上运行 PHP。 “基于WINDOWS”的解决方案工作正常。
          【解决方案9】:

          基于 Open Office / LibreOffice 的解决方案可以做得很好,但如果您的 PDF 是在 MS-Office 中创建的,则不要期望它们与您的源文件相似。与原件 90% 相似的 PDF 在许多领域都被认为是不可接受的。

          确保您的 PDF 看起来与原始文件完全相同的唯一方法是使用在后台使用官方 MS-Office DLL 的解决方案。如果您在非基于 Windows 的服务器上运行 PHP 解决方案,那么它需要额外的 Windows 服务器。这可能是一个很好的选择,但如果您真的关心 PDF 的外观和感觉,您可能没有选择。

          看看this blog post。它展示了如何使用 PHP 以高保真度转换 MS-Office 文件。

          免责声明:我写了这篇博文并从事过相关的商业产品,所以请认为我有偏见。但是,对于与我一起工作的 PHP 人员来说,这似乎是一个很好的解决方案。

          【讨论】:

            【解决方案10】:

            我找到了解决问题的方法,并在收到请求后将其发布在此处以帮助其他人。抱歉,如果我错过了任何细节,我已经有一段时间没有研究这个解决方案了。

            首先需要在服务器上安装Openoffice.org。我要求我的托管服务提供商在我的 VPS 上安装开放式办公室 RPM。这可以通过 WHM 直接完成。

            现在服务器具有处理 MS Office 文件的能力,您可以通过 PHP 执行命令行指令来转换文件。为了解决这个问题,我找到了 PyODConverterhttps://github.com/mirkonasato/pyodconverter

            我在服务器上创建了一个目录并将 PyODConverter python 文件放在其中。我还在 Web 根目录上方创建了一个纯文本文件(我将其命名为“adocpdf”),其中包含以下命令行说明:

            directory=$1
            filename=$2
            extension=$3
            SERVICE='soffice'
            if [ "`ps ax|grep -v grep|grep -c $SERVICE`" -lt 1 ]; then 
            unset DISPLAY
            /usr/bin/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard & 
            sleep 5s
            fi
            python /home/website/python/DocumentConverter.py /home/website/$directory$filename$extension /home/website/$directory$filename.pdf
            

            这会检查 openoffice.org 库是否正在运行,然后调用 PyODConverter 脚本来处理文件并将其输出为 PDF。前三行的 3 个变量是在使用 PHP 文件执行脚本时提供的。延迟(“睡眠 5 秒”)用于确保 openoffice.org 有足够的时间在需要时启动。我已经用了几个月了,5s 的间隔似乎给了足够的喘息空间。

            脚本将在与原始文件相同的目录中创建文档的 PDF 版本。

            最后,在 PHP 中启动 Word/Excel 文件的转换(我将它放在一个检查我们正在处理的文件是否为 word/excel 文档的函数中)...

            //use openoffice.org
            $output = array();
            $return_var = 0;
            exec("/opt/adocpdf {$directory} {$filename} {$extension}", $output, $return_var);
            

            一旦 Word/Excel 文件上传到服务器,就会调用这个 PHP 函数。 exec() 调用中的 3 个变量与上面纯文本脚本开头的 3 个变量直接相关。请注意,如果要转换的文件位于 Web 根目录中,则 $directory 变量不需要前导正斜杠。

            好的,就是这样!希望这对某人有用,并为他们节省我面临的困难和学习曲线。

            【讨论】:

            • 也可以尝试 unoconv 做同样的事情,但打包到 Ubuntu/Debian 中。
            • 嗨,你能告诉我如何通过 WHM 安装 Openoffice 吗?
            • 在你的PHP中,如果我们想手动输入文件怎么办?
            【解决方案11】:

            我成功地将 libreoffice 的便携式版本放在主机的网络服务器上,我用 PHP 调用它来执行从 .docx 等到 pdf 的命令行转换。在飞行中。我在主机的网络服务器上没有管理员权限。这是我所做的博客文章:

            http://geekswithblogs.net/robertphyatt/archive/2011/11/19/converting-.docx-to-pdf-or-.doc-to-pdf-or-.doc.aspx

            耶!使用 PHP 和 LibreOffice(OpenOffice 的继任者)直接从 .docx 或 .odt 转换为 .pdf!

            【讨论】:

            • 这种方法适合共享主机吗?
            • 是的。这就是我使用的。
            【解决方案12】:

            你试过http://www.phpdocx.com/吗?另外,它也可以托管在您的服务器上。

            【讨论】:

            • 免费版有一些限制,比如每分钟20个请求,每天250个文档,因此它只适合中低使用率。
            • mmm 只是说,但这对我来说不是 serius,从前面提到的链接许可“注释”:“*1 年支持可能不超过我们支持团队的 8 张票。每张票的时间不得超过1小时的工作。”来源:phpdocx.com/subscriptions
            • phpdocx 使用 OpenOffice
            猜你喜欢
            • 2015-09-05
            • 1970-01-01
            • 2021-01-27
            • 2016-11-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多