PHP печать с Google Cloud Print - PullRequest
       14

PHP печать с Google Cloud Print

4 голосов
/ 22 декабря 2011

В настоящее время я добавляю возможность в бэкэнд-систему php, чтобы она могла печататься напрямую, и я пытаюсь заставить вещи работать с облачной печатью Google. Представьте себе приложение в виде корзины для покупок в Интернете, и я хочу, чтобы оно печатало заметки по комплектации (выполненные заказы) без необходимости входа в систему. Сервер удаленный, а в качестве места назначения установлены принтеры с поддержкой облака.

До сих пор мне удавалось заставить его печатать, используя интерфейсы , пока я просто передаю HTML, простой текст или URL в PDF. Я могу настроить цветную печать без полей и качество печати. ​​

Однако, где я столкнулся с проблемой, PDF-файл, который создает система, не является общедоступным, поэтому я не могу передать URL-адрес файла, мне нужно передать содержимое файла.

Я безуспешно пытался изменить один из примеров, которые я нашел в Интернете ЗДЕСЬ . Однако я не знаю языка, поэтому борюсь с ним.

Еще один пример на python ЗДЕСЬ Я снова безуспешно пытался!

Я использую PHP и Zend Framework для работы с интерфейсом. Вот один пример, который я попробовал, сократить, где я пытаюсь подготовить файл для отправки, как я говорю, я не совсем уверен в переводе с Python на PHP, или если сценарий Python даже работает, но это то, что Я придумал:

<?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);
?>

Ответы [ 2 ]

2 голосов
/ 07 июля 2012

Вот метод в php, использующий cUrl (обратите внимание, у меня есть переменные уровня объекта, называемые _auth, _username, _password & _printerId).

Сначала создайте функцию для публикации с помощью cUrl:

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 с заголовком.

1 голос
/ 16 марта 2012

Для отправки содержимого в кодировке base64 вам необходимо отправить другой параметр в запросе на отправку: $ client-> setParameterPost ('contentTransferEncoding', 'base64');

...