我需要发送一个pdf文件打印在一个网络应用程序的服务器端,打印机完全支持pdf打印等,它是网络以及服务器。pdf也存储在服务器上。
我尝试的是点击一个按钮,打印出pdf文件,目前我有以下代码:
//Server side printing
public class PrintDocument {
public void printText(String text) throws PrintException, IOException {
//Looks for all printers
//PrintService[] printServices = PrinterJob.lookupPrintServices();
PrintService service = PrintServiceLookup.lookupDefaultPrintService();
InputStream is = new ByteArrayInputStream(text.getBytes("UTF8"));
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
pras.add(new Copies(1));
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc doc = new SimpleDoc(is, flavor, null);
DocPrintJob job = service.createPrintJob();
PrintJobWatcher pjw = new PrintJobWatcher(job);
job.print(doc, pras);
pjw.waitForDone();
is.close();
}
}
class PrintJobWatcher {
boolean done = false;
PrintJobWatcher(DocPrintJob job) {
job.addPrintJobListener(new PrintJobAdapter() {
public void printJobCanceled(PrintJobEvent pje) {
allDone();
}
public void printJobCompleted(PrintJobEvent pje) {
allDone();
}
public void printJobFailed(PrintJobEvent pje) {
allDone();
}
public void printJobNoMoreEvents(PrintJobEvent pje) {
allDone();
}
void allDone() {
synchronized (PrintJobWatcher.this) {
done = true;
System.out.println("Printing has successfully completed, please collect your prints)");
PrintJobWatcher.this.notify();
}
}
});
}
public synchronized void waitForDone() {
try {
while (!done) {
wait();
}
} catch (InterruptedException e) {
}
}
}
但我有几个问题,我如何将pdf放入输入流以打印出来,我可以选择诸如双面打印之类的选项,以及如何从JSF web应用程序中调用它
谢谢
看完这个Q后
然后我用普通的java套接字测试了PJL命令,效果很好,在我的测试中,它的打印速度也比javax快。打印库,它的代码占用空间小得多,最好的部分是根本不需要库:
private static void print(File document, String printerIpAddress)
{
try (Socket socket = new Socket(printerIpAddress, 9100))
{
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
String title = document.getName();
byte[] bytes = Files.readAllBytes(document.toPath());
out.write(27);
out.write("%-12345X@PJL\n".getBytes());
out.write(("@PJL SET JOBNAME=" + title + "\n").getBytes());
out.write("@PJL SET DUPLEX=ON\n".getBytes());
out.write("@PJL SET STAPLEOPTION=ONE\n".getBytes());
out.write("@PJL ENTER LANGUAGE=PDF\n".getBytes());
out.write(bytes);
out.write(27);
out.write("%-12345X".getBytes());
out.flush();
out.close();
}
catch (Exception e)
{
System.out.println(e);
}
}
有关javax尝试的更多信息,请参阅本文。打印
看看这个博客。我们必须使用双面打印选项打印文档。在java中不可能直接进行双面打印。然而,解决方法是使用ghostscript并将PDF转换为PS(后期脚本文件)。为此,您可以添加PJL命令或Post脚本命令。
更多信息请访问
http://reddymails.blogspot.com/2014/07/how-to-print-documents-using-java-how.html
也阅读类似问题
使用javax.print库打印属性(托盘控件、双工等)
根据本文,应该可以使用PJL块(Wikipedia链接包括指向PJL参考文档的指针)开始打印作业,然后是PDF数据。
感谢PJL,您应该能够控制打印机提供的所有功能,包括双工等——博客文章甚至提到了2个pdf组合打印输出的装订。
一定要阅读文章上的评论,有一个家伙谁是专利的发明者名单上的评论,以及关于PJL命令的额外信息。
问题内容: 我已经将内存中的Postscript代码/数据(?)(在Java Tomcat webapp中)直接发送到联网的PS打印机。有没有一种简单的方法(即只是弹出一个端口并发送文本)来打印此内容,而绕过所有特定于O / S的驱动程序和内容(并希望甚至不需要额外的jar)?示例代码的链接显示了如何执行此操作? 谢谢戴夫 问题答案: 在目标打印机的LPR端口上打开一个TCP套接字。 发送您的数据
问题内容: 使用Java,我需要在未本地安装的网络打印机上进行打印。我只知道打印机名称。我看过的所有教程都以类似以下内容开始: 问题是可能没有安装打印机,因此在这种情况下服务将为空。我需要直接设置打印机名称,而不仅仅是通过可见的打印机枚举。 问题答案: 如果Java AWT Printing未向运行打印应用程序的Windows / Active Directory用户注册,则无法通过路径找到打印机
问题内容: Java中有一种简单的方法可以执行以下操作吗? 连接到打印机(将是本地打印机,并且是连接到机器的唯一打印机)。 在2个不同的打印机纸盘中打印2页的页面。 获取当前的打印队列计数,即我有100项要打印的项目和34项当前已打印,则打印机队列现在应显示为66。 问题答案: 一些快速提示: 从Java打印:请参阅基本打印程序 打印作业的状态:您可以使用PrintJobListener获得一些有
我有一个连接到CUPS的打印机,它支持双面打印,如何通过java例程将其设置为单面打印或双面打印? 我曾尝试使用它的库使用ASET添加和addViewer首选项没有任何运气。 有人能提供一些建议吗?
问题内容: Java中有什么方法可以打印到特定的IPP打印机?我发现所有示例代码和教程都集中在如何使用以下类似内容打印特定类型的文档上: 此代码段仅打印到找到的第一台能够打印文档的打印机。就我而言,我想通过其URI查找打印机,但似乎不支持此功能。我尝试使用,而不是,并添加了一个属性,但这不会返回任何打印机。我怀疑查找服务正在寻找可以更改其目标URI的打印机,而不是寻找具有该URI的打印机。 作为最
我在标签打印机上打印时遇到了问题。下面的代码在一个上打印4个“标签”(附标签图片)。 下面的代码打印到兄弟QL-500标签打印机上。它打印到3.5"乘1.1"标签上。 如果有人能帮我更好地理解代码,那也太好了。 下面是它打印的内容: