使用javax.print API打印纯文本

时间:2011-03-10 15:37:19

标签: java printing

我想将纯文本(可能是cp1252或Windows正在使用的任何内容)打印到特定的打印服务。听起来很简单吧?但成功似乎在很大程度上取决于您正在使用的打印机类型。

我有三种不同的打印机。一个是HP LaserJet(普通打印机),一个是Free PDF(一个虚拟PDF打印机),一个是Tobit Faxware(虚拟传真服务 - 这就是我要打印到的)。

根据支持的doc flavor,none提供“text / plain”或任何其他“text”格式。

当我使用DocFlavor.URL.AUTOSENSE打印时,HP打印机将正确打印文本,但其他两个将无声地失败。由于不支持“文本”DocFlavor,我不能给打印机提供除“autosense”之外的任何其他提示。

使用Windows的记事本打印文件时,它适用于所有三台打印机。差异似乎是我打印“RAW”数据,而记事本使用“NT EMF 1.008”。

有没有办法让我使用java PrintService工作?

2 个答案:

答案 0 :(得分:0)

  

有没有办法让我使用java PrintService工作?

不确定。这是Oracle在Java Print Service上的写作。

我使用过旧的AWT打印服务。使用AWT打印服务,您必须将文本转换为图像,然后打印图像。

答案 1 :(得分:0)

  

使用Windows'记事本[NT EMF 1.008] [...]它适用于所有三台打印机

FreeHEP为Java提供EMF输出格式: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

借来的样本