Конвертировать Word doc, docx и Excel xls, xlsx в PDF с PHP
Я ищу способ конвертировать файлы Word и Excel в PDF с использованием PHP.
Причина этого в том, что мне нужно объединить файлы разных форматов в один документ. Я знаю, что если мне удастся преобразовать все в PDF, я смогу затем объединить PDF-файлы в один файл, используя PDFMerger (который использует fpdf).
Я уже могу создавать PDF-файлы из других типов файлов / изображений, но я застрял в Word Docs. (Я думаю, что, возможно, я смогу конвертировать файлы Excel, используя библиотеку PHPExcel, которую я уже использую для создания файлов Excel из HTML-кода).
Я не использую Zend Framework, поэтому надеюсь, что кто-то сможет указать мне правильное направление.
В качестве альтернативы, если есть способ создания файлов изображений (jpg) из документов Word, это будет работать.
Спасибо за любую помощь!
10 ответов
Я нашел решение своей проблемы и после запроса опубликую его здесь, чтобы помочь другим. Извините, если я пропустил какие-либо детали, прошло много времени с тех пор, как я работал над этим решением.
Первое, что требуется, это установить Openoffice.org на сервер. Я попросил моего хостинг-провайдера установить RPM с открытым офисом на моем VPS. Это можно сделать через WHM напрямую.
Теперь, когда сервер имеет возможность обрабатывать файлы MS Office, вы можете конвертировать файлы, выполняя инструкции командной строки через PHP. Чтобы справиться с этим, я нашел PyODConverter: https://github.com/mirkonasato/pyodconverter
Я создал каталог на сервере и поместил в него Python-файл PyODConverter. Я также создал простой текстовый файл над корнем сети (я назвал его "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-версию документа в том же каталоге, что и оригинал.
Наконец, инициация преобразования файла Word / Excel из PHP (у меня есть функция, которая проверяет, является ли файл, с которым мы имеем дело, документом Word / Excel)...
//use openoffice.org
$output = array();
$return_var = 0;
exec("/opt/adocpdf {$directory} {$filename} {$extension}", $output, $return_var);
Эта функция PHP вызывается после загрузки файла Word / Excel на сервер. Три переменные в вызове exec() напрямую связаны с тремя переменными в начале простого текстового сценария выше. Обратите внимание, что переменная $ directory не требует прямой косой черты, если файл для преобразования находится в корневом веб-каталоге.
ОК, вот и все! Надеюсь, это будет кому-то полезно и спасет от трудностей и кривой обучения, с которыми я столкнулся.
Ну, мои 2 цента, когда речь заходит о теме слова 2007 docx
Слово 97-2004 doc
, pdf
и все другие типы MS Office, желающие быть "преобразованы из y
в z
но на самом деле они не хотят ". По моему опыту, на преобразование с LibreOffice или OpenOffice нельзя полагаться. Хотя .doc
документы, как правило, лучше поддерживаются, чем Word 2007 .docx
, Вообще очень сложно конвертировать .docx
в .doc
ничего не нарушая.
.docx
также имеют тенденцию быть чрезвычайно полезными для шаблонов, где .doc
не для того, чтобы быть двоичным.
Преобразование из .doc
Чтобы PDF был большую часть времени достаточно надежным. Если вы все еще можете повлиять на дизайн или содержание документа word, то это может быть удовлетворительным, но в моей ситуации документы были предоставлены от иностранных компаний, где даже после создания .docx
шаблоны, в некоторых сценариях, сгенерированные .docx
пришлось немного изменить с добавлением текста, прежде чем он был создан в PDF.
ОКНА ОСНОВАНЫ!
Весь этот сбой заставил меня прийти к выводу, что единственный действительно надежный метод преобразования, который я нашел, - это использование класса COM в PHP и позволить приложению MS Word или Excel сделать всю работу за вас. Я просто приведу пример конвертации .docx
в .doc
и / или PDF. Если у вас не установлен MS Office, вы можете загрузить пробную версию на 60 дней, что даст вам достаточно места для тестирования.
расширение COM.net по умолчанию закомментировано в php.ini
просто найдите строку php_com_dotnet.dll
и раскомментируйте это так
extension=php_com_dotnet.dll
Перезапустите веб-сервер (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);
Это всего лишь маленькая демонстрация. Я могу просто сказать, что если речь идет о конверсии, это был единственный реальный надежный вариант, который я мог бы использовать и даже рекомендовать.
Я успешно установил переносимую версию libreoffice на веб-сервер моего хоста, который я вызываю с помощью PHP для преобразования командной строки из.docx и т. Д. В pdf. на лету. У меня нет прав администратора на веб-сервере моего хоста. Вот мой пост в блоге о том, что я сделал:
Ура! Конвертируйте напрямую из.docx или.odt в.pdf, используя PHP с LibreOffice (преемником OpenOffice)!
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);
?>
Решения на основе Open Office / LibreOffice будут работать хорошо, но не ожидайте, что ваши PDF-файлы будут напоминать ваши исходные файлы, если они были созданы в MS-Office. PDF, который выглядит на 90% как оригинал, не считается приемлемым во многих областях.
Единственный способ убедиться, что ваши PDF-файлы выглядят точно так же, как и оригиналы, - это использовать решение, использующее официальные библиотеки MS-Office. Если вы используете свое решение PHP на серверах, отличных от Windows, то для него требуется дополнительный Windows Server. Это может показаться, но если вы действительно заботитесь о внешнем виде ваших PDF-файлов, у вас может не быть выбора.
Посмотрите на это сообщение в блоге. Он показывает, как использовать PHP для преобразования файлов MS-Office с высоким уровнем точности.
Отказ от ответственности: я написал это сообщение в блоге и работал над связанным коммерческим продуктом, так что считайте меня предвзятым. Тем не менее, похоже, что это отличное решение для тех PHP-людей, с которыми я работаю.
Шаг 1. Установите "Apache_OpenOffice_4.1.2" в вашей системе. Шаг 2. Загрузите библиотеку "unoconv" с github или любого другого места.
-> C: \ Program Files (x86) \ OpenOffice 4 \ program \ python.exe = Путь к каталогу установки открытого офиса
-> 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
Я нашел какое-то решение после стольких поисков. Вы также можете попробовать это, если устали искать хорошее решение.
Для общего использования 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');
Надеюсь, что это решение поможет вам.
Другой способ сделать это - напрямую использовать параметр в команде libreoffice:
libreoffice --convert-to pdf /path/to/file.{doc,docx}
Для конкретного PHP вы можете попробовать PHPWord - эта библиотека написана на чистом PHP и предоставляет набор классов для записи и чтения из различных форматов файлов документов (включая.doc и.docx). Основным недостатком является то, что качество преобразованных файлов может быть весьма изменчивым.
В качестве альтернативы, если вы хотите более качественный вариант, вы можете использовать API преобразования файлов, например Zamzar. Вы можете использовать его для преобразования широкого спектра офисных форматов (и других) в 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.
Любой, кто хочет сделать это в Ubuntu/linux, используя php -
Ubuntu поставляется с установленным по умолчанию libre office. Любой может использовать команду оболочки, чтобы использовать для этого безголовый офис libre.
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');
Надеюсь, это поможет другим, как я.
Вы пробовали http://www.phpdocx.com/? Кроме того, он также может быть размещен на вашем сервере.
По моему опыту, самый простой способ сделать это - использовать бесплатную родную библиотеку PHP Cloudmersive, просто вызовите 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.