PhantomJS: exportierte PDF in stdout
Gibt es eine Möglichkeit, trigger-PDF-export-Funktion in PhantomJS ohne Angabe einer Ausgabedatei mit der .pdf-Erweiterung? Wir verwenden möchten stdout
für die Ausgabe der PDF-Datei.
InformationsquelleAutor der Frage Dan | 2012-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits von Niko können Sie
renderBase64()
zum Rendern der web-Seite als Bild-Puffer und gibt das Ergebnis als base64-kodierten string.Aber jetzt funktioniert das nur für PNG, JPEG und GIF.
Etwas zu schreiben, von einem phantomjs script auf stdout nur mit dem Dateisystem-API.
Ich so etwas wie das für Bilder :
Ich weiß nicht, ob das PDF-format für
renderBase64()
wird in einer zukünftigen version von phanthomjs aber als workaround etwas entlang diesen Linien kann für Sie arbeiten:Wo
output
ist der Pfad zu der pdf-Datei.InformationsquelleAutor der Antwort Enrico Mischorr
Können Sie die Ausgabe direkt auf die Standardausgabe ohne die Notwendigkeit für eine temporäre Datei.
page.render('/dev/stdout', { format: 'pdf' });
Sehen hier für die Geschichte, wenn dieser Hinzugefügt wurde.
Wenn Sie möchten, um HTML-von Standardeingabe und-Ausgabe die PDF-Datei auf stdout, siehe hier
InformationsquelleAutor der Antwort philfreo
Sorry für die extrem lange Antwort; ich habe das Gefühl, dass ich dich bitte zu dieser Methode mehrere Dutzend Male in meinem Leben, so werde ich Sie schreiben "eine Antwort, Sie alle zu Knechten". Ich werde zuerst labern ein wenig über Dateien, Datei-Deskriptoren, (named) pipes und Ausgabe-Umleitung, und dann Ihre Frage beantworten.
Betrachten Sie dieses einfache C99 Programm:
Sehr einfach. Es braucht ein argument (der name einer Datei) und druckt Sie text ein. Konnte nicht einfacher sein.
Kompilieren Sie es mit
clang write_to_file.c -o write_to_file.o
odergcc write_to_file.c -o write_to_file.o
.Nun
./write_to_file.o some_file
(die Drucke insome_file
). Dann laufencat some_file
. Das Ergebnis, wie erwartet, istsome text...
Nun lassen Sie uns mehr Lust. Geben Sie
(./write_to_file.o /dev/stdout) > some_file
im terminal. Wir bitten Sie, das Programm zu schreiben, um seine standard-Ausgabe (statt einer regulären Datei), und dann sind wir die Umleitung, diestdout
zusome_file
(mit> some_file
). Wir habe verwendet die folgenden zu erreichen:(./write_to_file.o /dev/stdout) > some_file
was bedeutet, "verwendenstdout
"(./write_to_file.o /dev/stderr) 2> some_file
was bedeutet, "verwendenstderr
auf, und leiten Sie es mit2>
"(./write_to_file.o /dev/fd/2) 2> some_file
das ist das gleiche wie oben;stderr
ist die Dritte Datei-Deskriptor zugewiesen Unix-Prozesse standardmäßig (nachstdin
undstdout
)(./write_to_file.o /dev/fd/5) 5> some_file
was bedeutet "verwenden Sie Ihre sechste Datei-Deskriptor, und leiten es ansome_file
"In Fall ist es nicht klar, wir sind mit einer Unix-pipe anstelle der eigentlichen Datei (alles ist eine Datei in Unix). Wir können machen alle Arten von fancy Dinge, die mit dieser Leitung: Sie schreiben es in eine Datei, oder schreiben Sie es auf eine named pipe, und teilen Sie Sie zwischen verschiedenen Prozessen.
Erstellen wir jetzt eine named pipe:
Wenn Sie
ls -l
nun, Sie werden sehen:Hinweis: die p am Anfang der zweiten Zeile. Es bedeutet, dass
my_pipe
ist ein (named) pipe.Nun, lassen Sie uns festlegen, was wir wollen mit unserer pipe:
Heißt es:
gzip
dem, was ich im innerenmy_pipe
und schreiben Sie die Ergebnisse inout.gz
. Die&
am Ende fordert die shell die Ausführung dieses Befehls im hintergrund. Du wirst etwas wie[1] 10449
und bekommt die Steuerung zurück an das terminal.Dann einfach umleiten der Ausgabe unserer C-Programm, um dieses Rohr:
Oder
Erhalten Sie
was bedeutet, dass die
gzip
Befehl abgeschlossen ist.Nun, tun Sie einen anderen
ls -l
:Haben wir erfolgreich
gzip
ed unser text!Ausführen
gzip -d out.gz
zu Dekomprimieren diesergzip
ed-Datei. Es wird gelöscht und eine neue Datei (out
) erstellt werden.cat out
bekommt uns:das ist, was wir erwartet haben.
Vergessen Sie nicht, entfernen Sie das Rohr mit
rm my_pipe
!Nun zurück zu PhantomJS.
Dies ist eine einfache PhantomJS script (
render.coffee
geschrieben in CoffeeScript), nimmt zwei Argumente: eine URL und eine Datei name. Es lädt die URL, macht es und schreibt es in die angegebene Datei name:Nun geben
phantomjs render.coffee news.ycombinator.com hn.png
im terminal zu erbringen Hacker News front page in filehn.png
. Es funktioniert wie erwartet. So hatphantomjs render.coffee news.ycombinator.com hn.pdf
.Lassen Sie uns wiederholen, was wir früher mit unserem C-Programm:
Es funktioniert nicht... 🙁 Warum? Weil, wie gesagt, auf PhantomJS ist die manuelle:
Scheitert es, ganz einfach, weil weder
/dev/fd/2
noch/dev/stdout
Ende in.PNG
usw.Aber keine Angst, named pipes können Sie helfen!
Erstellen Sie eine weitere named pipe, aber dieses mal verwenden Sie die Erweiterung
.pdf
:Nun, dann Sag es einfach
cat
seine inout zuhn.pdf
:Führen:
Und siehe, das schöne
hn.pdf
!Offensichtlich willst du etwas mehr ausgefeilt, dass nur
cat
ing den Ausgang, aber ich bin sicher, es ist jetzt klar, was Sie tun sollten 🙂TL;DR:
Erstellen Sie eine named pipe verwenden ".pdf" - Datei-Erweiterung (so Sie Narren PhantomJS zu denken, es ist eine PDF-Datei):
Tun, was Sie wollen mit dem Inhalt der Datei, wie:
die einfach
cat
s eshn.pdf
In PhantomJS, Rendern, um diese Datei/pipe.
Später, entfernen Sie das Rohr:
InformationsquelleAutor der Antwort Pooria Azimi
Ich weiß nicht, ob es lösen würde Ihr problem, aber Sie können auch überprüfen Sie die neue
renderBase64()
Methode Hinzugefügt PhantomJS 1.6: https://github.com/ariya/phantomjs/blob/master/src/webpage.cpp#L623Leider, die Funktion ist nicht dokumentiert auf der wiki noch :/
InformationsquelleAutor der Antwort NiKo