参考資料:JavaからPDF印刷

RapidReportでは、Javaからプリンタへ直接印刷する機能を提供していません。 PDFまたはXLS/XLSXファイルを作成した上で、印刷処理はそれぞれのファイル形式に応じた外部のアプリケーション(Acrobat/Excelなど)にて行うという形になります。

しかし、Apache PDFBoxというライブラリを利用すれば、 Javaプログラム内にてRapidReportで作成したPDFを、そのままプリンタへ印刷することが可能になります。

ここでは参考のため、PDFBoxによるPDFファイルの印刷を行うコード例を紹介します。

※PDFBoxの使い方や、印刷に関わるシステム設定(CUPSの設定方法など)については、サポートできかねますのでご了承ください。

※この方法を利用して印刷を行う場合は、必要なフォントをPDFに埋め込んでください。

※Webアプリケーションにおいて、クライアントに接続されているプリンタへ印刷することはできません。サーバに接続されたプリンタのみ印刷可能です。

依存するソフトウェア

上記リンクから、以下の必要なライブラリをダウンロードし、クラスパスへの配置およびビルドパスの設定を行ってください。

  • pdfbox-X.X.X.jar
  • fontbox-X.X.X.jar
  • commons-logging-X.X.jar

※ 本記事作成時点(2017/11/8)でのバージョンはそれぞれpdfbox-2.0.8、fontbox-2.0.8、commons-logging-1.2でした。

コード例

印刷ダイアログを表示せずにPDFを印刷

  // Java
  FileInputStream fis = new FileInputStream("input.pdf");
  PDDocument doc = PDDocument.load(fis);
  PrinterJob job = PrinterJob.getPrinterJob();
  job.setPageable(new PDFPageable(doc));
  job.print();
  doc.close();
  fis.close();

印刷ダイアログを表示してからPDFを印刷

  // Java
  FileInputStream fis = new FileInputStream("input.pdf");
  PDDocument doc = PDDocument.load(fis);
  PrinterJob job = PrinterJob.getPrinterJob();
  job.setPageable(new PDFPageable(doc));
  if (job.printDialog()) {
    job.print();
  }
  doc.close();
  fis.close();

プリンターを指定してPDFを印刷

  // Java
  AttributeSet attributeset = new HashAttributeSet();
  for (PrintService service: PrintServiceLookup.lookupPrintServices(null, attributeset)) {
    if (service.getName().equals("printerName")) {
      FileInputStream fis = new FileInputStream("input.pdf");
      PDDocument doc = PDDocument.load(fis);
      PrinterJob job = PrinterJob.getPrinterJob();
      job.setPrintService(service);
      job.setPageable(new PDFPageable(doc));
      job.print();
      doc.close();
      fis.close();
      break;
    }
  }