gpt4 book ai didi

java - 自动打印在 Java 中不起作用

转载 作者:搜寻专家 更新时间:2023-10-30 21:35:15 24 4
gpt4 key购买 nike

我需要以两种不同的方式打印 pdf 文件 - 一种是通过网页,用户将在其中看到打印预览并选择打印机并进行打印。第二种方法是自动打印,只需点击一个按钮,pdf 文件就会发送到打印机。

第一种打印方式是通过网页打印可以正常工作,但第二种方式不行。默认打印机已成功检索用于自动打印,但未打印,我也没有收到任何错误。以下是我的分析:

  1. 最初,我认为 DocFlavor 不受支持。然后我列出下载该打印机支持的 ​​DocFlavor,其中之一是application/octet-stream,即 DocFlavor.INPUT_STREAM.AUTOSENSE。所以打印机支持 flavor 。
  2. 然后,我添加了 PrintJobListener 来检查打印作业是否失败的。当我将该监听器添加到 printJob 时,它会打印No_More_EventsDATA_TRANSFER_COMPLETE,应该打印出来JOB_COMPLETE,如果作业成功。
  3. 最后一步是调试 Java 代码。当我执行该行时job.print(),它进入Win32PrintJob.print() 方法。我做了 F6 到执行每一行以查看它在做什么。我将它与代码进行了比较在 GrepCode ,因为源代码没有加载到 eclipse 中。它一切顺利,我看不到任何错误。它唯一做的地方不进入这个 block ,它检查 mDestination值,因为我没有提供,所以没有通过。

请看下面的代码:

if (mDestination != null) { // if destination attribute is set
try {
FileOutputStream fos = new FileOutputStream(mDestination);
byte [] buffer = new byte[1024];
int cread;

while ((cread = instream.read(buffer, 0, buffer.length)) >= 0) {
fos.write(buffer, 0, cread);
}
fos.flush();
fos.close();
} catch (FileNotFoundException fnfe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(fnfe.toString());
} catch (IOException ioe) {
notifyEvent(PrintJobEvent.JOB_FAILED);
throw new PrintException(ioe.toString());
}
notifyEvent(PrintJobEvent.DATA_TRANSFER_COMPLETE);
notifyEvent(PrintJobEvent.JOB_COMPLETE);
service.wakeNotifier();
return;
}

这是唯一显示 JOB_COMPLETE 的地方。我认为这个 block 是写入文件,这对我来说不需要。

我认为实际打印发生在下一行中,使用相同的方法 Win32PrintJob.print()。

private native boolean More ...printRawData(byte[] data, int count);

但是这个是本地方法,所以我不知道里面发生了什么。

请告诉我为什么我无法打印 PDF。

编辑:

附上打印文件的代码:

PrintService pss = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob job = pss.createPrintJob();
DocAttributeSet das = new HashDocAttributeSet();
Doc document;
try {
document = new SimpleDoc(new FileInputStream(new File(fileName)), DocFlavor.INPUT_STREAM.AUTOSENSE, das);

PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
job.addPrintJobListener(new PrintJobWatcher());
job.print(document, pras);
}

注意:我尝试了不同的风格,如 PDF、PCL。没有任何工作,我收到运行时错误,它不受支持。

最佳答案

我最近有同样的任务,对于第二个打印选项(也尝试过 JPedal、Samba 和其他解决方案..),答案并不是那么直接。最简单的打印方法(我最终尝试过)是将文件简单地放在打印机队列中,也就是根位置。例如:MY_SERVER\PRINTER_NAME\

现在问题变成了环境/操作系统问题,而不是 Java 问题。通过安装在 Windows 机器上的应用程序,您可以访问该文件夹,复制您想要打印的文件,瞧。此外,使用您使用的方法,您还可以为打印作业指定名称、份数等。

但是,一旦将应用程序安装到服务器上,情况就完全不同了,尤其是在使用 Linux 服务器时。

首先,您必须将 Windows 地址转换为 Linux 地址,才能尝试复制/打印文件。

其次,这是关键,如果打印机不属于更复杂/专有的数据流,则打印机仅“接受文件”进行打印是非常罕见/困难的。例如,当您执行“Ctrl+P”时,您可以找到打印机与服务器甚至您的机器的“通信语言”。这主要是 .xml 文件或其他格式。

但是/并且为了“弄清楚”这种格式,您必须开发(最终是在 Java 中)调用该打印机的小程序。

当然,您也可以尝试在该服务器上安装 Cups4j 或设置打印机服务器(假设您工作的地方不存在),但这会在打印机更改、添加到网络时导致问题等

最终要么坚持“Ctrl+P”方法,制作一个在浏览器中调用“CTRL+P”的小 JS 脚本,要么开始重新创建轮子,这不是一件坏事(因为有也有人选择这种方法..但我没有在任何地方找到例子),但可能会花费你比现在更多的时间。

希望我能以某种方式提供帮助(抱歉发了这么长的帖子……但这是我搜索并研究了很长一段时间的主题)。

关于java - 自动打印在 Java 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31445192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com