LoginSignup
1

posted at

【Java初心者】PDFをA4サイズで自動印刷する

紙への印刷はビジネスではよく使う

今どきのアプリが行う出力は、画面への表示や、PDF出力などが中心ですが、ビジネスの現場では、まだメール送信や紙への印刷が多くなっています。

しかし、PDFをJavaプログラムから印刷すると、なぜかLetterサイズ(letter 8x11)となり、プリンター側で「そんなサイズの紙はないよ」エラーになってしまいました。

Acrobatなどで開いてから、「用紙に合わせてリサイズ」して印刷すれば、問題ないのですが、できれば、自動でプリンターに出せるようにしたい。

それを実現するために試行錯誤しました。PDFBoxライブラリー( https://pdfbox.apache.org/ )に依存しています。

package pdfPrint;

import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;
import org.apache.pdfbox.printing.PDFPrintable;
import org.apache.pdfbox.printing.Scaling;

/**
 * メイン
 */
public class Main {
    public static void main(String[] args) {
         doPrint("印刷したい.pdf");
    }
    
    
    /**
     * PDFをA4縦で印刷する
     * @param filename ファイル名
     * @return 
     */
    static boolean doPrint(String filename) {
        try {
            PDDocument document = PDDocument.load(new File(filename));
            PrinterJob job = PrinterJob.getPrinterJob();
            job.setPageable(new PDFPageable(document));
            // プリンターを指定したい場合はここを有効化。デフォルトプリンターならばコメントアウトのままでいい
            // PrintService myPrintService = findPrintService("XXXXプリンター"); 
            // job.setPrintService(myPrintService);
            
            Paper paper = new Paper();
            paper.setSize(21.0 / 2.54 * 72, 29.7 / 2.54 * 72); // A4
            paper.setImageableArea(0, 0, 612, 792);
            PageFormat pageFormat = new PageFormat();
            pageFormat.setPaper(paper);
            Book book = new Book();
            book.append(new PDFPrintable(document, Scaling.SHRINK_TO_FIT), pageFormat, document.getNumberOfPages());
            job.setPageable(book);
            // if (job.printDialog()) { // プリンターダイアログを出す場合
            job.print();
            //}

            return true;
        } catch (PrinterException | IOException | NullPointerException e) {
            return false;
        }
    }

    /**
     * プリンター一覧を取得し 指定されたプリンターがあればサービスを返す
     * @param printerName プリンター名
     * @return 
     */
    static PrintService findPrintService(String printerName) {
        PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
        for (PrintService printService : printServices) {
            System.out.println(printService.getName().trim());
            if (printService.getName().trim().equals(printerName)) {
                return printService;
            }
        }
        return null;
    }
}

PDF生成のときだけでなく、印刷段階でも紙の設定が必要なようです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1