Ben bir PDF formu ve çıkış kullanıcıya birleştirilmiş PDF bir XFDF'den birleştirmek için pdftk uygulamasını kullanan bir PHP komut dosyası yazmak çalışıyorum. Pdftk belgelerine göre, ben stdin
via form verilerini geçmek ve stdout
akışı PDF çıkış olabilir. Komut satırından PDFTK kullanmak için normal dosya değil-stream yoludur:
pdftk blankform.pdf fill_form formdata.xfdf output filledform.pdf
Komut satırında akışlarını kullanmak için, girmek istiyorum:
pdftk blankform.pdf fill_form - output -
Ben birkaç sorun var:
1) stdout
bir xfdf dosyasını kullanarak (yerine stdin
) şöyle aracılığıyla çıktı dönmek PDFTK aldık:
exec("pdftk blankform.pdf fill_form formdata.xfdf output -", $pdf_output);
file_put_contents("filledform.pdf",$pdf_output);
Ama oluşturur pdf Adobe Reader göre, bozuk ve bir metin editörü ile dosyanın hızlı bir gözetleme en azından, onlar olması gerektiği satır sonlarını ayarlama değil, gösterir. Ben bunu bir dosyaya çıktı ve pdf metin editörü ince görünüyor pdftk tarafından oluşturulan özdeş bir PDF var, bu yüzden o kadar kötü, veri çıkışı oluyor Pdftk değil biliyorum.
2) Ben bana yaşam için ben pdftk benim girdi olarak bu akış kullanın böylece PHP stdin
akışı ayarlamak için nasıl anlamaya olamaz. Ben PHP belgelerinde okuyorum ne, stdin
, yalnızca-okunur, bu nedenle nasıl bir şey hiç o akışı içine alır?
İdeal olarak, bu gerçekten basit tutmak ve proc_open()
kullanmaktan kaçınmak istiyorum. Ben bu işlevi kullanmak için çalıştı ve çok sucessful değildi, değil işlevi adlı, muhtemelen benim hatam olduğunu, ama gerçekten benim goller doğrusu ben ihtiyaç duymayan sağlam fonksiyonlarını kullanarak kaçındığınız yeterince basittir.
İdeal benim kod gibi bir şey olacaktır:
$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 -);
Sadece bir mezartaşı yukarıya, o komut satırında gerçek xml dize koymak mümkündür, ama bu ile very güvenilmez sonuçlar yaşadım.
Edit
Çok yardımıyla, şimdi benim asıl soru "nasıl olabilir boru PHP bir komut satırı yürütme değişken" olduğunu anlıyoruz. Görünüşe proc_open gitmek için en iyi yoldur, ya da en azından en basit. Bu anlamaya sonsuza kadar götürdü ve Google'da araştırma diğerleri mücadele edilebilir anlaşılacağı beri, ben özellikle benim sorun için çalıştı kodunu göndeririz beri:
$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;
}