Конвертировать Word doc, docx и Excel xls, xlsx в PDF с PHP - PullRequest
30 голосов
/ 04 апреля 2011

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

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

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

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

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

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

Ответы [ 11 ]

21 голосов
/ 26 июля 2012

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

Первое, что требуется, - это установить 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 было достаточно времени для запуска при необходимости.Я использовал это уже несколько месяцев, и разрыв в 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 на сервер.Три переменные в вызове exec () напрямую связаны с тремя переменными в начале простого текстового сценария выше.Обратите внимание, что переменная $ directory не требует прямой косой черты, если файл для преобразования находится в корневом веб-каталоге.

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

16 голосов
/ 18 ноября 2013

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

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

10 голосов
/ 03 января 2013

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);
    ?>
8 голосов
/ 20 ноября 2011

Я успешно поместил переносную версию libreoffice на веб-сервер моего хоста, который я вызываю с помощью PHP, чтобы выполнить преобразование командной строки из .docx и т. Д. В pdf.на лету.У меня нет прав администратора на веб-сервере моего хоста.Вот мой пост в блоге о том, что я сделал:

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

Yay!Конвертируйте напрямую из .docx или .odt в .pdf, используя PHP с LibreOffice (преемником OpenOffice)!

4 голосов
/ 14 февраля 2013

Решения на основе Open Office / LibreOffice будут работать нормально, но не ожидайте, что ваши PDF-файлы будут напоминать ваши исходные файлы, если они были созданы в MS-Office. PDF, который выглядит на 90% как оригинал, не считается приемлемым во многих областях.

Единственный способ убедиться, что ваши PDF-файлы выглядят точно так же, как и оригиналы, - это использовать решение, использующее официальные DLL-библиотеки MS-Office. Если вы используете свое решение PHP на серверах, отличных от Windows, то для него требуется дополнительный Windows Server. Это может показаться, но если вы действительно заботитесь о внешнем виде ваших PDF-файлов, у вас может не быть выбора.

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

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

3 голосов
/ 21 марта 2016

Шаг 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» -> щелкните правой кнопкой мыши и выберите свойство -> щелкните вкладку входа в систему, затем установите флажок разрешения службы взаимодействовать сdesktop

Создайте пример файла .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

1 голос
/ 23 августа 2016

Я нашел какое-то решение после стольких поисков. Вы также можете попробовать это, если устали искать хорошее решение.

Для общего использования 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');

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

0 голосов
/ 16 мая 2019

В моем опыте проще всего сделать это с помощью бесплатной библиотеки 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.

0 голосов
/ 18 июня 2018

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

libreoffice --convert-to pdf /path/to/file.{doc,docx}
0 голосов
/ 10 ноября 2017

Для конкретного 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.

...