2011-10-20 334 views
2

我試圖設置一個CLI PHP應用程序來將一組網頁打印到默認或指定的打印機。我使用的是運行在CLI中的PHP 5.2.11的Windows 7機器。要測試打印功能,我已經加載了PHP_printer.dll,並且正在使用PRINTER_ENUM_LOCAL中提供的確切打印機名稱打印到Onenote,一個打印到文件選項。
更新:這是最新的代碼:在PHP中打印到打印機

$handle = printer_open("Send To OneNote 2010"); 
printer_start_doc($handle, "My Document"); 
printer_start_page($handle); 

$filename='index.html'; 
$fhandle=fopen($filename, 'r'); 
$contents = fread($fhandle, filesize($filename)); 
fclose($fhandle); 

printer_set_option($handle, PRINTER_MODE, "RAW"); 
printer_write($handle,$contents); 

printer_end_page($handle); 
printer_end_doc($handle); 
printer_close($handle); 

我已經得到這個代碼打印空白頁到正確的打印機,但我無法打印我傳遞給printer_write字符串。我確認$contents正確填寫了我的測試html文件的內容。無論我提供什麼作爲第二個參數(要打印的字符串),我都會看到一個空白頁。是否有我缺少的東西,至少讓我在網頁上打印一些文字?

或者是有沒有更好的辦法做到這一點(使用PHP/javascript文件)?我試圖做的是通過CLI應用程序打印出現的網頁(包括CSS),網站用PHP編寫,我試圖最大限度地減少複雜性。如果有更好的方式來打印這些(轉換爲PDF和打印顯然是一個選項),我打開它,但它聽起來像這是PHP中最簡單的/事實上的方法。

回答

0

我搞砸了printer.dll的年齡和厭倦了它。

不知道,如果它多大用處,但我購買這個應用程序 http://www.coolutils.com/TotalPDFPrinter

,它讓我打印PDF文件從PHP的CMD線,這對我來說效果不錯,但它確實有一個彈出式屏幕,如果您購買了服務器版本(如果您的apache作爲服務運行,您將需要)才能擺脫。顯然,非彈出式版本的價格更貴。

我掙扎着的一件事是獲得可用的打印機列表,所以我在C#中編寫了這個小應用程序,它以純文本形式打印出打印機列表,然後使用php調用它並將它們放入一個放置列表在我的網頁上。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Drawing.Printing; 

namespace printerlist 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      foreach (String printer in PrinterSettings.InstalledPrinters) 
      { 
       Console.WriteLine(printer.ToString()); 
      } 
     } 
    } 
} 
+0

感謝小費,這是一個不行,但我們必須得到服務器版本,因爲它是一個自動化的過程。 –

2

據我所知,你應該使用php_printer.dll。檢查here。然後,將php_printer.dll擴展名添加到您的php.ini中。如果你已經這樣做了,那麼......

如果您符合資格並提出明確在安裝打印機,其中IP /路由,它應該做的伎倆。像printer_open('\\\\xx.x.xx.xx\\_printername_');。 (本地打印機不需要手動添加服務器,據我所知)

要檢查打印機,你可以試試printer_list(PRINTER_ENUM_LOCAL | PRINTER_ENUM_SHARED)。如果我記得沒關係,在php.ini上有一個printer.default_printer指令。很久以前,在php 5.x安裝上進行了測試。祝你好運。

+0

我已經得到的那部分現在的工作(對不起,我是在書面方式的問題有點倉促),我已經更新,以我目前的狀況,我可以打印空白頁到正確的打印機,但沒有別的。 –

+0

'printer_write'將打印一個字符串,因此更新後的代碼應該可以工作。嘗試使用'fopen()','fread()'和'fclose()'進行具有外部php/txt文件的測試。如果它仍然不起作用,考慮到'printer_open'爲您的本地(?)打印機正確定義,我們應該看看其他地方。 – AleksanderKseniya

+0

剛剛嘗試過,我將文本從文件中剔除,但頁面仍然空白,我在我的問題中更新了代碼。另外,OneNote會抱怨它無法讀取正在打印的「文件類型」,但是我打印的每個屏幕/紙張打印機都給了我一個空白頁面。我想讓這個工作,但它看起來最好是改變我們的VB應用程序來打印,如果你有更多的想法,我一定會嘗試它們。 –