2011-03-10 65 views
2

我想要將純文本(可能是cp1252或Windows正在使用的任何內容)打印到特定的打印服務。聽起來很簡單,對吧?但成功似乎強烈依賴於您使用的打印機類型。使用javax.print打印純文本API

我有三種不同的打印機可用。一個是HP LaserJet(普通打印機),一個是免費PDF(虛擬PDF打印機),另一個是Tobit Faxware(虛擬傳真服務 - 這是我想要打印的內容)。

根據支持的doc風格,none均不提供「text/plain」或任何其他「text」格式。

當我使用DocFlavor.URL.AUTOSENSE打印時,HP打印機將正確打印文本,但其他兩個將默默失敗。由於「文本」DocFlavors不受支持,我無法給打印機提供除「自動感應」之外的更多提示。

當使用Windows'記事本打印文件時,它對所有三臺打印機都正常工作。差異似乎是我打印「RAW」數據,而記事本使用「NT EMF 1.008」。

有什麼辦法讓我使用java PrintService工作嗎?

回答

0

有什麼辦法讓我使用java PrintService工作嗎?

當然。這裏是Oracle寫在Java Print Service上的文章。

我已經使用了舊的AWT打印服務。使用AWT打印服務,您必須將文本轉換爲圖像,然後打印圖像。

+0

圖片借來不會起作用,因爲傳真打印驅動程序掃描關鍵字輸出。 – Stroboskop 2011-03-21 08:39:42

+0

其實......我注意到有時會在PrintJob中「繪製」一個文本,使用drawString會導致您可以標記文本(使用FreePDF作爲打印機)。但它不能一直工作,因爲大部分時間組件將被圖像切片中的PrintJob切斷,然後沒有文本。 我還沒有找出何時使用哪種方法。 – Stroboskop 2017-05-30 13:02:52

0

當使用Windows的記事本[NT EMF 1.008] [...]它工作正常,所有三個打印機

的FreeHEP提供EMF輸出格式爲Java:http://java.freehep.org/,這是一個二進制文件根據增強型圖元文件格式驅動程序創建。

public void write(EMFOutputStream emf) throws IOException { 
    emf.writePOINTL(pos); 
    emf.writeDWORD(string.length()); 
    emf.writeDWORD(8 + 28 + 40); // TagHeader + ExtTextOutA + Text 
    emf.writeDWORD(options); 
    emf.writeRECTL(bounds); 
    int pad = (string.length()) % 4; 
    if (pad > 0) 
     pad = 4 - pad; 
    emf.writeDWORD(8 + 28 + 40 + string.length() + pad); // offset to 
                 // character 
                // spacing array 
    emf.writeBYTE(string.getBytes()); 
    for (int i = 0; i < pad; i++) 
     emf.writeBYTE(0); 
    for (int i = 0; i < string.length(); i++) 
     emf.writeDWORD(widths[i]); 
} 

樣品從programcreek.com