2009-09-10 11 views
27

Je suis un développeur PHP et dans un de mes projets, j'ai besoin de convertir des documents HTML (environ 30 à 50 pages) en documents PDF.Conversion HTML en PDF (pas PDF en HTML) en utilisant PHP

Ma recherche a révélé les solutions possibles suivantes. Parmi eux, certaines bibliothèques PHP et certaines applications en ligne de commande. Chacun a ses propres avantages et inconvénients.

bibliothèques PHP:

  1. fpdf (il faut plus d'efforts pour convertir)
  2. tcpdf (il faut plus d'efforts pour convertir)
  3. html2fpdf http://html2fpdf.sourceforge.net
  4. html2pdf http://html2pdf.fr/
  5. dompdf http://code.google.com/p/dompdf/ (comparé aux autres, fonctionne bien)

Pour chaque bibliothèque, j'ai des problèmes tels que:

  1. prend beaucoup de temps (plus de cinq minutes pour convertir 30 pages HTML)
  2. demande trop de ressources (mémoire et temps)

    (I définir les paramètres suivants dans php.ini:

    max_execution_time = 600
    memory_limit = 250M

    mais les choses ne fonctionnent toujours pas.)

  3. Les pages HTML doivent être bien formatées (par ex. Pas de tags proches manquantes)

Tous ces travaux lorsque je tente de convertir documents HTML simples (cinq ou moins de pages avec peu de CSS)

applications en ligne de commande

Toutes les commandes Les applications de ligne fonctionnent parfaitement et très rapidement comparées aux bibliothèques ci-dessus, mais seulement quand je les lance directement sur la console. Quand j'essaie de les utiliser en PHP avec exec() ou system(), ils me donnent des erreurs.

Voici les applications en ligne de commande et leurs erreurs quand je les exécuter en PHP:

  1. html2pdf (http://www.tufat.com/s_html2ps_html2pdf.htm)

    html2pdf: 11380): Gtk-AVERTISSEMENT **: ne peut pas affichage ouvert:: 0.0
    Aucun protocole spécifié

  2. wkhtmltopdf

    page Chargement: 10%
    page Chargement: 33%
    page Chargement: 100%
    En attente de redirect
    pages IMPRESSION
    QPainter :: begin(): Renvoyé false
    QPainter :: begin(): retourné f ALSE
    QPainter :: save: Peintre pas actif
    QPainter :: Echelle: Peintre pas actif
    QPainter :: setRenderHint: Peintre doit être actif pour définir le rendu des notes
    QPainter :: SetBrush: Peintre pas actif
    QPainter: : stylo: Peintre pas actif
    QPainter :: SetPen: Peintre pas actif

  3. HtmlToPdf (http://www.ultrashareware.com/html-to-pdf.htm)

Alors maintenant je cherche de l'aide. Quelqu'un peut-il répondre:

Quelle bibliothèque PHP fonctionnerait bien dans mon cas?

Pourquoi ces erreurs se produisent-elles dans les applications de ligne de commande?

+0

L'erreur "Gtk-WARNING **: Impossible d'ouvrir l'affichage:: 0.0" est parce que l'application utilise le système de fenêtrage. Je suppose que l'erreur se produit parce que l'application essaie d'ouvrir le fichier PDF après sa génération? – rogeriopvl

+0

non, il ne pas ouvrir pdf après génération. Mais il ouvre une petite fenêtre en l'utilisant dans la console. –

+0

Parce qu'il y a tellement de questions similaires à celle-ci mais pas tout à fait pareil, j'ai décidé d'essayer de rassembler une liste complète de convertisseurs HTML en PDF en une question wiki communautaire http://stackoverflow.com/questions/3178448/list- of-html-to-pdf-convertisseurs – rjmunro

Répondre

7

En ce qui concerne wkhtmltopdf:

  • Cette chose fonctionne extrêmement rapide et il peut également gérer tous les types de HTML/CSS vous lancez, alors quand vous avez besoin de vitesse, vous devriez seriosly considérer . Nous y avons récemment opté pour notre entreprise et notre service PDF a été considérablement accéléré.

  • Au moins sous Linux, les bibliothèques XOrg doivent être installées - les serveurs n'en ont généralement pas, ce qui pourrait être votre problème.

+0

Il échoue mal avec les tables multipage – andho

+0

Non, il ne le fait pas. Vous avez juste à gérer ce genre de problème avec css: http://stackoverflow.com/questions/1763639/how-to-deal-with-page-breaks-when-printing-a-large-html-table – Carlos2W

0

Mais que se passe-t-il si vous allez utiliser un service en ligne et envoyer votre contenu HTML sur HTTP? Bien sûr, la plupart d'entre eux ne sont pas gratuits.

+0

pouvez-vous suggérer un service en ligne et leur URL/lien –

+0

http://www.freepdfconvert.com est gratuit, comme son nom l'indique. D'un autre côté, l'automatisation de son utilisation n'est peut-être pas la chose la plus facile à faire, mais elle peut prendre un fichier téléchargé ou une URL. – Julian

+0

Et cela pourrait prendre un certain temps pour créer un grand ensemble de PDF. –

0

Une possibilité: avoir le script automatiquement:

  1. Prenez la page Web
  2. Ouvrir cette page dans un navigateur web
  3. Prenez un screencap de cette page
  4. en faire un PDF

l'étape 4 est facile - il y a beaucoup de bibliothèques PHP/cmdline qui vous permettront de mettre des images sur un pdf ou les convertir (par exemple, fp df.)

Pour les étapes 1 à 3 ... vous pourriez essayer de regarder le code d'ici: http://browsershots.org/. Je ne sais pas si ce serait pertinent - il semble que cela nécessite beaucoup d'installation. Peut-être que leur architecture pourrait fonctionner?

+0

mais, qu'en est-il des liens ou des balises d'ancrage dans les pages html? –

+3

C'est une solution terrible. Il va transformer tout le texte en graphiques bitmap.Il utilisera screen css au lieu de print css. Cela montrera seulement la plus grande partie de la page qui peut tenir dans une capture d'écran. Il y a plein de façons de le faire mieux. S'il vous plaît ne faites pas ça! – rjmunro

0

Quelques questions et suggestions:

  • Avez-vous vraiment besoin converti en PDF? Pourquoi? Dans certains cas, il serait préférable de s'en tenir au HTML.
  • La mise à niveau du matériel du serveur qui génère le PDF est-elle une option? J'ai demandé cela parce que si toutes les bibliothèques que vous avez essayées prennent trop de temps à créer, votre seule option pourrait être la mise à jour du serveur.
  • Vous pourriez vouloir résoudre le problème avec l'erreur de ligne de commande. Si cela donne les résultats les plus rapides, alors trouvez un travail autour de lui.
+0

connaissez-vous une application de ligne de commande pour le même en dehors de ceux mentionnés en question? –

+0

Pour PHP, j'ai seulement utilisé dompdf, et j'ai seulement besoin d'imprimer en moyenne 3 pages par appel. Le seul autre générateur de PDF que j'ai utilisé est JasperReports, mais je pense que c'est seulement pour Java. Peut-être que vous pourriez le plus trace de la pile de l'erreur que vous obtenez de la ligne de commande. – Randell

2

Essayez ceci:

+1

@FDisk , J'ai déjà essayé et j'ai également mentionné même dans ma question –

1

Avez-vous essayé Prince?

+2

hmmmmmm? mais c'est cher, coûte 495 USD! –

+2

DocRaptor.com utilise Prince comme moteur (vous obtenez donc les mêmes résultats impressionnants), mais c'est beaucoup moins cher (gratuit pour les petits plans). – Julie

+2

Hmm. Votre historique de réponses suggère que vous avez un intérêt pour ce service Julie - que diriez-vous d'un peu de divulgation complète hein? –

0

Il y a beaucoup de solution pour convertir le HTML en PDF, je peux vous suggérer une par https://grabz.it.

Les ont une API PHP flexible qui peut être utilisée par cronjobs ou directement à partir de la page web PHP.

Si vous voulez l'essayer, au début, vous devriez obtenir une app key + secret d'autorisation et les development free SDK

Voici un exemple d'implémentation de base.

//First init 
include("GrabzItClient.class.php"); 

// Create the GrabzItClient class 
// Replace "APPLICATION KEY", "APPLICATION SECRET" values for your account! 
$grabzIt = new GrabzItClient("Application Key", "Application Secret"); 

// To take a PDF screenshot 
$grabzIt->URLToPDF("http://www.google.com"); 

// To save in case public callback handler is available 
$grabzIt->Save("http://www.example.com/handler.php"); 
// OR To save in case public callback handler is not available, 
// it's a synchonous method can be usedthe will force your application to wait 
// while the screenshot is created 
$filepath = "images/result.jpg"; 
$grabzIt->SaveTo($filepath);  

Il est possible d'obtenir d'autres types de captures d'écran tels que image screenshot and etc.

Questions connexes