2012-04-23 7 views
12

Ich versuche, ein PDF mit WKHTMLTOPDF zu erstellen, das erfordert, dass ich mich zuerst anmelde. Es gibt bereits einige im Internet, aber ich kann nicht funktionieren. Ich bin im Terminal - nichts Besonderes.Erzeuge PDF hinter der Authentifizierungswand

Ich habe versucht (unter einer ganzen Menge anderer Sachen):

/usr/bin/wkhtmltopdf --post username=myusername --post password=mypassword "URL to Generate" test.pdf 

/usr/bin/wkhtmltopdf --username myusername --password mypassword "URL to Generate" test.pdf 

/usr/bin/wkhtmltopdf --cookie-jar my.jar --post username=myusername --post password=mypassword "URL to Generate Cookie For" 

Benutzername und Passwort sind sowohl die id und die name der Eingabefelder auf dem Formular. Ich bekomme die Datei my.jar angezeigt, aber es wird nichts geschrieben.

Spezifische Fragen:

  1. Sollte ich die Login-Seite werden die Angabe und/oder Form überall Aktion?
  2. Der Parameter --cookie-jar wurde an verschiedenen Stellen erwähnt (sowohl als benötigt als auch anderweitig). Sollte dies notwendig sein, wie funktioniert es? Ich habe die Datei my.jar erstellt, aber wie benutze ich sie erneut? Referenzierung:

http://code.google.com/p/wkhtmltopdf/issues/detail?id=356


EDIT:

Sicherlich jemand dies erfolgreich getan hat? Eine gute Möglichkeit, ein Beispiel zu präsentieren, könnte sein, wenn jemand bereit ist, es auf einer populären Website zum Laufen zu bringen, die Anmeldeinformationen benötigt, um eine potentielle Variable zu eliminieren.

Antwort

8

ich denke, die Form zu komplex einzuloggen ich versuche. Es ist sicher, setzt drei Cookies, leitet zweimal um und postet eine Reihe anderer Variablen außerhalb des Benutzernamens und des Passworts, von denen eines einen Cookie-Wert erfordert (ich habe sogar versucht, den Wert in die Post-Variable zu verketten, aber kein Glück). Dies ist wahrscheinlich ein ziemlich seltenes Problem - keineswegs die Schuld von WKHTMLTOPDF.

Ich beendete CURL, um mich anzumelden und die Seite in eine lokale Datei zu schreiben, dann lief WKHTMLTOPDF dagegen.Definitiv eine solide Arbeit für jeden, der ein ähnliches Problem hat.


Edit: ROTATION, wenn Interesse besteht:

curl_setopt($ch, CURLOPT_HEADER, 1); # Change to 1 to see WTF 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
curl_setopt($ch, CURLOPT_URL, $loginUrl); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
+0

Wäre viel hilfreicher gewesen, diese cURL-Syntax zu umreißen, die den Trick für Sie getan hat. –

+0

Hallo Ifedi, nicht sicher, dass meine spezifische Implementierung tatsächlich hilfreich für Ihren Anwendungsfall (es ist die Post-Zeichenfolge, die spezifisch für meine Bedürfnisse ist, und über PHP implementiert), aber ich habe es hinzugefügt, also hoffentlich hilft es. – Chords

12

Jedes Login-Formular wird für jede Site unterschiedlich sein. Was Sie tun wollen, ist zu bestimmen, was alles Sie brauchen, um das Ziel dieses Login-Formulars zu übergeben, indem Sie den HTML-Code auf der Seite lesen (was Ihnen wahrscheinlich bekannt ist). Es kann ein zusätzliches verstecktes Feld über den Benutzernamen/Passwort-Feldern erforderlich sein, um Cross-Site-Anfragen zu verhindern. Der Cookie-Jar-Parameter ist eine Datei, in der die Cookies gespeichert werden, die er vom Webserver zurückerhält. Sie müssen ihn in der ersten Anfrage an das Login-Formular und in nachfolgenden Anfragen zur weiteren Verwendung des Cookies/der Sitzung angeben . Informationen, die der Webserver Sie nach der Anmeldung zurück gegeben haben wird

Also um es zusammenzufassen:

  1. und sehen, ob es irgendwelche zusätzlichen Parameter auf der Seite erforderlich sind.
  2. Stellen Sie sicher, dass die URL, an die Sie senden, mit dem Attribut ACTION des Formularelements auf dieser Seite übereinstimmt.
  3. Verwenden Sie den Parameter --cookie-jar sowohl in der Anmeldeanforderung als auch in der zweiten Inhaltsanforderung.
  4. Die Syntax für die --post Parameter sind --post Benutzername user_name_value --post Passwort password_value
+0

Danke, hsanders. Auch wenn ich eine andere Route gewählt habe, sieht deine Antwort solide aus. Danke, dass du dir die Zeit genommen hast zu antworten! – Chords

+0

@Chords Kein Problem. Ich habe wkhtmltopdf schon einige Male benutzt. Ich denke, für einen komplizierteren Fall, wie den, den du beschrieben hast, ist es ein bisschen mühsam zu benutzen ... Ich bin mir nicht sicher, wie es mit den Weiterleitungen umgehen würde, die du in deinem Follow-up erwähnt hast. – hsanders

3

Sie könnten bei dem Versuch interessiert sein mit phantomjs zu PDF zu machen.

phantomjs rasterize.js http://blah.com/ webgl.pdf 

Sie finden rasterize.js here. Im Grunde schreiben Sie etwas Javascript, um sich auf der Login-Seite anzumelden, dann machen Sie die PDF-Erstellung.

Die Ausgabe ist jedoch nicht identisch mit wkhtmltopdf. Sie können den HTML-Code einfach in einer Datei speichern und dann mit wkhtmltopdf rendern, wenn die PDF-Ausgabe von phantomjs zu schrecklich ist.