在浏览器中打开PDF并调用打印对话框

本文关键字:调用 打印 对话框 PDF 浏览器 | 更新日期: 2023-09-27 18:26:31

在我的asp.net 4.0应用程序中,我的后端有一个word文档。当用户选择打印信件时,使用ASPose我在后台填写邮件合并字段,

我正在打开一个浏览器窗口,并通过Page_Load中的以下代码显示PDF。我想告诉它打印,这样它就会打开标准的打印机对话框,如果用户要求打印,就会打印,然后关闭浏览器窗口。如何从这一点调用打印(本地打印机)?

    using (FileStream sourceStream = new FileStream(pdfFilePath, FileMode.Open, FileAccess.Read))
    {
        using (var memoryStream = new MemoryStream())
        {
            sourceStream.CopyTo(memoryStream);
            byte[] b =  memoryStream.ToArray();
            Response.AddHeader("content-disposition", "inline;filename=" + Path.GetFileName(pdfFilePath));
            Response.ContentType = System.Net.Mime.MediaTypeNames.Application.Pdf;
            Response.OutputStream.Write(b, 0, b.Length);        
        }
    }

在浏览器中打开PDF并调用打印对话框

直接向打印机发送命令的一个不太好的解决方案涉及使用Java Applet。在这种情况下,您可以生成文档的URL,并使用Javascript将其作为参数传递给小程序。我在我的一个应用程序中使用了此解决方案,但我应该警告您,在浏览器安全配置或JRE过时的情况下,该解决方案很容易失败。

当您将PDF发送到打印机时,您应该使用PDDocument类加载PDF文档,然后将其发送到PrinterJob:

PrinterJob printerJob = PrinterJob.getPrinterJob();
printerJob.setPrintService("MyPrinterName");
URL uri = new URL("http://example.com/docs/doc.pdf");
PDDocument docPdf = PDDocument.load(uri);
docPdf.silentPrint(printerJob);

在这种情况下,您需要知道客户端中打印机的名称,您也可以使用Java获得该名称:

public String[] getPrinters() {
    PrintService[] printers = PrintServiceLookup.lookupPrintServices(null, null);
    String[] printerNames = new String[impressoras.length];
    for (int i = 0; i < printers.length; i++) {
        printerNames[i] = printers[i].getName();
    }
    return printerNames;
}

记住,你可以使用Javascript调用Applet的任何方法,在网上搜索你可以找到如何做到这一点

一旦你从clent获得打印机,你就可以使用你自己的打印机对话框,这样用户就可以选择他/她想要使用的打印机。


你可能会发现一些有用的资源:

  • 创建Java小程序:http://docs.oracle.com/javase/tutorial/uiswing/components/applet.html
  • 从JavaScript代码调用Applet方法:http://docs.oracle.com/javase/tutorial/deployment/applet/invokingAppletMethodsFromJavaScript.html