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