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

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

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

我已经能够从其他文件types/图像创buildPDF,但是坚持使用Word文档。 (我想我可能会转换Excel文件使用PHPExcel库,我已经使用从HTML代码创buildExcel文件)。

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

或者,如果有办法从Word文档创build图像(jpg)文件,那将是可行的。

感谢您的帮助!

我find了一个解决我的问题,并在请求后,将其发布在这里帮助别人。 如果我错过了任何细节,我感到抱歉,自从我研究这个解决scheme以来已经有一段时间了。

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

既然服务器具有处理MS Office文件的能力,那么您可以通过PHP执行命令行指令来转换文件。 为了解决这个问题,我find了PyODConverter : https : //github.com/mirkonasato/pyodconverter

我在服务器上创build了一个目录,并在其中放置了PyODConverter python文件。 我还在web根目录上创build了一个纯文本文件(我将其命名为“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个variables是在用PHP文件执行脚本时提供的。 延迟(“sleep 5s”)用于确保openoffice.org有足够的时间来启动,如果需要的话。 我已经用了几个月了,5秒的差距似乎给了足够的喘息空间。

该脚本将在与原始目录相同的目录中创buildPDF版本的文档。

最后,从PHP内部启动一个Word / Excel文件的转换(我有一个函数来检查我们正在处理的文件是word / excel文件)…

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

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

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

那么我的2美分,当涉及到主题词2007 docx ,Word 97-2004 docpdf和所有其他types的MS Office希望“从y转换到z但在实际上,他们不想成为”。 根据我迄今为止的经验,不能依赖LibreOffice或OpenOffice的转换。 尽pipe.doc文件比2007版的.docx更好。 一般来说,很难将.docx转换为.doc而不会破坏任何东西。

.docx对于模板而言也非常有用,其中.doc不是二进制的。

.doc到PDF的转换大部分时间都相当可靠。 如果您仍然可以影响word文档的devise或内容,那么这可能是令人满意的,但在我的情况下,文档是由外国公司提供的,即使在生成.docx模板之后,在某些情况下,生成的.docx也必须稍微在将其生成为PDF之前用补充文本进行修改。


基于WINDOWS!

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

COM.net的扩展名是默认在php.ini注释掉的,只要searchphp_com_dotnet.dll这一行就可以像这样取消注释

  extension=php_com_dotnet.dll 

重新启动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); 

这只是一个小示范。 我只能说,如果说到转换,这是我可以使用,甚至build议的唯一真正可靠的select。

我成功地将一个可移植版本的libreoffice放在我的主机的web服务器上,我使用PHP来调用.docx等格式的命令行转换为pdf。 在飞行中。 我没有在我的主机的networking服务器上的pipe理员权限。 这是我的博客文章:

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!

1)我正在使用WAMP。

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

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

4)我已经把我的input文件放在这里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); ?> 

基于Open Office / LibreOffice的解决scheme可以做一个好的工作,但是不要指望你的PDF与MS-Office中创build的源文件相似。 看起来像原文90%的PDF在很多领域都不被认为是可以接受的。

确保你的PDF看起来和原始文件完全一样的唯一方法是使用一个使用官方MS-Office DLL的解决scheme。 如果您在非基于Windows的服务器上运行PHP解决scheme,则需要额外的Windows Server。 这可能是一个不错的select,但是如果你真的关心你的PDF的外观和感觉,你可能没有select。

看看这个博客文章 。 它显示了如何使用PHP以高水平的保真度转换MS-Office文件。

免责声明:我写了这个博客文章,并在相关的商业产品,所以认为我有偏见。 不过,对于我所使用的PHP人来说,这似乎是一个很好的解决scheme。

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

– > C:\ Program Files(x86)\ OpenOffice 4 \ program \ python.exe =打开办公室安装目录的path

– > D:\ wamp \ www \ doc_to_pdf \ libobasis4.4-pyuno \ unoconv =库文件夹的path

– > D:/ wamp / www / doc_to_pdf / files /'.$ pdf_File_name。' = pdf的path和文件名

– > D:/ wamp / www / doc_to_pdf / files /'.$ doc_file_name =文档文件的path。

如果没有创build的最后一步的PDF是转到 – >控制面板\所有控制面板项目\pipe理工具 – >服务 – >find“wampapache” – >右键单击属性 – >单击login选项卡上勾选checkbox允许服务与桌面交互

创build示例.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操作系统中为我工作

经过这么多的search,我find了一些解决办法。 你也可以尝试一下,如果累了,寻找一个好的解决scheme。

常用的使用SOAP API

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

使用此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'); 

希望这个解决scheme能帮助你

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

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

另外,如果你想要更高质量的选项,你可以使用像Zamzar这样的文件转换API。 您可以使用它将各种办公格式(和其他格式)转换为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的首席开发人员。