Преобразование 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, это будет работоспособным.
Спасибо за любую помощь!
8 Solutions collect form web for “Преобразование Word doc, docx и Excel xls, xlsx в PDF с PHP”
Я нашел решение моей проблемы и после запроса разместил его здесь, чтобы помочь другим. Извинения, если я пропустил какие-либо подробности, прошло некоторое время с тех пор, как я работал над этим решением.
Первое, что требуется, – это установить 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. Задержка («sleep 5s») используется для обеспечения того, чтобы openoffice.org хватило времени для инициации, если это необходимо. Я использовал это в течение нескольких месяцев, и 5-секундный промежуток, кажется, дает достаточно передышки.
Сценарий создаст 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 был загружен на сервер. 3 переменных в вызове exec () относятся непосредственно к 3 в начале обычного текстового скрипта выше. Обратите внимание, что переменная $ directory не требует передовой косой черты, если файл для преобразования находится в корневой папке.
Хорошо, вот и все! Надеюсь, это будет полезно кому-то и избавит их от трудностей и кривой обучения, с которыми я столкнулся.
Хорошо, мои 2 цента, когда дело доходит до слова Word 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.
ОСНОВНЫЕ ОСНОВЫ WINDOWS!
Вся эта икота заставила меня прийти к выводу, что единственным истинным надежным методом конвертации, который я нашел, является использование класса 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 будут выполнять задание OK, но не ожидайте, что ваши файлы PDF будут похожи на ваши исходные файлы, если они были созданы в MS-Office. PDF, который выглядит на 90% как оригинал, не считается приемлемым во многих областях.
Единственный способ убедиться, что ваши файлы PDF выглядят точно так же, как оригиналы, – это использовать решение, использующее официальные DLL-файлы MS-Office под капотом. Если вы используете PHP-решение на серверах, отличных от Windows, то для этого требуется дополнительный Windows Server. Это может быть showstopper, но если вы действительно заботитесь о внешнем виде ваших PDF-файлов, у вас может не быть возможности.
Взгляните на это сообщение в блоге . В нем показано, как использовать PHP для преобразования файлов MS-Office с высоким уровнем точности.
Отказ от ответственности: я написал этот пост в блоге и работал над соответствующим коммерческим продуктом, поэтому считаю меня предвзятым. Однако это отличное решение для людей PHP, с которыми я работаю.
Вы пробовали http://www.phpdocx.com/ ? Кроме того, он также может быть размещен на вашем сервере.
Шаг 1. Установите «Apache_OpenOffice_4.1.2» в вашей системе. Шаг 2. Загрузите библиотеку «unoconv» из github или где-нибудь еще.
-> C: \ Program Files (x86) \ OpenOffice 4 \ program \ python.exe = Путь к каталогу установки open office
-> 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 не создан, чем последний шаг, перейдите в -> Панель управления \ Все элементы панели управления \ Средства администрирования-> services-> найдите «wampapache» -> щелкните правой кнопкой мыши и выберите свойство -> нажмите вкладку входа в систему. Затем установите флажок allow служба для взаимодействия с рабочим столом
Создайте образец .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');
Надейтесь, что это решение поможет вам.