2011-12-22 13 views
4

現在、私はPHPのバックエンドシステムに直接印刷する機能を追加しています。私はGoogleのクラウドプリントで作業するよう努力しています。このアプリをオンラインショッピングカートとして想像して、ピッキングノート(注文完了)を印刷して、誰かがログインする必要はありません。サーバーはリモートで、宛先にクラウド対応プリンタがあります。GoogleクラウドプリントによるPHPの印刷

これまでは、HTML、プレーンテキスト、またはURLをPDFに渡すだけで、interfacesを使用して印刷することに成功しました。私は、印刷物を色、余白、印刷品質に設定することができます。

問題が発生した場合、システムが作成するPDFは一般にアクセスできないため、URLをファイルに渡すことはできません。ファイルの内容を渡す必要があります。

私はウェブで見つけた例の1つを修正するために成功していませんでしたHERE。しかし、私は言語を知らないので、苦労しています。

python HEREの別の例でも、私は成功なしにもう一度試しています!

私はPHPとZendフレームワークを使用してインターフェイスを操作しています。ここで私が試した1つのサンプルは、私が送信するファイルを準備しようとしている場所に切り捨てられています。私はPythonからPHPへの翻訳が本当に確実ではない、あるいはPythonスクリプトがうまくいけばあなたが要求提出で、他のパラメータを送信する必要がbase64でエンコードされたコンテンツ送信するためには

<?php 
// Test print a job: 
$b64_pathname = PDF_PATH.'ec22c3.pdf'.'.b64'; 
$fileType = "application/pdf"; 
// Open the original file and base64 encode it: 
$dataHandle = fopen(PDF_PATH.'ec22c3.pdf', "rb"); 
$dataContent = fread($dataHandle, filesize(PDF_PATH.'ec22ed167763a15e8591a3776f3c65c3.pdf')); 
fclose($dataHandle); 
$b64data = $fileType.base64_encode($dataContent); 
// Store the base64 encoded file: 
$ourFileHandle = fopen($b64_pathname, 'w'); 
fwrite($ourFileHandle, $b64data); 
fclose($ourFileHandle); 
// Read the contents of the base64 encoded file and delete it: 
$fileHandle = fopen($b64_pathname, "rb"); 
$fileContent = fread($fileHandle, filesize($b64_pathname)); 
fclose($fileHandle); 
unlink($b64_pathname); 
// URL encode the file contents: 
$file = urlencode($fileContent); 
// Add the file and send to the printer: 
$client->setParameterPost('content', $file); 
$client->setParameterPost('contentType', $fileType); 
$client->request(Zend_Http_Client::POST); 
?> 
+0

これを試してみます。 – Cymbals

答えて

1

:私が思い付いた ます。$ client-> setParameterPost( 'contentTransferEncoding'、 'base64での');

2

ここでは、cUrlを使用したPHPのメソッドです(注:_auth、_username、_passwordというオブジェクトレベルの変数があります。& _printerId)。

まず、カールを投稿する機能を構築:

function processRequest($url, $postFields, $referer) { 
    $ret = ""; 
    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL,$url); 
    curl_setopt($ch, CURLOPT_USERAGENT, ""); 
    if(!is_null($postFields)) { 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, 
      $postFields); 
     // http_build_query() will properly escape the fields and 
     // build a query string. 
    } 

    if(strlen($this->_auth) > 0) { 
     $headers = array(
     "Authorization: GoogleLogin auth=". $this->_auth, 
     //"GData-Version: 3.0", 
     "X-CloudPrint-Proxy", "yourappname" 
     ); 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    } 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_REFERER, $referer); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  

    $ret = curl_exec ($ch); 

    curl_close ($ch); 

    return $ret; 
} 

その後、機能をGoogleに対して許可する:最後に

public function authorize() { 
    $url = "https://www.google.com/accounts/ClientLogin"; 
    $post = array("accountType" => "HOSTED_OR_GOOGLE", 
    "Email" => $this->_username, 
    "Passwd" => $this->_password, 
    "service" => "cloudprint", 
    "source" => "yourappname"); 
    $resp = $this->processRequest($url, $post, ""); 

    preg_match("/Auth=([a-z0-9_\-]+)/i", $resp, $matches); 
    $this->_auth = $matches[1]; 
    } 

、クラウドプリンタに提出する機能を構築:

function printDocument($title, $docBytes) 
{ 
    $url = "http://www.google.com/cloudprint/submit?printerid=". $this->_printerId."&output=json"; 

    $post = array(
     "printerid" => $this->_printerId, 
     "capabilities" => "", 
     "contentType" => "dataUrl", 
     "title" => $title, 
     "content" => 'data:application/pdf;base64,'. base64_encode($docBytes) 
    ); 

    $ret = $this->processRequest($url, $post, ""); 

    echo $ret; 
} 

使用時には、認証トークンを取得するためにauthorize()を呼び出します。次に、あなたのファイルを(どこからでも)変数に読み込んで、それをタイトル付きのprintDocumentに渡します。

+0

Auth変数には何がありますか? –

+0

@MatthewDolman '$ this - > _ auth = $ matches [1];' – Armin

関連する問題