Vraag HTML + CSS naar PDF converteren met PHP? [Gesloten]


Ik heb een HTML-document (niet XHTML) dat prima wordt weergegeven in Firefox 3 en IE 7. Het gebruikt vrij eenvoudige CSS om het te modelleren en wordt prima weergegeven in HTML.

Ik ben nu op zoek naar een manier om het naar PDF te converteren. Ik heb geprobeerd:

  • DOMPDF: het had enorme problemen met tafels. Ik nam mijn grote geneste tabellen weg en het hielp (voordat het maar tot 128M geheugen gebruikte en stierf - dat is mijn limiet op het geheugen in php.ini) maar het maakt een hele bende tafels en lijkt niet te worden afbeeldingen. De tabellen waren gewoon basisdingen met enkele randstijlen om op verschillende punten enkele lijnen toe te voegen;
  • HTML2PDF en HTML2PS: Ik had hiermee eigenlijk meer geluk. Het maakte een aantal van de afbeeldingen (alle afbeeldingen zijn Google Chart URL's) en de opmaak van de tabel was veel beter maar het leek een complexiteitsprobleem te hebben dat ik nog niet heb uitgedacht en dat bleef hangen met onbekende node_type () -fouten. Niet zeker waar te gaan vanaf hier; en
  • hTMLDOC: dit lijkt goed te werken op eenvoudige HTML, maar heeft bijna geen ondersteuning voor CSS, dus je moet alles in HTML doen (ik wist niet dat het nog steeds 2001 was in Htmldoc-land ...) dus het is nutteloos voor mij.

Ik probeerde een Windows-app met de naam Html2Pdf Pilot die echt een behoorlijk goede klus heeft geklaard, maar ik heb iets nodig dat minimaal op Linux draait en idealiter on-demand draait via PHP op de webserver.

Wat mis ik, of hoe kan ik dit probleem oplossen?


1395


oorsprong


antwoorden:


Belangrijk: Houd er rekening mee dat dit antwoord in 2009 is geschreven en dat het vandaag misschien niet de meest kosteneffectieve oplossing is in 2018. Online-alternatieven zoals PDFShift zijn vandaag beter dan ze toen waren.


Kijk even naar PrinceXML.

Het is absoluut de beste HTML / CSS naar PDF-converter die er is, hoewel het niet gratis is (maar goed, je programmatie is misschien ook niet gratis, dus als het je 10 uur aan werk bespaart, ben je thuis gratis (aangezien je ook moet Houd er rekening mee dat voor de alternatieve oplossingen u een dedicated server met de juiste software moet instellen)

Oh ja, had ik al gezegd dat dit de eerste (en waarschijnlijk enige) HTML2PDF-oplossing is die vol doet Acid2 ?

PrinceXML-voorbeelden


442



Kijk even naar wkhtmltopdf . Het is een open source, gebaseerd op een webkit en gratis.

We hebben een kleine tutorial geschreven hier.

EDIT (2017):

Als het iets zou bouwen vandaag, zou ik die weg niet meer gaan.
Maar zou gebruiken http://pdfkit.org/ in plaats daarvan.
Waarschijnlijk ontdoet het van al zijn nodejs afhankelijkheden, om in de browser te draaien.


627



Na enig onderzoek en algemene haartrekking lijkt de oplossing te zijn HTML2PDF. DOMPDF heeft een vreselijke klus geklaard met tabellen, grenzen en zelfs redelijk complexe lay-out en htmldoc lijkt redelijk robuust maar is bijna volledig CSS-onwetend en ik wil niet teruggaan naar HTML-layout zonder CSS alleen voor dat programma.

HTML2PDF zag er het meest veelbelovend uit, maar ik bleef deze rare fout houden over null-referentieargumenten naar node_type. Ik heb eindelijk de oplossing hiervoor gevonden. Kortom, PHP 5.1.x werkte prima met regex vervangt (preg_replace_ *) op strings van elke grootte. PHP 5.2.1 introduceerde een php.ini-configuratie-instructie genaamd pcre.backtrack_limit. Wat deze config-parameter doet, is de lengte van de tekenreeks beperken waarvoor afstemming wordt uitgevoerd. Waarom dit werd geïntroduceerd weet ik niet. De standaardwaarde is gekozen als 100.000. Waarom zo'n lage waarde? Nogmaals, geen idee.

EEN bug is hiervoor verheven tegen PHP 5.2.1, die nog steeds open is bijna twee jaar later.

Wat hier griezelig over is, is dat wanneer de limiet wordt overschreden, de vervanger gewoon wordt vervangen mislukt stil. Als er tenminste een fout was opgetreden en geregistreerd, zou je een indicatie hebben van wat er is gebeurd, waarom en wat je moet veranderen om het te repareren. Maar nee.

Dus ik heb een 70k HTML-bestand om in PDF te veranderen. Het vereist de volgende php.ini-instellingen:

  • pcre.backtrack_limit = 2000000; # waarschijnlijk meer dan ik nodig heb, maar dat is OK
  • memory_limit = 1024M; # Ja, een gigabyte; en
  • max_execution_time = 600; # Ja, 10 minuten.

Nu heeft de scherpzinnige lezer misschien gemerkt dat mijn HTML-bestand kleiner is dan 100.000. De enige reden dat ik kan raden waarom ik dit probleem heb geraakt, is dat html2pdf een conversie naar xhtml doet als onderdeel van het proces. Misschien nam dat me over (hoewel bijna 50% zwelling raar lijkt). Hoe het ook zij, het bovenstaande werkte.

Nu is html2pdf een resource-hog. Mijn 70k-bestand duurt ongeveer 5 minuten en minimaal 500-600M RAM om een ​​PDF-bestand van 35 pagina's te maken. Niet snel genoeg (veruit) voor een real-time download helaas en het geheugengebruik brengt de geheugengebruiksratio in de orde van 1000-tegen-1 (600M RAM voor een 70k-bestand), wat volkomen belachelijk is.

Helaas is dat de beste die ik bedacht heb.


141



Waarom probeer je het niet mPDF versie 2.0? Ik gebruikte het voor het maken van een PDF-document. Het werkt goed.

Ondertussen bevindt mPDF zich bij versie 5.7 en wordt het actief onderhouden, in tegenstelling tot HTML2PS / HTML2PDF

Maar houd er rekening mee dat de documentatie echt moeilijk te hanteren is. Neem bijvoorbeeld een kijkje op deze pagina: https://mpdf.github.io/.

Zeer eenvoudige taken rond html naar pdf kunnen met deze bibliotheek worden gedaan, maar meer complexe taken zullen enige tijd duren om de documentatie te lezen en te "begrijpen".


115



1) gebruik MPDF !

a) uittreksel in yourfolder

b) creëren file.php in yourfolder en voer een dergelijke code in:

<?php
include('../mpdf.php');
$mpdf=new mPDF();
$mpdf->WriteHTML('<p style="color:red;">Hallo World<br/>Fisrt sentencee</p>');
$mpdf->Output();   exit;
 ?>

c) open file.php vanuit uw browser






2) Gebruik pdftohtml !

1) extract pdftohtml.exe naar uw hoofdmap:

2) in die map, in anyfile.php bestand, plaats deze code (ervan uitgaande dat er ook een bron example.pdf is):

<?php
$source="example.pdf";
$output_fold="FinalFolder";

    if (!file_exists($output_fold)) { mkdir($output_fold, 0777, true);}
$result= passthru("pdftohtml $source $output_fold/new_filename",$log);
//var_dump($result); var_dump($log);
?>

3) Voer in FinalFolder, en er zullen de geconverteerde bestanden zijn (net zoveel pagina's, als de bron-pdf had ..)


60



Uitchecken TCPDF. Het heeft wat HTML-naar-PDF-functionaliteit die misschien genoeg is voor wat je nodig hebt. Het is ook gratis!


51



ik stel voor DocRaptor (die gebruikt PrinceXML als de "motor")


29



Gewoon om de draad over te slaan, ik heb DOMPDF geprobeerd en het werkte perfect. Ik heb gebruikt DIV en andere blokniveau-elementen om alles te positioneren, hielden het strikt CSS 2.1 en het speelde veru leuk.


25



Goed nieuws! pittig!!

Snappy is a erg makkelijk open source PHP5-bibliotheek, waarmee thumbnails, momentopnamen of PDF-generaties vanaf een url of een html-pagina kunnen worden gemaakt. En ... het gebruikt de uitstekend WebKit-gebaseerde wkhtmltopdf

Genieten! ^ _ ^


24



Nou, als je een perfecte XHTML + CSS naar PDF-converterbibliotheek wilt vinden, vergeet het dan. Het is allesbehalve mogelijk. Omdat het net zoiets is als het vinden van een perfecte browser (XHTML + CSS rendering engine). Hebben we er een? IE of FF?

Ik heb wat succes gehad met DOMPDF. Het punt is dat je je HTML + CSS-code moet aanpassen aan de manier waarop de bibliotheek moet werken. Verder heb ik redelijk goede resultaten.

Zie hieronder:

Originele HTML

HTML naar PDF converteren


22



Het is al genoemd, maar ik wil alleen maar bevestigen dat mpdf de eenvoudigste, krachtigste en meest gratis HTML-naar-pdf-converter is die er is. De lucht is echt de limiet. U kunt zelfs pdf's genereren van dynamische, door gebruikers gegenereerde gegevens.

Een klant wilde bijvoorbeeld een CMS-systeem zodat hij de tracklijst kon bijwerken van de muziek die hij in zijn club speelde. Dat was geen probleem, maar hij wilde ook dat gebruikers een .pdf van de afspeellijst konden downloaden, en dus moest deze downloadbare pdf ook door de cms worden bijgewerkt. Dankzij mpdf kon ik precies dat doen, met een paar simpele loops en gestreamde variabelen. Iets waarvan ik dacht dat het me weken zou kosten, kostte me letterlijk minuten.

Super goed artikel dat heeft me geholpen om te beginnen.


19