- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要以两种不同的方式打印 pdf 文件 - 一种是通过网页,用户将在其中看到打印预览并选择打印机并进行打印。第二种方法是自动打印,只需点击一个按钮,pdf 文件就会发送到打印机。
第一种打印方式是通过网页打印可以正常工作,但第二种方式不行。默认打印机已成功检索用于自动打印,但未打印,我也没有收到任何错误。以下是我的分析:
DocFlavor
不受支持。然后我列出下载该打印机支持的 DocFlavor
,其中之一是application/octet-stream,即 DocFlavor.INPUT_STREAM.AUTOSENSE
。所以打印机支持 flavor 。PrintJobListener
来检查打印作业是否失败的。当我将该监听器添加到 printJob 时,它会打印No_More_Events
和 DATA_TRANSFER_COMPLETE
,应该打印出来JOB_COMPLETE
,如果作业成功。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/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!