Symfoware

Symfowareについての考察blog

Apache PDFBox 用紙サイズの指定と用紙の向き(Landscape,Portrait)

Apache PDFBox 2.0系のスナップショットを使って、PDFの出力を試しています。
Apache PDFBoxで日本語の出力とフォントの埋め込み


今回は用紙サイズと用紙の方向指定を試してみます。


用紙サイズ



用紙サイズは、PDPageのコンストラクタで指定できます。

まず、通常の出力サンプル。


  1. import org.apache.pdfbox.pdmodel.PDDocument;
  2. import org.apache.pdfbox.pdmodel.PDPage;
  3. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  4. import org.apache.pdfbox.pdmodel.font.PDFont;
  5. import org.apache.pdfbox.pdmodel.font.PDType1Font;
  6. public class MainProccess {
  7.     
  8.     public static void main(String... args) throws Exception {
  9.         
  10.         PDDocument doc = new PDDocument();
  11.         
  12.         // 新しいページを追加
  13.         PDPage page = new PDPage();
  14.         doc.addPage(page);
  15.         
  16.         PDFont font = PDType1Font.TIMES_ROMAN;
  17.         
  18.         // 出力用のストリームを開く
  19.         PDPageContentStream contents = new PDPageContentStream(doc, page);
  20.         
  21.         contents.setFont(font, 46);
  22.         
  23.         contents.beginText();
  24.         contents.newLineAtOffset(100, 100);
  25.         contents.showText("Hello world!");
  26.         contents.endText();
  27.         
  28.         // ストリームを閉じる
  29.         contents.close();
  30.         // pdfファイルを出力
  31.         doc.save("sample.pdf");
  32.         doc.close();
  33.         
  34.         
  35.     }
  36. }





A4縦のレイアウトとなります。

638_01.png


PDRectangle.[用紙サイズ定数]を指定することで、用紙サイズが変更できます。
サンプルとして、A6にサイズを変更。


  1. import org.apache.pdfbox.pdmodel.PDDocument;
  2. import org.apache.pdfbox.pdmodel.PDPage;
  3. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  4. import org.apache.pdfbox.pdmodel.common.PDRectangle;
  5. import org.apache.pdfbox.pdmodel.font.PDFont;
  6. import org.apache.pdfbox.pdmodel.font.PDType1Font;
  7. public class MainProccess {
  8.     
  9.     public static void main(String... args) throws Exception {
  10.         
  11.         PDDocument doc = new PDDocument();
  12.         
  13.         // A6で新しいページを追加
  14.         PDPage page = new PDPage(PDRectangle.A6);
  15.         doc.addPage(page);
  16.         
  17.         PDFont font = PDType1Font.TIMES_ROMAN;
  18.         
  19.         // 出力用のストリームを開く
  20.         PDPageContentStream contents = new PDPageContentStream(doc, page);
  21.         
  22.         contents.setFont(font, 46);
  23.         
  24.         contents.beginText();
  25.         contents.newLineAtOffset(100, 100);
  26.         contents.showText("Hello world!");
  27.         contents.endText();
  28.         
  29.         // ストリームを閉じる
  30.         contents.close();
  31.         // pdfファイルを出力
  32.         doc.save("sample.pdf");
  33.         doc.close();
  34.         
  35.         
  36.     }
  37. }




A6サイズに変更されました。

638_02.png





用紙の回転



用紙の回転方法は、PDFBoxのサンプルが参考になります。
CreateLandscapePDF.java


手順としては、PDPage#setRotation(角度)で、用紙を回転。


  1. import org.apache.pdfbox.pdmodel.PDDocument;
  2. import org.apache.pdfbox.pdmodel.PDPage;
  3. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  4. import org.apache.pdfbox.pdmodel.common.PDRectangle;
  5. import org.apache.pdfbox.pdmodel.font.PDFont;
  6. import org.apache.pdfbox.pdmodel.font.PDType1Font;
  7. public class MainProccess {
  8.     
  9.     public static void main(String... args) throws Exception {
  10.         
  11.         PDDocument doc = new PDDocument();
  12.         
  13.         // A6で新しいページを追加
  14.         PDPage page = new PDPage(PDRectangle.A6);
  15.         doc.addPage(page);
  16.         
  17.         // 90度回転
  18.         page.setRotation(90);
  19.         
  20.         PDFont font = PDType1Font.TIMES_ROMAN;
  21.         
  22.         // 出力用のストリームを開く
  23.         PDPageContentStream contents = new PDPageContentStream(doc, page);
  24.         
  25.         contents.setFont(font, 46);
  26.         
  27.         contents.beginText();
  28.         contents.newLineAtOffset(100, 100);
  29.         contents.showText("Hello world!");
  30.         contents.endText();
  31.         
  32.         // ストリームを閉じる
  33.         contents.close();
  34.         // pdfファイルを出力
  35.         doc.save("sample.pdf");
  36.         doc.close();
  37.         
  38.         
  39.     }
  40. }




用紙が回転しました。
しかし、文字の出力方向も同時に回転されてしまいます。

638_03.png



これは狙い通りの挙動ではありません。
contents.transformで、出力も回転してやります。

以下が正解になります。


  1. import org.apache.pdfbox.pdmodel.PDDocument;
  2. import org.apache.pdfbox.pdmodel.PDPage;
  3. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  4. import org.apache.pdfbox.pdmodel.common.PDRectangle;
  5. import org.apache.pdfbox.pdmodel.font.PDFont;
  6. import org.apache.pdfbox.pdmodel.font.PDType1Font;
  7. import org.apache.pdfbox.util.Matrix;
  8. public class MainProccess {
  9.     
  10.     public static void main(String... args) throws Exception {
  11.         
  12.         PDDocument doc = new PDDocument();
  13.         
  14.         // A6で新しいページを追加
  15.         PDPage page = new PDPage(PDRectangle.A6);
  16.         doc.addPage(page);
  17.         
  18.         // 90度回転
  19.         page.setRotation(90);
  20.         
  21.         // 用紙サイズ取得
  22.         PDRectangle pageSize = page.getMediaBox();
  23.         float pageWidth = pageSize.getWidth();
  24.         
  25.         PDFont font = PDType1Font.TIMES_ROMAN;
  26.         
  27.         // 出力用のストリームを開く
  28.         PDPageContentStream contents = new PDPageContentStream(doc, page);
  29.         // 出力を回転
  30.         contents.transform(new Matrix(0, 1, -1, 0, pageWidth, 0));
  31.         
  32.         contents.setFont(font, 46);
  33.         
  34.         contents.beginText();
  35.         contents.newLineAtOffset(100, 100);
  36.         contents.showText("Hello world!");
  37.         contents.endText();
  38.         
  39.         // ストリームを閉じる
  40.         contents.close();
  41.         // pdfファイルを出力
  42.         doc.save("sample.pdf");
  43.         doc.close();
  44.         
  45.         
  46.     }
  47. }




狙っていた出力になりました。

638_04.png



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/08/22(土) 17:09:55|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Apache PDFBox 扇型、円、楕円を描画する | ホーム | Java SAXリーダーでコメントタグの内容を取得する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1788-d916b448
この記事にトラックバックする(FC2ブログユーザー)