iText直接打印

我正在使用iText生成pdf并将其写入文件系统,如下所示:

private void createPDF() throws Exception{ com.itextpdf.text.Document doc = new com.itextpdf.text.Document(); PdfWriter docWriter = null; path = "C:\\PATH\\TO\\Desktop\\EXAMPLE_FOLDER\\" + pdfFilename; docWriter = PdfWriter.getInstance(doc, new FileOutputStream(path)); doc.addTitle("Invoice"); doc.setPageSize(PageSize.A4); doc.open(); PdfContentByte cb = docWriter.getDirectContent(); fillPDFDetails(cb); if (doc != null) { doc.close(); } if (docWriter != null) { docWriter.close(); } } 

但是,我想将pdf发送到打印机并打印pdf文件,而不是将其写入文件系统。 我怎样才能做到这一点?

这个问题有一个理论上和一个实际的答案。

让我们从理论答案开始。 有一个名为PrintStream的Java类,它允许您将OutputStream发送到打印机:

Printstream扩展FilterOutputStream扩展OutputStream

PrintStream将function添加到另一个输出流,即能够方便地打印各种数据值的表示。 还提供了另外两个function。 与其他输出流不同, PrintStream永远不会抛出IOException ; 相反,exception情况只是设置一个内部标志,可以通过checkError方法进行测试。 可选地,可以创建PrintStream以便自动刷新; 这意味着在写入字节数组,调用其中一个println方法或写入换行符或字节( '\n' )后,将自动调用flush方法。

因此,假设您想在内存中创建PDF并将其写入打印机,您可以执行以下操作:

 ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); Document document = new Document(); PdfWriter.getInstance(document, ps); document.open(); // add content document.close(); 

PrintStream扩展OutputStream并且PdfWriter接受任何类型的OutputStream ,您将PDF字节写入打印机,如果您想要PDF字节,则可以执行baos.toByteArray()

但是,上面的代码段会将PDF字节发送到打印机。 您的打印机可能无法理解PDF并且只打印出以下内容:

 PDF-1.4 %âãÏÓ 2 0 obj <>stream *binary stuff* endstream endobj 4 0 obj <>>> /MediaBox[0 0 595 842]>> endobj 1 0 obj <> endobj 3 0 obj <> endobj 5 0 obj <> endobj 6 0 obj <> endobj xref 0 7 0000000000 65535 f 0000000302 00000 n 0000000015 00000 n 0000000390 00000 n 0000000145 00000 n 0000000441 00000 n 0000000486 00000 n trailer <<91bee3a87061eb2834fb6a3258bf817e>] /Info 6 0 R/Size 7>> %iText-5.4.2 startxref 639 %%EOF 

更新:

在评论中,添加了以下链接: https : //blog.idrsolutions.com/2010/01/printing-pdf-files-from-java/

这实际上是打印文件的更好方法:

 FileInputStream fis = new FileInputStream(“C:/mypdf.pdf”); Doc pdfDoc = new SimpleDoc(fis, null, null); DocPrintJob printJob = printService.createPrintJob(); printJob.print(pdfDoc, new HashPrintRequestAttributeSet()); fis.close(); 

如果您不想使用FileInputStream ,则始终可以将PDF创建为ByteArrayOutputStream并使用生成的byte[]创建ByteArrayInputStream

这就是实际答案:在内存中创建PDF并不困难。 这是这样做的:

 ByteArrayOutputStream baos = new ByteArrayOutputStream(); Document document = new Document(); PdfWriter.getInstance(document, baos); document.open(); // add content document.close(); byte[] pdf = baos.toByteArray(); 

问题是:你打算用pdf做什么?

您的打印机可以理解这些字节(有些打印机可以接受PDF语法),或者您必须找到将PDF转换为打印机可以理解的格式的软件。 通常,人们使用PDF渲染软件(如Adobe Reader)来打印文档。 其中许多观众(Adobe Reader就是其中之一),要求文件作为文件存在:Adobe Reader不接受字节数组。

这就解释了为什么实际答案并不像理论答案那么简单:在实践中,你的问题远非微不足道:它取决于打印机(它接受哪种格式)和PDF查看器(如果你需要的话)。

试试这个 :

 filename = "aaaaaaa.pdf"; java.io.File fileout = new File(filename); com.lowagie.tools.Executable.printDocumentSilent(fileout)); fileout.delete(); // if you don't want to keep it.