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

je cherche un moyen de convertir des fichiers Word et Excel en PDF en utilisant 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 alors fusionner les fichiers PDF en un seul fichier en utilisant PDFMerger (qui utilise fpdf).

je suis déjà capable de créer des PDF à partir d'autres types de fichiers / images, mais je suis bloqué avec Word Docs. (Je pense que je serais peut-être en mesure de convertir les fichiers Excel en utilisant la bibliothèque PHPExcel que j'utilise déjà pour créer des fichiers Excel à partir du code html).

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

alternativement, s'il y a un moyen de créer des fichiers image (jpg) à partir des documents Word, cela serait réalisable.

merci de votre aide!

28
demandé sur hakre 2011-04-04 16:39:19

10 réponses

j'ai trouvé une solution à mon problème et après une requête, le poster ici pour aider les autres. Toutes mes excuses si j'ai manqué des détails, ça fait longtemps que je n'ai pas travaillé sur cette solution.

La première chose qui est nécessaire est d'installer Openoffice.org sur le serveur. J'ai demandé à mon hébergeur d'installer le RPM open office sur mon VPS. Cela peut être fait directement par L'intermédiaire du WHM.

maintenant que le serveur a la capacité de gérer les fichiers MS Office, vous pouvez pour convertir les fichiers 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 de PyODConverter. J'ai aussi créé un fichier texte simple au-dessus de la racine du web( Je l'ai appelé "adocpdf"), avec les instructions en ligne de commande suivantes:

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

vérifie que le openoffice.org les bibliothèques sont lancer et ensuite appeler le script PyODConverter pour traiter le fichier et le sortir en PDF. Les 3 variables sur les trois premières lignes sont fournies lorsque le script est exécuté à partir d'un fichier PHP. Le retard ("sommeil 5s") est utilisé pour s'assurer que openoffice.org a assez de temps pour lancer, si nécessaire. Je l'utilise depuis des mois maintenant et le 5S gap semble donner assez de place pour respirer.

le script va créer une version PDF du document dans le même répertoire que le original.

enfin, initialiser la conversion D'un fichier Word / Excel à partir de PHP (Je l'ai dans une fonction qui vérifie si le fichier que nous traitons 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 que le fichier Word / Excel a été téléchargé sur le serveur. Les 3 variables de l'appel exec() se rapportent directement aux 3 variables au début du script de texte brut ci-dessus. Notez que la variable $ directory ne nécessite pas de slash avant si le fichier pour la conversion est dans la racine web.

OK, c'est ça! J'espère que cela sera utile à quelqu'un et lui épargnera les difficultés et la courbe d'apprentissage que j'ai rencontrées.

20
répondu saulposel 2012-07-26 09:02:28

Eh bien mes 2 cents quand il s'agit du mot sujet 2007 docx, word 97-2004 doc,pdf et tous les autres types de MS Office souhaitant être "converti de yz mais en réalité ils ne veulent pas l'être". D'après mon expérience, on ne peut pas compter sur la conversion avec LibreOffice ou OpenOffice. Bien que .doc les documents ont tendance à être mieux supportés que les .docx. En général, il est très difficile de convertir l' .docx.doc sans les casser quoi.

.docx ont aussi tendance à être extrêmement utiles pour les Templiers où .doc n'est pas d'être binaire.

la conversion de .doc PDF a été la plupart du temps tout à fait fiable. Si vous pouvez encore influencer la conception ou le contenu du document word, alors cela pourrait être satisfaisant, mais dans ma situation, les documents ont été fournis par des entreprises étrangères où, même après avoir généré le .docx modèles, dans certains scénarios, le produit .docx devait être légèrement modifié avec le texte du supplément avant qu'il ne soit généré en PDF.


WINDOWS BASED!

Tout ce hoquet m'a amené à conclure que la seule vraie méthode de conversion fiable que j'ai trouvée était l'utilisation de COM class en PHP et laissez L'Application MS Word ou Excel faire tout le travail pour vous. Je vais juste donner un exemple sur la conversion .docx.doc et / ou PDF. Si vous n'avez pas MS Office installé, vous pouvez télécharger un essai une version de 60 jours qui vous donnerait assez de place pour les tests.

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

  extension=php_com_dotnet.dll

redémarrez le serveur web (IIS n'est pas un pre, Apache fonctionnera tout aussi bien).

le code ci-dessous montre à quel point c'est facile.

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

ce n'est qu'une petite démonstration. Je peux juste disons que s'il s'agit de conversion, c'était la seule option fiable que je pouvais utiliser et même recommander.

14
répondu dbf 2013-11-19 01:34:27

j'ai réussi à mettre une version portable de libreoffice sur le serveur web de mon hôte, que J'appelle avec PHP pour effectuer une conversion en ligne de commande .docx, etc. pour pdf. à la volée. Je n'ai pas de droits d'administration 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! Convertir directement .docx ou .odt .pdf utilisant PHP avec LibreOffice (Successeur d'OpenOffice)!

8
répondu Robert Hyatt 2011-11-20 02:03:30

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/"; c'est mon dossier de projet où je veux créer le fichier de sortie.

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

Puis J'Exécute Mon Code.. (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);
    ?>
8
répondu Vineesh Kalarickal 2017-03-30 12:11:56

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

la seule façon de s'assurer que vos PDF ressemblent exactement aux originaux est d'utiliser une solution qui utilise les DLLs MS-Office officiels sous le capot. Si vous utilisez votre solution PHP sur des serveurs autres que Windows, alors elle nécessite un Windows Server supplémentaire. Il peut s'agir d'un showstopper, mais si vous vous souciez vraiment de l'apparence de vos fichiers PDF, vous n'aurez peut-être pas le choix.

regardez ce billet de blog. Il montre comment utiliser PHP pour convertir des fichiers MS-Office avec un haut niveau de fidélité.

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

2
répondu Jeroen Ritmeijer 2013-02-14 12:25:57

Étape 1. Installez " Apache_OpenOffice_4.1.2" dans votre système Étape 2. Téléchargez la bibliothèque "unoconv" de github ou n'importe où d'autre.

- > C:\Program Files (x86)\OpenOffice 4\program\python.exe = chemin du répertoire d'installation de bureau ouvert

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

- > D:/wamp/www/doc_to_pdf/files/".$pdf_File_name.'=chemin d'accès et nom du fichier de pdf

-> D:/wamp/www/doc_to_pdf/files/".$doc_file_name = chemin de votre fichier de document.

si pdf Non créé que la dernière étape est Allez à-> panneau de configuration\Tous les éléments du Panneau de configuration\Outils administratifs-> services -> trouvez "wampapache" - > cliquez sur le bouton droit de la souris et cliquez sur la propriété - > cliquez sur l'onglet Connexion plutôt que sur la case à cocher " Autoriser le service à interagir avec le bureau

Créer un échantillon .le fichier php et mettre le code ci-dessous et exécuter sur le 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 windows 8 système d'exploitation

2
répondu Sandip Patel 2016-03-22 08:43:08

j'ai trouvé une solution après tant de recherches sur Google. Vous pouvez également essayer si fatigué pour trouver une bonne solution.

For common using SOAP API

vous avez besoin du nom d'utilisateur et du mot de passe pour faire une demande SOAP https://www.livedocx.com

faire l'enregistrement 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 .php fichier.

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

Suivre ce lien pour plus d'information http://www.phplivedocx.org/

Pour Ubuntu

OpenOffice et Unoconv à l'installation.

à partir de 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 aider.

1
répondu Sunil kumar 2016-09-13 18:45:48

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

0
répondu Cogicero 2011-04-04 14:10:27

PHP-spécifique, vous pouvez essayer PHPWord - cette bibliothèque est écrite en PHP pur 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 peuvent être très variables.

alternativement si vous voulez une option de qualité supérieure vous pouvez utiliser une API de conversion de fichier comme Zamzar. Vous pouvez l'utiliser pour convertir un une large gamme de bureau formats (et autres) en PDF, et vous pouvez 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
répondu Chris Whyley 2017-11-10 11:51:13

une Autre manière de faire ceci est d'utiliser directement un paramètre sur la libreoffice commande:

libreoffice --convert-to pdf /path/to/file.{doc,docx}
0
répondu Marcelo A 2018-06-18 14:50:49