Wie man Variablen als stdin von PHP in die Kommandozeile übergibt

Ich versuche, ein PHP-Skript zu schreiben, das das verwendetpdftk App, um ein XFDF mit einem PDF-Formular zusammenzuführen und das zusammengeführte PDF an den Benutzer auszugeben. Laut pdftk-Dokumentation kann ich die Formulardaten per übermittelnstdin und habe die PDF ausgabe an diestdout Strom. Der normale Weg, pdftk von der Kommandozeile aus zu benutzen, ist:

pdftk blankform.pdf fill_form formdata.xfdf output filledform.pdf

Um Streams in der Befehlszeile zu verwenden, geben Sie Folgendes ein:

pdftk blankform.pdf fill_form - output -

Ich habe ein paar Probleme:

1) Ich habe pdftk bekommen, um die Ausgabe über zurückzugebenstdout Verwenden einer xfdf - Datei (anstelle vonstdin) wie folgt:

    exec("pdftk blankform.pdf fill_form formdata.xfdf output -", $pdf_output);
    file_put_contents("filledform.pdf",$pdf_output);

Aber das PDF, das es erstellt, ist laut Adobe Reader beschädigt, und ein kurzer Blick auf die Datei mit einem Texteditor zeigt, dass es zumindest nicht die Zeilenenden festlegt, an denen sie sein sollten. Ich habe eine identische PDF-Datei, die von pdftk erstellt und in eine Datei ausgegeben wurde, und die PDF-Datei sieht im Texteditor gut aus. Daher weiß ich, dass nicht pdftk schlechte Daten ausgibt.

2) Ich kann für das Leben von mir nicht herausfinden, wie man das einstelltstdin streamen Sie in PHP, damit ich diesen Stream als Eingabe für pdftk verwenden kann. Nach dem, was ich in der PHP-Dokumentation lese,stdin ist schreibgeschützt, wie kommt also jemals etwas in diesen Stream?

Idealerweise möchte ich das sehr einfach halten und vermeiden, es zu benutzenproc_open(). Ich habe versucht, diese Funktion zu verwenden und war nicht sehr erfolgreich, was wahrscheinlich meine Schuld ist, nicht die der Funktion, aber in Wirklichkeit sind meine Ziele einfach genug. Ich würde es lieber vermeiden, robuste Funktionen zu verwenden, die ich nicht benötige.

Im Idealfall würde mein Code ungefähr so aussehen:

 $form_data_raw = $_POST;
 $form_data_xfdf = raw2xfdf($form_data_raw); //some function that turns HTML-form data to XFDF

 $blank_pdf_form = "blankform.pdf";

 header('Content-type: application/pdf');
 header('Content-Disposition: attachment; filename="output.pdf"');

 passthru("pdftk $blank_pdf_form fill_form $form_data_xfdf output -);

Nur ein Kopf hoch, es ist möglich, den eigentlichen XML-String in die Kommandozeile zu stellen, aber ich hattesehr unzuverlässige Ergebnisse damit.

Bearbeiten

Mit viel Hilfe verstehe ich jetzt, dass meine eigentliche Frage lautete: "Wie kann eine Variable in PHP an eine Befehlszeilenausführung weitergeleitet werden?". Anscheinend ist proc_open der beste Weg, oder zumindest der einfachste. Da ich ewig gebraucht habe, um das herauszufinden, und da meine Recherchen bei Google andeuten, dass andere Probleme haben, werde ich den Code veröffentlichen, der speziell für mein Problem funktioniert hat:

$blank_pdf_form = "blankform.pdf";
$cmd = "pdftk $blank_pdf_form fill_form - output -";

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w")
);

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {

    //row2xfdf is made-up function that turns HTML-form data to XFDF
    fwrite($pipes[0], raw2xfdf($_POST));
    fclose($pipes[0]);

    $pdf_content = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $return_value = proc_close($process);

    header('Content-type: application/pdf');
    header('Content-Disposition: attachment; filename="output.pdf"');
    echo $pdf_content;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage