我正在寻找一种使用PHP将Word和Excel文件转换为PDF的方法。
原因是,我需要能够将各种格式的文件合并到一个文档中。我知道如果我能将所有内容转换为PDF,我可以使用PDFMerger(使用fpdf)将PDF合并到一个文件中。
我已经能够从其他文件类型/图像创建PDF,但我仍然坚持使用Word Docs。 (我想我可能能够使用我已经用来从html代码创建Excel文件的PHPExcel库转换Excel文件。)
我不使用Zend Framework,所以我希望有人能指出我正确的方向。
或者,如果有办法从Word文档创建图像(jpg)文件,那将是可行的。
感谢您的帮助!
答案 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 doc
,pdf
和所有其他类型的MS Office,希望“转换自{{ {1}}到y
但实际上他们不想成为“。根据我迄今为止的经验,不能依赖使用LibreOffice或OpenOffice进行转换。虽然z
文档往往比word 2007 .doc
更受支持。一般来说,很难将.docx
转换为.docx
而不会破坏任何内容。
.doc
不是二进制文件的模板, .docx
也非常有用。
从.doc
到PDF的转换大部分时间都非常可靠。如果您仍然可以影响word文档的设计或内容,那么这可能会令人满意,但在我的情况下,文档是由外国公司提供的,即使在生成.doc
模板之后,在某些情况下,生成的{{1在将补充文本生成为PDF之前,必须稍微修改补充文本。
所有这些打嗝让我得出的结论是,我发现唯一真正可靠的转换方法是在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的命令行转换。在飞行中。我在主持人的网络服务器上没有管理员权限。以下是我所做的博客文章:
耶!使用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请求 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/
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');
希望它对像我这样的人有帮助。