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

时间:2011-04-04 12:39:19

标签: php excel ms-word pdf-generation

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

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

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

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

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

感谢您的帮助!

12 个答案:

答案 0 :(得分:20)

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

首先需要在服务器上安装 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

这将检查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);

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

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

答案 1 :(得分:16)

对于主题词2007 docx,单词97-2004 docpdf和所有其他类型的MS Office,希望“转换自{{ {1}}到y但实际上他们不想成为“。根据我迄今为止的经验,不能依赖使用LibreOffice或OpenOffice进行转换。虽然z文档往往比word 2007 .doc更受支持。一般来说,很难将.docx转换为.docx而不会破坏任何内容。

对于.doc不是二进制文件的模板,

.docx也非常有用。

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


基于WINDOWS!

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

默认情况下,.docx中注释了COM.net扩展程序,只搜索行.doc并将其取消注释

php.ini

重新启动Web服务器(IIS不是预先安装的,Apache也可以正常工作)。

下面的代码演示了它是多么容易。

php_com_dotnet.dll

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

答案 2 :(得分: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);
    ?>

答案 3 :(得分:8)

我成功地将可移植版本的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!

答案 4 :(得分:4)

基于Office / LibreOffice的开放式解决方案可以很好地完成工作,但如果它们是在MS-Office中创建的,那么不要指望您的PDF类似于源文件。在许多领域中,看起来像原始文件的90%的PDF不被认为是可接受的。

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

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

免责声明:我撰写此博客文章并撰写相关商业产品,因此请考虑我偏见。但是,它似乎是我工作的PHP人员的一个很好的解决方案。

答案 5 :(得分:3)

步骤1.安装&#34; Apache_OpenOffice_4.1.2&#34;在你的系统中 第2步。下载&#34; unoconv&#34;来自github或其他任何地方的图书馆。

  

- &GT; C:\ Program Files(x86)\ OpenOffice 4 \ program \ python.exe =开放式办公室安装目录的路径

     

- &GT; D:\ wamp \ www \ doc_to_pdf \ libobasis4.4-pyuno \ unoconv =库文件夹的路径

     

- &GT; d:/ WAMP / WWW / doc_to_pdf /文件/&#39; $ pdf_File_name&#39; = pdf的路径和文件名

     

- &GT; D:/ wamp / www / doc_to_pdf / files /&#39;。$ doc_file_name =文档文件的路径。

如果没有创建pdf而不是最后一步 转到 - &gt;控制面板\所有控制面板项目\管理工具 - &gt;服务 - &GT;找到&#34; wampapache&#34; - &GT;右键单击并单击属性 - &gt;单击登录选项卡然后选中允许服务与桌面交互的复选框

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

答案 6 :(得分:1)

经过这么多谷歌搜索,我找到了一些解决方案。如果厌倦了你也可以尝试寻找一个好的解决方案。

常见的使用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 :(得分:0)

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

答案 8 :(得分:0)

对于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的首席开发人员。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

根据我的经验,最简单的方法是使用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文件的字节。

答案 11 :(得分:0)

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

Ubuntu默认情况下安装了libre office。任何人都可以使用shell命令来使用无头的免费办公室。

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');

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