Подтвердить что ты не робот

Преобразование 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, это будет работоспособным.

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

4b9b3361

Ответ 1

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

Прежде всего необходимо установить 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 script для обработки файла и вывода его в виде PDF. 3 переменные в первых трех строках предоставляются, когда script выполняется из файла PHP. Задержка ( "sleep 5s" ) используется для обеспечения того, чтобы openoffice.org хватило времени для инициации, если это необходимо. Я использовал это уже несколько месяцев, и 5-секундный промежуток, кажется, дает достаточную комнату для передышки.

script создаст 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 в начале обычного текста script выше. Обратите внимание, что переменная $directory не требует передовой косой черты, если файл для преобразования находится в пределах веб-корня.

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

Ответ 2

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

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

Преобразование из .doc в PDF было в большинстве случаев вполне надежным. Если вы все еще можете влиять на дизайн или содержание документа слова, это может быть удовлетворительным, но в моей ситуации документы были предоставлены от иностранных компаний, где даже после генерации шаблонов .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 не является pre, 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);

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

Ответ 3

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

Ответ 4

Я успешно разместил переносимую версию libreoffice на моем веб-сервере хоста, которую я вызываю с PHP, чтобы выполнить преобразование командной строки из .docx и т.д. в 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)!

Ответ 5

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

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

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

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

Ответ 6

Шаг 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 не создан, чем последний шаг, Перейдите к → Панель управления\Все элементы панели управления\Администрирование- > services- > найдите "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

Ответ 7

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

Для общего использования 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 script и убедитесь, что файл должен быть выполнен.

shell_exec('/usr/bin/unoconv -f pdf  folder/test.docx');
shell_exec('/usr/bin/unoconv -f pdf  folder/sachin.png');

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

Ответ 8

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

Ответ 9

Для 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);
?>

Полное раскрытие: Я ведущий разработчик API Zamzar.

Ответ 10

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

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

Ответ 11

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

Ответ 12

Любой, кто хочет сделать это в Ubuntu/Linux, используя php -

Ubuntu поставляется с установленным по умолчанию libre office. Любой может использовать команду shell, чтобы использовать для этого безголовый офис 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');

Надеюсь, это поможет другим, как я.