使用PHP将Word doc,docx和Excel xls,xlsx转换为PDF

sau*_*sel 33 php excel pdf-generation ms-word

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

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

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

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

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

谢谢你的帮助!

sau*_*sel 22

我找到了解决问题的方法,并在提出请求后将其发布在此处以帮助其他人.如果我错过任何细节,我会道歉,自从我开始研究这个解决方案以来已经有一段时间了.

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

既然服务器具有处理MS Office文件的能力,您就可以通过PHP执行命令行指令来转换文件.为了解决这个问题,我找到了PyODConverter:https://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
Run Code Online (Sandbox Code Playgroud)

这将检查openoffice.org库是否正在运行,然后调用PyODConverter脚本来处理该文件并将其作为PDF输出.当使用PHP文件执行脚本时,将提供前三行中的3个变量.延迟("睡眠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);
Run Code Online (Sandbox Code Playgroud)

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

好的,就是这样!希望这对某人有用,并为他们解决我遇到的困难和学习曲线.

  • 也尝试`unoconv`做同样的事情,但打包成Ubuntu/Debian. (4认同)

dbf*_*dbf 16

当我谈到主题词2007 docx,单词97-2004 doc,pdf以及所有其他类型的MS Office希望"转换yz但实际上他们不想成为" 时,我的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天的试用版,这样可以为测试提供足够的空间.

COM.net扩展默认在注释中php.ini,只搜索该行php_com_dotnet.dll并取消注释它

  extension=php_com_dotnet.dll
Run Code Online (Sandbox Code Playgroud)

重新启动Web服务器(IIS不是预先的,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);
Run Code Online (Sandbox Code Playgroud)

这只是一个小小的示范.我可以说,如果涉及转换,这是我可以使用甚至推荐的唯一真正可靠的选项.

  • @shasi共享托管环境不适用于此类解决方案,很少适用于需要自定义标准化的任何解决方案.您不仅需要PHP中的COM扩展,还需要同一主机上的Word可执行文件. (3认同)

Vin*_*kal 10

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);
    ?>
Run Code Online (Sandbox Code Playgroud)


Rob*_*att 8

我成功地在我的主机的web服务器上放了一个可移植版本的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!


Jer*_*jer 5

基于 Open Office / LibreOffice 的解决方案会做的不错,但如果 PDF 是在 MS-Office 中创建的,则不要指望它们与源文件相似。看起来与原始文件 90% 相似的 PDF 在许多领域被认为是不可接受的。

确保您的 PDF 看起来与原件完全一样的唯一方法是使用一种在幕后使用官方 MS-Office DLL 的解决方案。如果您在非基于 Windows 的服务器上运行 PHP 解决方案,则需要额外的 Windows Server。这可能是一个亮点,但如果您真的关心 PDF 的外观和感觉,您可能没有选择。

看看这篇博文。它展示了如何使用 PHP 以高保真度转换 MS-Office 文件。

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