LoginSignup
0
1

More than 1 year has passed since last update.

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

Posted at

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

今どきのアプリが行う出力は、画面への表示や、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生成のときだけでなく、印刷段階でも紙の設定が必要なようです。

0
1
0

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
  3. You can use dark theme
What you can do with signing up
0
1