PDF-Erzeugung mit "PHP WK HTML to PDF"

am 08.06.2017 - 18:45 Uhr in
Hallo,
ich versuche, lokal (Win7, XAMPP 7, PHP 7) das DRUPAL-Module "phpwkhtmltopdf" zum Laufen zu bringen.
Dazu hab ich das benötigte "WkHtmlToPdf" installiert ('C:\Program Files\wkhtmltopdf').
Außerdem die LIBs wie im ReadMe beschrieben:
You basically want to make sure you have the following files:
* `[siteroot]/sites/all/libraries/phpwkhtmltopdf/src/Pdf.php`
* `[siteroot]/sites/all/libraries/php-shellcommand/src/Command.php`
* `[siteroot]/sites/all/libraries/php-tmpfile/src/File.php`
Unter status:
Verify the libraries are installed correctly by visiting your sites Status page (admin/reports/status).
You should see a reported version for the following items:
* PHPWkHtmlToPdf
* php-shellcommand
* php-tmpfile
ist alles OK.
Aber es passiert NICHTS!
D.h. ich habe ein Modul mit einem Aufruf
...
$pdf = new WkHtmlToPdf();
$pdf->addPage('<html>HELLO</html>');
dpm($pdf);
$pdf->send('test.pdf');
...
Hat jemand eine Idee, was hier vielleicht fehlt, welche Einstellungen wo vorgenommen werden müssen o.ä. ?
mfG, Michael
- Anmelden oder Registrieren um Kommentare zu schreiben
Hi, wohin sendest Du denn das
am 09.06.2017 - 08:07 Uhr
Hi,
wohin sendest Du denn das PDF?
Wenn Du es speicher möchtest solltest Du eher saveAs verwenden.
$pdf->saveAs('/path/to/report.pdf');
Schau mal hier:
https://github.com/mikehaertl/phpwkhtmltopdf
MfG
Robert
Das ist ja nur eine von mehreren Möglichkeiten,
am 09.06.2017 - 09:23 Uhr
keine der 3 funktioniert.
// ... or send to client as file download
$pdf->send('report.pdf');
damit hatte ich erwartet, daß ich einen download-Dialog kriege.
Ich weiß nicht, ob ich das Zusammenspiel der 3 Komponenten richtig verstanden bzw. richtig eingerichtet habe:
1: das "WkHtmlToPdf" unter 'C:\Program Files\wkhtmltopdf' (installiert mit "wkhtmltox-0.12.4_mingw-w64-cross-win64.exe")
2: das Drupal-Modul "phpwkhtmltopdf"
3: die dort erwähnten 3 libraries "PHPWkHtmlToPdf", "php-shellcommand" und "php-tmpfile", die unter "admin/reports/status" auch richtig erkannt werden
Der Aufruf in meinem Modul ist wie im ReadMe beschrieben:
<?php
if (($library = libraries_load('phpwkhtmltopdf')) && !empty($library['loaded'])) {
$pdf = new WkHtmlToPdf( array(
'ignoreWarnings' => true,
'commandOptions' => array(
'escapeArgs' => false,
'procOptions' => array(
// This will bypass the cmd.exe which seems to be recommended on Windows
'bypass_shell' => true,
// Also worth a try if you get unexplainable errors
#'suppress_errors' => true,
),
),
));
$pdf->addPage('<html>HELLO</html>');
dpm($pdf);
$pdf->send('test.pdf');
}
?>
Die pdf-Variable wird offenbar erzeugt, die Ausgabe dpm($pdf) liefert:
(Object) WkHtmlToPdf
binary (String, 38 characters ) C:\Program Files (x86)\wkhtmltopdf\bin
commandOptions (Array, 2 elements)
escapeArgs (Boolean) FALSE
procOptions (Array, 1 element)
bypass_shell (Boolean) TRUE
tmpDir (NULL)
ignoreWarnings (Boolean) TRUE
version9 (Boolean) FALSE
Die Methoden $pdf->addPage, $pdf->send ... scheinen überhaupt keinen Effekt zu haben, es gibt auch keine Fehlermeldung.
Es funktioniert übrigens auch ohne das options-Array nicht ( also nur mit $pdf = new WkHtmlToPdf(); )
Michael
NACHTRAG:
ich hatte auch "wkhtmltox-0.12.4_mingw-w64-cross-win32.exe" ausprobiert, das liegt dann unter "C:\Program Files (x86)\wkhtmltopdf",
beides auch mit und ohne "binary"-Element im options-Array.
gelöst - aber neue Probleme:
am 12.06.2017 - 12:23 Uhr
nachdem ich das PDF-Generation-Tool "WkHtmlToPdf" (von "C:\Program Files (x86)\wkhtmltopdf") in das DRUPAL-Verzeichnis "\sites\all\libraries" kopiert habe und im PDF-Aufruf darauf verwiesen habe:
<?php
$pdf = new WkHtmlToPdf(array(
...
'binary' => realpath(libraries_get_path('wkhtmltopdf')) . '\bin\wkhtmltopdf',
...
?>
, wird mit $pdf->saveAs('PATH\TO\test.pdf') tatsächlich ein PDF erzeugt.
Was immer noch nicht geht, sind $pdf->send('test.pdf'); und $pdf->send(); - also download-Dialog bzw. inline-display.
Frage 1: Warum nicht?
Vielleicht sollte ich dazu sagen, daß der PDF-Aufruf über AJAX aus jQuery läuft.
Ein anderes Problem:
Ich erzeuge also einen HTML-String mit $pdf->addPage('HELLO ... usw.');, aus dem dann das PDF erzeugt wird.
Dieser HTML-String wird aus verschiedenen DRUPAL-Inhalten zusammengesetzt, wozu auch images gehören, z.B. so:
<img src="' . realpath(path_to_theme(). '/images/logo.png') . '"></img>
Das geht auch, aber die Qualität ist deutlich schlechter, als bei den Originalen.
Frage 2: Gibt es eine Möglichkeit, die Qualität der eingebundenen Bilder zu beeinflussen?
Das wird übrigens auch nicht besser, wenn ich die Grafik über
html { background:url("../images/logo.png") 0 0 no-repeat; }
im CSS einbinde.Michael
Hallo, zu Frage 1 Wohin
am 12.06.2017 - 12:34 Uhr
Hallo,
zu Frage 1
Wohin möchtest Du das PDF senden?
zu Frage 2
ein PDF ist generell komprimiert, daher ist die Qualität immer schlechter, als das Original
Die Kompressionsstärke sollte man je nach Library anpassen
MfG
Robert
das hatte ich doch in meiner ersten Antwort schon geschrieben,
am 12.06.2017 - 12:58 Uhr
in den Erläuterungen zum Drupal-Modul "phpwkhtmltopdf" steht unter Quickstart:
// ... or send to client for inline display
$pdf->send();
// ... or send to client as file download
$pdf->send('test.pdf');
damit erwarte ich die inline-Darstellung im Browser bzw. einen download- bzw. Speichern-unter-Dialog, oder verstehe ich das falsch?
zu 2: wo kann ich denn die Kompressionsstärke für das PDF einstellen?
mfG, Michael
Hallo zu 1 Das ist ein HTML5
am 12.06.2017 - 13:13 Uhr
Hallo
zu 1
Das ist ein HTML5 Feature, das Du das PDF nun auf dem Server gepeichert hast kannst Du es einbetten
https://stackoverflow.com/questions/14081128/how-can-i-embed-a-pdf-viewer-in-a-web-page
zu 2
Das kommt auf die Library an. Im Fall von wkhtmltopdf könnte
--disable-pdf-compression*
etwas bewirken
https://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf-0.9.9-doc.html
MfG
Robert
OK, vielen Dank
am 14.06.2017 - 13:13 Uhr
an HTML5 hatte ich nicht gedacht, das geht natürlich auch anders.
zur Kompression bzw. Auflösung:
In dem HTML-String gibt es z.B. auch ein Image – ein PNG in A4 Größe (210x297mm) mit 300 dpi (als Hintergrund für die ganze Seite).
Wenn ich das so einbinde, ist es sehr viel größer als die Seite, d.h. ich muß ihm explizit eine Größe zuweisen, und zwar mit einem Faktor.
Dieser Faktor ist bei mir lokal 1.3 und auf unserem Server 1 / 1.6.
Was bedeutet das?
Die Angaben
<?php
'page-width' => '2480px',
'page-height' => '3507px',
'page-size' => 'A4',
'dpi' => 300,
?>
'disable-pdf-compression'
gibt lokal einen Fehler und online auch keine Wirkung.mfG, Michael
Hi, aus meinem alten
am 14.06.2017 - 14:05 Uhr
Hi, aus meinem alten Wiki.
Auflösungen werden wie folgt errechnet:
Druckgrössen in welcher Auflösung?
bei 72 dpi (Monitorauflösung) wären es:
595 x 842 pixel
bei 300 dpi (Druckqualität) hingegen:
2480 x 3508 pixel
kannst du ganz einfach selbst errechnen:
dpi = dots per inch
1 inch = 2,54 cm
DIN A4 = 21,0 x 29,7 cm
also: 21 / 2,54 = 8,27 x 72 = 595
MfG
Robert
ja, vielen Dank, das war mir
am 14.06.2017 - 15:14 Uhr
ja, vielen Dank, das war mir auch klar, meine Frage war:
das Image hat die Größe 2480 x 3508 pixel bei 300 dpi.
FRAGE: wie kriege ich das PHP-Tool WkHtmlToPdf (aus dem DRUPAL-Modul "phpwkhtmltopdf" heraus) dazu, das auch in dieser Größe A4-füllend als PDF auszugeben?
- ohne dem img eine skalierte Größe zuweisen zu müssen, in meinem Fall:
w = 2480 / 1.6 = 1550px
h = 3508 / 1.6 = 2192px
so:
<img src="' . realpath(path_to_theme(). '/images/imgTitle.png') . '" width="1550px" height="2192px"></img>
funktioniert es, aber woher kommt dieser Faktor 1 / 1.6 ?
das kann doch nur an den Grundeinstellungen des PHP-Tools WkHtmlToPdf liegen, und da komme ich aus DRUPAL nicht ran.
Michael
Hi, du hast Dir die Grösse
am 14.06.2017 - 16:18 Uhr
Hi,
du hast Dir die Grösse doch selbst ausgerechnet,
damit es auf ein A4 passt.
So wie es aussieht ist Dein Image 1/1.6 grösser, als dass es in ein A4 Blatt passt?
MfG
Robert
NA EBEN NICHT !
am 14.06.2017 - 17:02 Uhr
das Image ist 2480px mal 3507px bei 300 dpi,
das ist genau A4 - sehe ich in PhotoShop.
Ich muß es um 1.6 kleiner machen, damit es in das von WkHtmlToPdf erzeugte PDF paßt.
Warum denn?
Das sieht doch so aus, als würde das PDF-Tool eine andere Größe oder Auflösung erzeugen oder erwarten ???
Michael
Hi, schau mal hier, der
am 15.06.2017 - 10:10 Uhr
Hi,
schau mal hier, der letzte Komment erklärt das vielleicht:
https://github.com/wkhtmltopdf/wkhtmltopdf/issues/1520
Gruss
Robert