2011-03-10 69 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