使用Apache PDFBox来打印PDF文件

由于Apache PDFBox可以输出日本语,我才开始逐渐调查PDFBox能做什么,之前完全没有使用过。

这次是关于PDF打印的方法。

我参考了下面的官方文档。 (虽然看了下面这个链接,还是没必要看这个页面了。)
https://pdfbox.apache.org/2.0/migration.html#pdf-printing

打印PDF文件

    public static void main(String[] args) throws IOException, PrinterException {
        try (InputStream in = new FileInputStream("pdf.pdf")) {
            print(in);
        }
    }

    public static void print(InputStream in) throws IOException, PrinterException {
        try (PDDocument doc = PDDocument.load(in)) {

            PrinterJob job = PrinterJob.getPrinterJob();
            job.setPageable(new PDFPageable(doc));
            //プリンターのダイアログを開く
            if (job.printDialog()) {
                job.print();//印刷
            }
        }
    }

执行结果

image
image

使用PDFBox可以在不创建PDF文件的情况下打印。

我认为只要看一下写作方法就能够自然而然地做到,不过还是确认了一下。

    public static void print2() throws IOException, PrinterException {
        try (PDDocument doc = new PDDocument()) {
            float fontSize = 20;
            PDRectangle rectangle = PDRectangle.A6;

            PDFont font = loadFont(doc);
            float fontHeight = getFontHeight(font, fontSize);

            PDPage page = new PDPage(rectangle);
            doc.addPage(page);

            try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
                contents.setLineWidth(1F);
                contents.beginText();

                contents.setNonStrokingColor(Color.RED);
                contents.setStrokingColor(Color.BLUE);

                contents.setFont(font, fontSize);
                contents.setLeading(fontHeight);

                contents.setTextMatrix(Matrix.getTranslateInstance(10, rectangle.getHeight() - fontHeight - 10));
                contents.appendRawCommands(RenderingMode.FILL.intValue() + " Tr ");
                contents.showText("テキスト FILL");
                contents.newLine();
                contents.appendRawCommands(RenderingMode.STROKE.intValue() + " Tr ");
                contents.showText("テキスト STROKE");
                contents.newLine();
                contents.appendRawCommands(RenderingMode.FILL_STROKE.intValue() + " Tr ");
                contents.showText("テキスト FILL_STROKE");
                contents.endText();
            }

            PrinterJob job = PrinterJob.getPrinterJob();
            job.setPageable(new PDFPageable(doc));
            //プリンターのダイアログを開く
            if (job.printDialog()) {
                job.print();//印刷
            }
        }
    }

执行结果

我已经印刷好了。

image

结束语

打印机工作时没有显示对话框,但是可以无需显示对话框就进行打印对吧?
所以只要正确处理,我认为在服务器端也可以实现静默打印。

顺便问一下,iText上有打印功能吗?