Преобразование Word doc, docx и Excel xls, xlsx в PDF с помощью PHP

Я ищу способ конвертировать файлы Word и Excel в PDF с помощью PHP.

причина этого в том, что мне нужно уметь объединять файлы разных форматов в один документ. Я знаю, что если я могу конвертировать все в PDF, я могу объединить PDF-файлы в один файл с помощью PDFMerger (который использует fpdf).

Я уже могу создавать PDF-файлы из других типов файлов / изображений, но застрял с документами Word. (Я думаю, что я, возможно, смогу преобразовать Excel файлы, использующие библиотеку PHPExcel, которую я уже использую для создания файлов Excel из html-кода).

Я не использую Zend Framework, поэтому надеюсь, что кто-то сможет указать мне в правильном направлении.

кроме того, если есть способ создать файлы изображений (jpg) из документов Word, это будет работать.

Спасибо за любую помощь!

10 ответов


Я нашел решение моей проблемы и после запроса опубликую его здесь, чтобы помочь другим. Извините, если я пропустил какие-либо детали, прошло некоторое время с тех пор, как я работал над этим решением.

первое, что требуется, это установить Openoffice.org на сервере. Я попросил моего хостинг-провайдера установить open office RPM на моем VPS. Это можно сделать через WHM напрямую.

теперь, когда сервер имеет возможность обрабатывать файлы MS Office, вы возможность конвертировать файлы, выполняя инструкции командной строки через PHP. Чтобы справиться с этим, я нашел PyODConverter: https://github.com/mirkonasato/pyodconverter

Я создал каталог на сервере и поместил в него файл pyodconverter python. Я также создал текстовый файл над веб-корнем (я назвал его "adocpdf") со следующими инструкциями командной строки:

directory=
filename=
extension=
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. Задержка ("сон 5s") используется для обеспечения того, чтобы 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 на сервер. 3 переменные в вызове exec () относятся непосредственно к 3 в начале обычного текстового сценария выше. Обратите внимание, что переменная $directory не требует ведущей косой черты, если файл для преобразования находится в корневом каталоге web.

хорошо, это все! Надеюсь, это будет полезно для кого-то и избавит их от трудностей и кривой обучения, с которыми я столкнулся.


Ну мои 2 цента, когда дело доходит до темы word 2007 docx, слово 97-2004 doc, pdf и все другие типы MS Office, желающие быть " преобразованы из y to z но на самом деле они не хотят быть". По моему опыту, на конверсию с LibreOffice или OpenOffice нельзя полагаться. Хотя .doc документы, как правило, лучше поддерживаются, чем word 2007 .docx. В общем, очень сложно преобразовать .docx to .doc без нарушения что угодно.

.docx также, как правило, очень полезно для шаблонов, где .doc Не для бинарных.

преобразование .doc в PDF был большую часть времени довольно надежным. Если вы все еще можете влиять на дизайн или содержание документа word, это может быть удовлетворительным, но в моей ситуации документы были предоставлены иностранными компаниями, где даже после создания .docx шаблоны, в некоторых сценариях, сгенерированные .docx должно быть слегка изменен с текстом дополнения, прежде чем он был сгенерирован в PDF.


WINDOWS НА ОСНОВЕ!

вся эта икота заставила меня прийти к выводу, что единственным надежным методом преобразования, который я нашел, было использование COM класс в PHP и пусть приложение MS Word или Excel сделает всю работу за вас. Я просто приведу пример преобразования .docx to .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, etc. в pdf. на ходу. У меня нет прав администратора на веб-сервере моего хоста. Вот мой пост в блоге о том, что я сделал:

http://geekswithblogs.net/robertphyatt/archive/2011/11/19/converting-.docx-to-pdf-or-.doc-to-pdf-or-.doc.aspx

Ура! Конвертировать непосредственно из .docx или .odt в .pdf с использованием PHP с LibreOffice (преемник OpenOffice)!


1) я использую WAMP.

2) я установил Open Office (из apachehttp://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. Это может быть showstopper, но если вы действительно заботитесь о внешнем виде ваших PDF-файлов, у вас может не быть выбора.

посмотреть этот блог. Он показывает, как использовать PHP для преобразования файлов MS-Office с высоким уровнем точности.

отказ от ответственности: я написал это сообщение в блоге и работал над соответствующим коммерческим продуктом, поэтому считайте меня предвзятым. Тем не менее, это отличное решение для людей PHP, с которыми я работаю.


Шаг 1. Установить " Apache_OpenOffice_4.1.2" в вашей системе Шаг 2. Загрузите библиотеку "unoconv" из github или любого другого места.

- > C:\Program файлы (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 не создан, чем последний шаг Перейдите в ->Панель управления\все элементы панели управления\Администрирование - > Службы - > найти "wampapache" - > щелкните правой кнопкой мыши и нажмите на свойство - > перейдите на вкладку входа в систему, чем установите флажок Разрешить службе взаимодействовать с рабочим столом

создать образец .php файл и поставить ниже код и запустить на WAMP или XAMPP server

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

надеюсь, это решение поможет вам.


вы пробовали http://www.phpdocx.com/? Кроме того, он также может быть размещен на вашем сервере.


для конкретного PHP вы можете попробовать PHPWord - эта библиотека написана на чистом PHP и предоставляет набор классов для записи и чтения из разных форматов файлов документов (в том числе .док и. файлы DOCX). Основным недостатком является то, что качество преобразованных файлов может быть довольно переменным.

в качестве альтернативы, если вы хотите более высокое качество, вы можете использовать API преобразования файлов, например Zamzar. Вы можете использовать его для преобразования широкий ассортимент офисных форматы (и другие) в PDF, и вы можете звонить из любой платформы (Windows, Linux и OS Х и т. д.).

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

полное раскрытие информации: я ведущий разработчик API Zamzar.


другой способ сделать это - использовать непосредственно параметр в команде libreoffice:

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