Konwertuj Word DOC, docx i Excel xls, XLSX na PDF za pomocą PHP

Szukam sposobu na konwersję plików Word i Excel do PDF za pomocą PHP.

Powodem tego jest to, że muszę być w stanie łączyć pliki różnych formatów w jeden dokument. Wiem, że jeśli jestem w stanie przekonwertować wszystko do PDF, mogę następnie scalić pliki PDF w jeden plik za pomocą PDFMerger (który używa fpdf).

Jestem już w stanie tworzyć pliki PDF z innych typów plików / obrazów, ale utknąłem z dokumentami Word. (Myślę, że mógłbym być w stanie przekonwertować pliki Excela za pomocą Biblioteka PHPExcel, której już używam do tworzenia plików Excel z kodu html).

Nie używam Zend Framework, więc mam nadzieję, że ktoś będzie w stanie wskazać mi właściwy kierunek.

Alternatywnie, jeśli istnieje sposób na tworzenie plików obrazów (jpg) z dokumentów programu Word, byłoby to wykonalne.

Dzięki za pomoc!

Author: hakre, 2011-04-04

10 answers

Znalazłem rozwiązanie mojego problemu i po prośbie, opublikuję go tutaj, aby pomóc innym. Przepraszam, jeśli przegapiłem jakieś szczegóły, minęło trochę czasu od kiedy pracowałem nad tym rozwiązaniem.

Pierwszą rzeczą, która jest wymagana, to zainstalować Openoffice.org na serwerze. Poprosiłem mojego dostawcę hostingu o zainstalowanie open office RPM na moim VPS. Można to zrobić bezpośrednio przez WHM.

Teraz, gdy serwer ma możliwość obsługi plików MS Office, możesz przekonwertować plików wykonując instrukcje wiersza poleceń za pomocą PHP. Aby sobie z tym poradzić, znalazłem PyODConverter: https://github.com/mirkonasato/pyodconverter

Utworzyłem katalog na serwerze i umieściłem w nim plik Pythona PyODConverter. Utworzyłem również plik tekstowy nad głównym katalogiem (nazwałem go "adocpdf"), z następującymi instrukcjami wiersza poleceń:

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

To sprawdza, czy openoffice.org biblioteki są uruchomione, a następnie wywołuje PyODConverter skrypt do przetworzenia pliku i wypisania go jako PDF. 3 zmienne w pierwszych trzech liniach są dostarczane, gdy skrypt jest wykonywany z pliku PHP. Opóźnienie ("sleep 5s") służy do zapewnienia, że openoffice.org ma wystarczająco dużo czasu, aby rozpocząć w razie potrzeby. Używam tego od miesięcy, a luka 5s wydaje się dawać wystarczającą przestrzeń do oddychania.

Skrypt utworzy wersję PDF dokumentu w tym samym katalogu co oryginał.

Wreszcie, inicjując konwersję Plik Word / Excel z poziomu PHP (mam go w funkcji, która sprawdza, czy plik, z którym mamy do czynienia, jest dokumentem word / excel)...

//use openoffice.org
$output = array();
$return_var = 0;
exec("/opt/adocpdf {$directory} {$filename} {$extension}", $output, $return_var);

Ta funkcja PHP jest wywoływana po przesłaniu pliku Word / Excel na serwer. 3 zmienne w wywołaniu exec() odnoszą się bezpośrednio do 3 na początku skryptu zwykłego tekstu powyżej. Zauważ, że zmienna $ directory nie wymaga ukośnika przedniego, jeśli plik do konwersji znajduje się w katalogu głównym sieci.

OK, dość tego! Mam nadzieję, że będzie to przydatne dla kogoś i zaoszczędzić im trudności i krzywej uczenia się, z którymi miałem do czynienia.
 20
Author: saulposel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-26 09:02:28

Cóż moje 2 grosze jeśli chodzi o temat word 2007 docx, word 97-2004 doc, pdf i wszystkie inne typy MS Office, które chcą być "przekształcone z y na z, ale w rzeczywistości nie chcą być". Z mojego dotychczasowego doświadczenia wynika, że nie można polegać na konwersji z LibreOffice lub OpenOffice. Chociaż .doc dokumenty wydają się być lepiej obsługiwane niż word 2007 .docx. Ogólnie rzecz biorąc, bardzo trudno jest przekształcić .docx na .doc bez łamania czegokolwiek.

.docx również wydają się być niezwykle przydatne do tworzenia szablonów, gdzie {[7] } nie jest binarne.

Konwersja z .doc do PDF była przez większość czasu dość wiarygodna. Jeśli nadal możesz wpływać na projekt lub treść dokumentu word, to może to być satysfakcjonujące, ale w mojej sytuacji dokumenty były dostarczane od zagranicznych firm, gdzie nawet po wygenerowaniu szablonów .docx, w niektórych scenariuszach, wygenerowany .docx musiał zostać nieznacznie zmodyfikowany tekstem uzupełniającym, zanim został wygenerowany do pliku. PDF.


OPARTE NA WINDOWS!

Cała ta czkawka sprawiła, że doszedłem do wniosku, że jedyną wiarygodną metodą konwersji, jaką znalazłem, było użycie klasy COM W PHP i pozwól aplikacji MS Word lub Excel wykonać całą pracę za Ciebie. Podam tylko przykład konwersji .docx na .doc i / lub PDF. Jeśli nie masz zainstalowanego pakietu MS Office, możesz pobrać 60-dniową wersję próbną , która dałaby ci wystarczająco dużo miejsca do celów testowych.

The COM.net rozszerzenie jest domyślnie komentowane w php.ini, po prostu wyszukaj linię php_com_dotnet.dll i odkomentuj ją w ten sposób

  extension=php_com_dotnet.dll

Uruchom ponownie serwer WWW(IIS nie jest pre, Apache będzie działał równie dobrze).

Poniższy kod jest demonstracją tego, jak łatwo jest to zrobić.

  $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);
To tylko mała demonstracja. Mogę po prostu powiedzieć, że jeśli chodzi o konwersję, była to jedyna wiarygodna opcja, której mogłem użyć, a nawet polecić.
 14
Author: dbf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-19 01:34:27

Udało mi się umieścić przenośną wersję libreoffice na serwerze mojego hosta, który wywołuję za pomocą PHP, aby wykonać konwersję wiersza poleceń .docx itp. do pdf. w locie. Nie mam uprawnień administratora na serwerze mojego hosta. Oto mój wpis na blogu o tym, co zrobiłem:

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

Yay! Konwersja bezpośrednio z .docx lub .odt do .pdf przy użyciu PHP z LibreOffice (OpenOffice ' s następca)!

 8
Author: Robert Hyatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-20 02:03:30

1) używam WAMP.

2) zainstalowałem Open Office (z apache http://www.openoffice.org/download/).

3) $output_dir = "C:/wamp/www/projectfolder/"; to jest mój folder projektu, w którym chcę utworzyć plik wyjściowy.

4) umieściłem już tutaj swój plik wejściowy C:/wamp/www/projectfolder/wordfile.docx";

Potem Uruchamiam Mój Kod.. (podane poniżej)
<?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
Author: Vineesh Kalarickal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 12:11:56

Rozwiązania oparte na Open Office / LibreOffice sprawdzą się dobrze, ale nie oczekuj, że pliki PDF będą przypominać pliki źródłowe, jeśli zostały utworzone w MS-Office. Plik PDF, który wygląda w 90% jak oryginał, nie jest uważany za akceptowalny w wielu dziedzinach.

Jedynym sposobem, aby upewnić się, że pliki PDF wyglądają dokładnie tak, jak oryginały, jest użycie rozwiązania, które wykorzystuje oficjalne biblioteki DLL MS-Office pod maską. Jeśli używasz swojego rozwiązania PHP na serwerach innych niż Windows, wymaga ono dodatkowy Windows Server. Może to być showstopper, ale jeśli naprawdę zależy ci na wyglądzie plików PDF, możesz nie mieć opcji.

Spójrz na ten wpis na blogu . Pokazuje, jak używać PHP do konwersji plików MS-Office z wysokim poziomem wierności.

Zastrzeżenie: napisałem ten post na blogu i pracowałem nad powiązanym produktem komercyjnym, więc uważam, że jestem stronniczy. Wydaje się jednak, że jest to świetne rozwiązanie dla osób z PHP, z którymi pracuję.

 2
Author: Jeroen Ritmeijer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-14 12:25:57

Krok 1. Zainstaluj "Apache_OpenOffice_4.1.2" w swoim systemie Punkt 2. Pobierz bibliotekę" unoconv " z github lub gdziekolwiek indziej.

-> C:\Program Files (x86) \ OpenOffice 4 \ program \ python.exe = ścieżka do katalogu instalacyjnego open office

-> D:\wamp\www\doc_to_pdf\libobasis4.4-pyuno\unoconv = ścieżka do folderu biblioteki

-> D:/wamp/www/doc_to_pdf/files/".$pdf_File_name.'=ścieżka i nazwa pliku pdf

-> D:/wamp/www/doc_to_pdf/files/".$doc_file_name = Ścieżka do pliku dokumentu.

Jeśli plik pdf nie został utworzony, to ostatni krok jest Przejdź do - > Panel sterowania \ wszystkie elementy Panelu sterowania \ Narzędzia administracyjne-> usługi -> Znajdź "wampapache" - > kliknij prawym przyciskiem myszy i kliknij na właściwość - > kliknij kartę logowania niż zaznacz pole wyboru Zezwól serwisowi na interakcję z pulpitem

Utwórz próbkę .plik php i umieść poniżej kod i uruchom na serwerze wamp lub 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);

Ten kod działa dla mnie w systemie operacyjnym windows-8

 2
Author: Sandip Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 08:43:08

Znalazłem jakieś rozwiązanie po takim googlowaniu. Możesz również spróbować, jeśli zmęczony szukać dobrego rozwiązania.

Do wspólnego korzystania z SOAP API

Potrzebujesz nazwy użytkownika i hasła, aby złożyć żądanie SOAP na https://www.livedocx.com

Make registration using this https://www.livedocx.com/user/account_registration.aspx i postępuj zgodnie z instrukcjami.

Użyj poniższego kodu w swoim .plik 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);

Follow ten link, aby uzyskać więcej informacji http://www.phplivedocx.org/

Dla Ubuntu

Wymagana instalacja OpenOffice i Unoconv.

Z wiersza polecenia

apt-get remove --purge unoconv
git clone https://github.com/dagwieers/unoconv
cd unoconv
sudo make install

Teraz dodaj poniższy kod w swoim skrypcie PHP i upewnij się, że plik powinien być wykonywalny.

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

Mam nadzieję, że to rozwiązanie ci pomoże.

 1
Author: Sunil kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 18:45:48

Czy próbowałeś http://www.phpdocx.com / ? poza tym może być również hostowany na twoim serwerze.

 0
Author: Cogicero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-04 14:10:27

Dla specyficznego dla PHP można spróbować PHPWord - ta Biblioteka jest napisana w czystym PHP i zapewnia zestaw klas do zapisu i odczytu z różnych formatów plików dokumentów (w tym .doc i .docx). Główną wadą jest to, że jakość przekonwertowanych plików może być dość zmienna.

Alternatywnie, jeśli chcesz mieć opcję wyższej jakości, możesz użyć interfejsu API konwersji plików, takiego jak Zamzar . Możesz go użyć do konwersji szerokiego zakresu formatów biurowych (i innych) na PDF i możesz dzwonić z dowolnej platformy (Windows, Linux, OS X itp.).

Kod PHP do konwersji pliku wyglądałby tak:

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

Pełne ujawnienie: jestem głównym programistą API Zamzar.

 0
Author: Chris Whyley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 11:51:13

Innym sposobem, aby to zrobić, jest użycie bezpośrednio parametru w Komendzie libreoffice:

libreoffice --convert-to pdf /path/to/file.{doc,docx}
 0
Author: Marcelo A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-18 14:50:49