Статьи

Служба печати Java разочаровывает

Вероятно, это не самая захватывающая «игрушка», с которой можно играть в праздничные дни, но я хотел исследовать некоторые варианты использования, которые включают печать через серверные сервисы Java. По сути, в корпоративной среде вы можете столкнуться с требованиями, когда документы, которые вы получаете или генерируете, также должны быть распечатаны по тем или иным причинам. Честно говоря, мне никогда не приходилось иметь дело с печатью Apis на Java, и поэтому я начал с нуля.

Оказывается, что есть 2 подхода (напоминает мне о множестве реализаций Date …). Один из подходов восходит к 1990-м годам и называется Java 2 Print API и больше привязан к пользовательским интерфейсам (UI), запускающим процесс печати. В Java 1.4 был представлен Java Print Service API (JPS) ( JSR 6).), который служит супер-набором Java 2 Print Api.

JPS Api, безусловно, работоспособен, но у меня возникли серьезные проблемы. Для моего первоначального варианта использования я могу получить простые текстовые документы, например XML, которые я хочу отправить на определенный принтер в виде простого текста.

Мне не удалось заставить его работать на моем Mac с Mac OS X 10.6.8. Однако на моей Windows JVM это работало безупречно, и мои текстовые файлы были распечатаны без каких-либо жалоб. На моем Mac, однако, мое маленькое тестовое приложение Java завершается без ошибок, но моя очередь принтера сообщает:

Error: pstopdffilter/pstocupsraster failed with err number -31000

Поиск в Google тоже не сильно помог. Казалось, есть некоторые неподтвержденные свидетельства того, что другие люди могли также иметь проблемы с печатью текста, но я не смог найти определенные ответы (многим сведениям уже несколько лет). У меня есть вопрос, является ли это проблемой с:

  • Мой принтер, который является братом HL-4070CDW
  • Mac JVM (у меня есть: сборка 1.6.0_29-b11-402-10M3527 )
  • CUPS
  • что-то другое

Если кто-либо из читателей столкнулся с подобными проблемами или может пролить свет на эту проблему, пожалуйста, дайте мне знать (
СПАСИБО! ).

В поисках объяснений я наткнулся на следующую ветку на
stackoverflow.com
http://stackoverflow.com/questions/1655297/print-to-specific-printer-ipp-uri-in-java . Там они упомянули следующие библиотеки CUPS:

Jipsi, очевидно, изменил имена и перешел на код Google:

Поскольку мне нужно универсальное решение, которое работает не только на Mac с использованием CUPS, но и на Windows, я не экспериментировал ни с одной из перечисленных выше библиотек. Тем не менее я хотел упомянуть их.

Я также пробовал различные другие 
DocFlavors и настройки, но безрезультатно. Что интересно, так это то, что печать файлов PDF работает нормально. Печать файлов изображений, таких как PNG или JPG, также не выполняется.

Вот тривиальное приложение, которое я использую:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
 
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.Sides;
 
public class PrintPS {
 
  public static void main(String args[]) throws FileNotFoundException, PrintException {
    FileInputStream textStream = new FileInputStream(args[0]);
    DocFlavor myFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
    Doc myDoc = new SimpleDoc(textStream, myFormat, null);
   
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
   
    aset.add(new Copies(1));
    aset.add(Sides.ONE_SIDED);
   
    PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
   
    System.out.println("Printing to default printer: " + printService.getName());
   
    DocPrintJob job = printService.createPrintJob();
    job.print(myDoc, aset);
 
  }
}

Кроме того, я посмотрел на следующие текстовые редакторы на основе Java, чтобы увидеть, как они выполняют печать (что также хорошо работает на моем Mac):


RTEXT использует DocFlavor:
DocFlavor.SERVICE_FORMATTED.PRINTABLE,  который, в свою очередь, использует компонент, который реализует 
 интерфейс
java.awt.print.Printable

Я предполагаю, что в качестве следующего шага у меня есть два варианта … погрузиться в траншеи Java2D или повеселиться, генерируя PDF-файлы … И все, что я хотел, это напечатать какой-нибудь простой текст, который работает в операционных системах.

 

От http://hillert.blogspot.com/2011/12/java-print-service-frustrations.html