Печать простого текста с помощью API javax.print - PullRequest
2 голосов
/ 10 марта 2011

Я хочу напечатать обычный текст (вероятно, cp1252 или что-то другое, что использует Windows) в определенную службу печати. Звучит легко, правда? Но успех, похоже, сильно зависит от типа используемого вами принтера.

У меня есть три разных принтера. Один из них - HP LaserJet (обычный принтер), другой - Free PDF (виртуальный принтер PDF), а другой - Tobit Faxware (виртуальная служба факсов - это то, что я хочу печатать).

В соответствии с поддерживаемыми версиями документов никто не предлагает текстовый или обычный текстовый формат.

Когда я печатаю, используя DocFlavor.URL.AUTOSENSE, принтер HP будет печатать текст правильно, но два других будут молча терпеть неудачу. Так как текстовые DocFlavors не поддерживаются, я не могу дать принтерам больше подсказок, кроме "autosense".

Когда для печати файла используется блокнот Windows, он прекрасно работает на всех трех принтерах. Разница, кажется, в том, что я печатаю «RAW» данные, а блокнот использует «NT EMF 1.008».

Можно ли как-нибудь заставить его работать с использованием java PrintService?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2016

При использовании блокнота 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

0 голосов
/ 10 марта 2011

Можно ли как-нибудь заставить его работать с использованием java PrintService?

Конечно. Вот описание Oracle на Java Print Service .

Я использовал более старую службу печати AWT. При использовании службы печати AWT вам необходимо преобразовать текст в изображение и распечатать изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...