【问题标题】:Java 8 issues printing PS to network printerJava 8 问题将 PS 打印到网络打印机
【发布时间】:2017-08-02 21:13:11
【问题描述】:

有一个奇怪的问题要问你。最近将我的旧项目从 java 7(jdk1.7.0_10) 升级到 java 8(1.8.0.91.x86_64)。在 java 7 中,它打印 postscript 文件没有问题,现在它将 postscript 文件打印为纯文本而不是转换文件。这是在redhat linux环境中。只是我试图打印一个包含文件本身的后脚本文件的字符串。

这是我的原始代码

    DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
    PrintService pService = PrintServiceLookup.lookupDefaultPrintService();
// In a field environment, send to the printer
    if (System.getenv("USER_DEFINED_RELTOP") == null || pfr.exists()) {
        if (pService.getName().isEmpty()) {
            LOGGER.error("No printer selected");
        } else {
            LOGGER.info("Printing to " + pService.getName());
            DocPrintJob pj = pService.createPrintJob();
            try {
                InputStream is = new ByteArrayInputStream(data.getBytes("UTF8"));
                Doc doc = new SimpleDoc(is, flavor, null);
                PrintJobWatcher pjw = new PrintJobWatcher(pj);
                pj.print(doc, null);
                pjw.waitForDone();
                is.close();

            } catch (PrintException | IOException e) {
                LOGGER.error(e);
            } // try block

        } // no printer selected
        // Otherwise, send to a file
    } else {

这在 java 7 中运行良好,我将其更新为此处为 java 8 找到的 oracle 规范。 https://docs.oracle.com/javase/8/docs/api/javax/print/PrintService.html#createPrintJob--

https://docs.oracle.com/javase/8/docs/technotes/guides/jps/spec/printing.fm6.html

        DocFlavor psFlavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
        PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
        attrs.add(MediaSizeName.ISO_A4);


PrintService[] pservices = PrintServiceLookup.lookupPrintServices(psFlavor,
                                                    attrs);
    File pfr = new File(PFR_INDICATOR);

    // In a field environment, send to the printer
    if (System.getenv("USER_DEFINED_RELTOP") == null || pfr.exists()) {
      //Check we have a printer capable of post script
    if (pservices.length > 0) {
            LOGGER.info("Printing to " + pservices[0].getName());
            DocPrintJob pj = pservices[0].createPrintJob();
            try {
                    InputStream fis = new ByteArrayInputStream(data.getBytes("UTF8"));

//byte[] ba =data.getBytes("UTF8");
        Doc doc = new SimpleDoc(fis, psFlavor, null);
            LOGGER.info("Doc Flavor " + doc.getDocFlavor());
                    PrintJobWatcher pjw = new PrintJobWatcher(pj);
            LOGGER.info("PrintJob Attributes : " + pj.getAttributes());
        pj.print(doc, attrs);
        pjw.waitForDone();
        fis.close();
            } catch (IOException e) {
                LOGGER.error(e);
                NotificationDialog.show(NotificationDialog.NOTICE_TYPE.ERROR, PRINT_ERROR);
    } catch (PrintException e) {
                LOGGER.error(e);
            }

        } else { // no printer selected

这给了我一个错误 java.awt.print.PrinterIOException: java.io.IOException: /usr/bin/lpr: where it looks to not find lpr.

如果我保持原来的方式(不写入文件),即使添加检查以检查打印机是否支持 post script,它也会将 postscript 打印为纯文本。如果我使用新的打印文件方式,我会收到一个 lpr not found 错误。如果我使用命令 lpr 打印 PS 文档,它会按预期转换并打印正常。如果我使用不格式化的 lpr -l ,它也会将它的文档打印为纯文本。

任何建议/帮助都会很棒。我不知道该怎么做。我真的不想将其转换为图像并打印出来。

【问题讨论】:

    标签: printing java-8 postscript


    【解决方案1】:

    我猜测您的打印机是 HP 或至少是 PCL + PS 打印机,而不是纯 PostScript 打印机。

    在这种情况下,您通常需要在 PostScript 前面加上语言选择 PJL 字符串。如果你不这样做,那么它通常默认为 PCL,如果你不发送任何 PCL 命令(都以 0x1B 开头),那么所有内容都被视为纯 ASCII 文本。这可以解释为什么您的应用程序和 lpr -l 最终都会写入文本,但 lpr 本身不会(可能它添加了 PJL)。

    您可以尝试在 PostScript 文件前添加以下内容:

    %-12345X@PJL JOB
    @PJL ENTER LANGUAGE=POSTSCRIPT
    

    注意那里的第一个字节,在 % 之前应该是一个 0x1b ESC 字符,但我不能轻易粘贴二进制文件....

    尝试使用lpr -l 发送文件,如果可行,那么您可以尝试使用旧的打印方法。

    【讨论】:

    • 所以你的建议奏效了。我可以使用 lpr -l 打印格式精美的纸张。但是,当从 java 打印时,它仍然会打印文本表示。我什至尝试将 FileInputStream 转换为 ByteArrayInputStream 但得到了相同的文本表示。还有其他建议吗?
    • 抱歉,Java 不是我的专业。我只能假设它在一开始就丢弃了额外的 PJL,而不是放入自己的版本,但我不能给你任何线索为什么。我想这真的只是一个 Java 问题。
    • 抱歉,Ken,团队昨晚错误地修补了我的代码。我正确修补了它并正确打印。谢谢大家的帮助。
    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2012-05-28
    • 2011-04-13
    • 2011-04-12
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多