web-dev-qa-db-fra.com

Convertir les documents Word, docx et Excel xls, xlsx en PDF avec PHP

Je cherche un moyen de convertir des fichiers Word et Excel au format PDF à l'aide de PHP.

La raison en est que je dois pouvoir combiner des fichiers de différents formats en un seul document. Je sais que si je suis capable de tout convertir en PDF, je peux ensuite fusionner les PDF en un seul fichier à l'aide de PDFMerger (qui utilise fpdf).

Je suis déjà capable de créer des PDF à partir d'autres types de fichiers/images, mais je suis coincé avec Word Docs. (Je pense que je pourrais éventuellement convertir les fichiers Excel à l'aide de la bibliothèque PHPExcel que j'utilise déjà pour créer des fichiers Excel à partir de code html).

Je n'utilise pas le Zend Framework, j'espère donc que quelqu'un pourra me diriger dans la bonne direction.

Alternativement, s’il existe un moyen de créer des fichiers image (jpg) à partir des documents Word, cela serait réalisable.

Merci pour toute aide!

29
saulposel

J'ai trouvé une solution à mon problème et après une demande, je vais l'afficher ici pour aider les autres. Toutes mes excuses si j'ai manqué certains détails, cela fait longtemps que je n'ai pas travaillé sur cette solution.

La première chose à faire est d'installer Openoffice.org sur le serveur. J'ai demandé à mon fournisseur d'hébergement d'installer Open Office RPM sur mon VPS. Cela peut être fait directement via WHM.

Maintenant que le serveur est capable de gérer les fichiers MS Office, vous pouvez les convertir en exécutant des instructions en ligne de commande via PHP. Pour gérer cela, j'ai trouvé PyODConverter: https://github.com/mirkonasato/pyodconverter

J'ai créé un répertoire sur le serveur et y ai placé le fichier python PyODConverter. J'ai également créé un fichier texte au-dessus de la racine Web (je l'ai nommé "adocpdf"), avec les instructions de ligne de commande suivantes:

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

Ceci vérifie que les bibliothèques openoffice.org sont en cours d'exécution, puis appelle le script PyODConverter pour traiter le fichier et le générer au format PDF. Les 3 variables des trois premières lignes sont fournies lorsque le script est exécuté avec un fichier PHP. Le délai ("sleep 5s") est utilisé pour s'assurer que openoffice.org a suffisamment de temps pour être initié si nécessaire. Je l’utilise depuis des mois et l’écart entre les 5 secondes semble donner suffisamment d’espace pour respirer.

Le script créera une version PDF du document dans le même répertoire que celui d'origine.

Enfin, lancer la conversion d'un fichier Word/Excel à partir de PHP (je l'ai dans une fonction qui vérifie si le fichier en question est un document Word/Excel) ...

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

Cette fonction PHP est appelée une fois le fichier Word/Excel chargé sur le serveur. Les 3 variables de l'appel exec () se rapportent directement aux 3 au début du script en texte brut ci-dessus. Notez que la variable $ directory ne nécessite aucune barre oblique avant si le fichier à convertir se trouve dans la racine Web.

Ok, c'est fini! J'espère que cela sera utile à quelqu'un et lui évitera les difficultés et la courbe d'apprentissage auxquelles j'ai dû faire face.

20
saulposel

Eh bien mes 2 cents en ce qui concerne le sujet Word 2007 docx, Word 97-2004 doc, pdf et tous les autres types de MS Office souhaitant être "convertis de y à z mais en réalité, ils ne le sont pas". D'après mon expérience jusqu'à présent, on ne peut pas se fier à la conversion avec LibreOffice ou OpenOffice. Bien que les documents .doc soient généralement mieux pris en charge que les .docx de Word 2007. En général, il est très difficile de convertir le .docx en .doc sans rien casser.

.docx a également tendance à être extrêmement utile pour les modèles où .doc n'est pas destiné à être binaire.

La conversion de .doc à PDF était la plupart du temps assez fiable. Si vous pouvez toujours influencer la conception ou le contenu du document Word, cela peut être satisfaisant, mais dans mon cas, des documents ont été fournis par des sociétés étrangères dans lesquelles même après avoir généré les modèles .docx, dans certains cas, le .docx généré devait être légèrement modifié avec compléter le texte avant qu’il ne soit généré en PDF.


FENÊTRES À BASE!

Tout ce hoquet m'a amené à conclure que la seule méthode de conversion fiable que j'ai trouvée utilisait la classe COM de PHP et laissait l'application MS Word ou Excel faire tout le travail à votre place. Je vais juste donner un exemple sur la conversion de .docx en .doc et/ou PDF. Si MS Office n'est pas installé sur votre ordinateur, vous pouvez télécharger une version de trial de 60 jours vous permettant de disposer de suffisamment de place pour les tests.

l'extension COM.net est commentée par défaut dans le php.ini, il suffit de rechercher la ligne php_com_dotnet.dll et de la commenter

  extension=php_com_dotnet.dll

Redémarrez le serveur Web (IIS n'est pas un pré, Apache fonctionnera aussi bien).

Le code ci-dessous est une démonstration de la simplicité.

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

Ceci est juste une petite démonstration. Je peux simplement dire que s’il s’agissait de conversion, c’était la seule véritable option fiable que je pouvais utiliser et même recommander.

14
dbf

1) J'utilise WAMP.

2) J'ai installé Open Office (à partir d'Apache http://www.openoffice.org/download/ ).

3) $output_dir = "C:/wamp/www/projectfolder/"; ceci est mon dossier de projet où je veux créer un fichier de sortie.

4) J'ai déjà placé mon fichier d'entrée ici C:/wamp/www/projectfolder/wordfile.docx";

Ensuite, je lance mon code .. (donné ci-dessous)

<?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);
    ?>
9
Vineesh Kalarickal

J'ai réussi à placer une version portable de libreoffice sur le serveur Web de mon hôte, que j'appelle avec PHP, pour convertir au format pdf la ligne de commande .docx, etc. à la volée. Je n'ai pas de droits d'administrateur sur le serveur Web de mon hôte. Voici mon blog de ce que j'ai fait:

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

Yay! Convertissez directement des fichiers .docx ou .odt au format .pdf en utilisant PHP avec LibreOffice (le successeur d'OpenOffice)!

8
Robert Hyatt

Les solutions basées sur Open Office/LibreOffice feront l'affaire, mais ne vous attendez pas à ce que vos PDF ressemblent à vos fichiers source s'ils ont été créés dans MS-Office. A PDF qui ressemble à 90% à l'original n'est pas considéré comme acceptable dans de nombreux domaines.

La seule façon de vous assurer que vos fichiers PDF ressemblent exactement aux originaux est d'utiliser une solution utilisant les DLL officielles de MS-Office sous le capot. Si vous exécutez votre solution PHP sur des serveurs autres que Windows, un serveur Windows supplémentaire est alors nécessaire. Cela peut constituer un obstacle, mais si vous tenez vraiment à l'aspect de vos fichiers PDF, vous n'aurez peut-être pas le choix.

Regardez cet article de blog . Il montre comment utiliser PHP pour convertir des fichiers MS-Office avec un haut niveau de fidélité. 

Disclaimer: J'ai écrit ce billet et travaillé sur un produit commercial connexe, alors considérez-moi comme partial. Cependant, cela semble être une excellente solution pour les PHP personnes avec lesquelles je travaille.

3
Jeroen Ritmeijer

Étape 1. Installez "Apache_OpenOffice_4.1.2" sur votre système Étape 2. Téléchargez la bibliothèque "unoconv" à partir de github ou de tout autre endroit.

-> C:\Program Files (x86)\OpenOffice 4\program\python.exe = Chemin du répertoire d’installation Open Office

-> D:\wamp\www\doc_to_pdf\libobasis4.4-pyuno\unoconv = Chemin du dossier de la bibliothèque

-> D:/wamp/www/doc_to_pdf/files /'.$ pdf_File_name. ' = chemin et nom du fichier pdf 

-> D:/wamp/www/doc_to_pdf/files /'.$ doc_file_name = Chemin du fichier de votre document.

Si le fichier PDF non créé à la dernière étape est Allez à -> Panneau de configuration\Tous les éléments du panneau de configuration\Outils d'administration-> services-> trouver "wampapache" -> cliquez avec le bouton droit de la souris sur la propriété -> cliquez sur l'onglet d'ouverture de session. case à cocher permettant au service d'interagir avec le bureau

Créez un exemple de fichier .php, mettez le code ci-dessous et exécutez-le sur un serveur wamp ou 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);

Ce code fonctionne pour moi dans le système d'exploitation Windows-8

2
Sandip Patel

J'ai trouvé une solution après tant de recherches sur Google. Vous pouvez également l'essayer si vous êtes fatigué de chercher une bonne solution.

Pour l'utilisation commune de l'API SOAP

Vous avez besoin du nom d'utilisateur et du mot de passe pour effectuer la demande SOAP sur https://www.livedocx.com

Faites une inscription en utilisant ceci https://www.livedocx.com/user/account_registration.aspx et suivez les étapes en conséquence.

Utilisez le code ci-dessous dans votre fichier .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);

Suivez ce lien pour plus d'informations http://www.phplivedocx.org/

Pour Ubuntu

Installation d'OpenOffice et Unoconv Obligatoire.

depuis l'invite de commande 

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

Maintenant, ajoutez le code ci-dessous dans votre script PHP et assurez-vous que le fichier doit être exécutable.

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

J'espère que cette solution vous aidera.

1
Sunil kumar

Avez-vous essayé http://www.phpdocx.com/ ? De plus, il peut également être hébergé sur votre serveur.

0
Cogicero

Pour un spécifique à PHP, vous pouvez essayer PHPWord - cette bibliothèque est écrite en pure PHP = et fournit un ensemble de classes pour écrire et lire à partir de différents formats de fichier de document (y compris .doc et .docx). Le principal inconvénient est que la qualité des fichiers convertis peut être très variable.

Si vous souhaitez une option de qualité supérieure, vous pouvez également utiliser une API de conversion de fichier telle que Zamzar . Vous pouvez l’utiliser pour convertir un large éventail de formats bureautiques (et d’autres) au format PDF, et appeler à partir de n’importe quelle plate-forme (Windows, Linux, OS X, etc.).

Le code PHP pour convertir un fichier ressemblerait à ceci:

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

Divulgation complète: Je suis le développeur principal de l'API Zamzar.

0
Chris Whyley

Une autre façon de faire consiste à utiliser directement un paramètre de la commande libreoffice:

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