2012-07-10 21 views
2

對於一家保險公司,我創建了各種保險應用程序的PDF表格。這些將在其網站上提供(完成時)。每個PDF格式的表格都與應用程序的打印版本非常相似。這個想法是,用戶在線填寫它,點擊表格底部的(可見但不可打印)「提交」按鈕,並將完整的PDF發送給公司。這樣他們可以打印出來,並繼續使用他們目前的紙質文件歸檔系統。將整個PDF表格提交給PHP腳本

我嘗試使用提交按鈕的「mailto:...」URL,但這需要一個外部郵件程序。它也給附加的PDF一個隨機的臨時文件名。

因此,我想發送PDF到一個PHP腳本,更改名稱,並從那裏通過電子郵件發送給公司。我玩了一下,我可以到達目的地腳本,但我不知道PDF會發生什麼。我希望它顯示在$ _FILES中,但沒有。

保存到數據庫不是一個選項。

在準備PDF表單時,您可以選擇要如何提交:作爲HTML表單(如Sepodati所述),作爲XML數據,作爲FDF(僅發送數據,並且在顯示時會打開原始PDF數據),或作爲完整的PDF。爲了方便網站所有者(不具備計算機能力)使用,我將向他們發送完整的PDF,以供他們打印。

所以,同樣的問題仍然存在:當我到達我的目標腳本時,我的PDF文件到達哪裏?

我通過PDF上的提交按鈕提交PDF。您必須熟悉PDF表單才能理解這一點。對於URL,我放置了目標PHP腳本。

在我的目的地的腳本,我嘗試以下 PHP代碼:

reset ($_FILES); 
    while (list ($key, $val) = each ($_FILES)) { 
     echo "$key => $val<br />\n"; 
    } 

我這樣做是爲了_FILES $,$ _GET,$ _ POST和$ _REQUEST。沒有出現,就好像每個陣列都是空的。不過,我可能做錯了。

我把phpinfo()函數在腳本中,而這些增值經銷商出現相關PDF ...

_SERVER["CONTENT_LENGTH"] = 37722 
_SERVER["CONTENT_TYPE"] = application/pdf 
_SERVER["HTTP_USER_AGENT"] = Mozilla/4.0 (compatible; Adobe Acrobat Control Version 5.00 for ActiveX) 
_SERVER["REQUEST_METHOD"] = POST 

內容長度大約是PDF的大小。

別的東西,我以前沒注意到的是,在提交時,Internet Explorer顯示此頁面(或像它的名稱):

C:\WINDOWS\TEMP\pa003773.html 

本頁面包含了所有從我的腳本輸出。

回答

1

這是非常有趣的,它應該發送整個PDF。我很想知道它是如何實現的,因爲我已經在Adobe網站上搜索了關於如何通過點擊PDF表單上的按鈕來提交整個PDF文件的信息。

我在他們的網站上發現的唯一信息是關於FDF和XFDF格式的信息。這兩種格式都必須由表單處理程序腳本以某種方式進行解析,並且不包括在$ _FILES中,這是文件從文件系統中選擇時上載文件的方式。

$fptr = fopen("temp.fdf", "w"); 
fputs($fptr, $HTTP_RAW_POST_DATA); 
fclose($fptr); 
+1

[在POST請求的情況下,最好使用'PHP://的代替input''$ HTTP_RAW_POST_DATA'因爲它不依賴於特殊的* php.ini *指令。](http://php.net/manual/en/wrappers.php.php)。這也可以讓你使用['stream_copy_to_stream()'](http://php.net/manual/en/function.stream-copy-to-stream.php),這個內存密集程度要低得多。 – DaveRandom 2012-07-10 19:21:08

0

這是一個非常舊的文章,所以我敢肯定,你現在得到您的答案,但這裏是我的情況下,任何人都跌倒過這個在未來什麼工作。 順便說一句 - 這隻適用於如果您提交完整的表單字段的整個PDF。

你會把你的提交按鈕的地址會是這樣的http://youserver.com/lib/php/[email protected]&formName=Asset%20Inventory

<?php 
    ob_start(); 
    $file = file_get_contents("php://input"); //Gets binary PDF Data 
    $time = microtime(true); 

    //Names pdf file based on the time to the microsecond so nothing gets overwritten. Obviously you can change this to whatever you want or do something like $_REQUEST['formName'] and just include the form name in your URL from your pdf submit button 
    $newfile = "forms/" . $time . ".pdf"; 
    $worked = file_put_contents($newfile, $file); //Creates File 
    ob_end_clean(); 

    //Upon completion you can either return XFDF to update a field on your form or display a PDF document. I chose the PDF route because it worked for our situation. 
    $successFile = 'success.pdf'; 
    $errFileFile = 'error.pdf'; 
    require 'PHPMailer/PHPMailerAutoload.php'; 

    $mail = new PHPMailer; 
    $mail->isSendmail(); 
    $mail->setFrom('From email address', 'from name'); 
    $mail->addReplyTo('Reply to email', 'Reply to name'); 
    $mail->addAddress($_REQUEST['email']); //get email from URL- alternately you can just hardcode in an address 
    $mail->addAttachment($newfile); 
    $mail->isHTML(true); 
    $mail->Subject = 'New form submission'; 
    $mail->Body = 'A new form has been submitted.'; 

    if(!$mail->send()) { 
    header('Content-type: application/pdf'); 
    readfile($errFile); 
    } else { 
    header('Content-type: application/pdf'); 
    readfile($successFile); 
    //if you want to delete the file from the server after emailing: unlink($newfile); 
    } 
?>