Symfoware

Symfowareについての考察blog

Apache PDFBox 円の塗りつぶしと破線の描画

Apache PDFBox 2.0系で円や楕円の描画を試してみました。
Apache PDFBox 扇型、円、楕円を描画する

今回は、破線で描画してみます。



破線の描画



破線の描画はここで行ったのと同じ手順です。
PDFライブラリ Apache PDFBoxで線の描画と矩形の塗りつぶし


  1. import java.awt.Color;
  2. import org.apache.pdfbox.pdmodel.PDDocument;
  3. import org.apache.pdfbox.pdmodel.PDPage;
  4. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  5. public class MainProccess {
  6.     
  7.     public static void main(String... args) throws Exception {
  8.         
  9.         PDDocument doc = new PDDocument();
  10.         
  11.         // 新しいページを追加
  12.         PDPage page = new PDPage();
  13.         doc.addPage(page);
  14.                 
  15.         // 出力用のストリームを開く
  16.         PDPageContentStream contents = new PDPageContentStream(doc, page);
  17.         
  18.         float x = 200f;
  19.         float y = 400f;
  20.         float r = 150f;
  21.         float r2 = 100;
  22.         
  23.         float p = 0.55228475f * r;
  24.         float p2 = 0.55228475f * r2;
  25.         
  26.         contents.moveTo(x + r, y);
  27.         
  28.         // 右上
  29.         contents.curveTo(x + r, y + p2,
  30.                 x + p, y + r2,
  31.                 x, y + r2);
  32.         
  33.         // 左上
  34.         contents.curveTo(x - p, y + r2,
  35.                 x - r, y + p2,
  36.                 x - r, y);
  37.         
  38.         // 左下
  39.         contents.curveTo(x - r, y - p2,
  40.                 x - p, y - r2,
  41.                 x, y - r2);
  42.         
  43.         // 右下
  44.         contents.curveTo(x + p, y - r2,
  45.                 x + r, y - p2,
  46.                 x + r, y);
  47.         
  48.         // 線の色を指定
  49.         contents.setStrokingColor(Color.blue);
  50.         // 破線のパターン指定
  51.         contents.setLineDashPattern(new float[]{4f, 4f}, 2f);
  52.         // 線の太さ指定
  53.         contents.setLineWidth(5f);
  54.         // 線の描画
  55.         contents.stroke();
  56.         
  57.         // ストリームを閉じる
  58.         contents.close();
  59.         // pdfファイルを出力
  60.         doc.save("sample.pdf");
  61.         doc.close();
  62.         
  63.         
  64.     }
  65. }




いい感じです。

642_01.png




塗りつぶしとの共存



塗りつぶした上で周りを線で囲みたいという場合、こんなコードではうまく行きません。


  1. import java.awt.Color;
  2. import org.apache.pdfbox.pdmodel.PDDocument;
  3. import org.apache.pdfbox.pdmodel.PDPage;
  4. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  5. public class MainProccess {
  6.     
  7.     public static void main(String... args) throws Exception {
  8.         
  9.         PDDocument doc = new PDDocument();
  10.         
  11.         // 新しいページを追加
  12.         PDPage page = new PDPage();
  13.         doc.addPage(page);
  14.                 
  15.         // 出力用のストリームを開く
  16.         PDPageContentStream contents = new PDPageContentStream(doc, page);
  17.         
  18.         float x = 200f;
  19.         float y = 400f;
  20.         float r = 150f;
  21.         float r2 = 100;
  22.         
  23.         float p = 0.55228475f * r;
  24.         float p2 = 0.55228475f * r2;
  25.         
  26.         contents.moveTo(x + r, y);
  27.         
  28.         // 右上
  29.         contents.curveTo(x + r, y + p2,
  30.                 x + p, y + r2,
  31.                 x, y + r2);
  32.         
  33.         // 左上
  34.         contents.curveTo(x - p, y + r2,
  35.                 x - r, y + p2,
  36.                 x - r, y);
  37.         
  38.         // 左下
  39.         contents.curveTo(x - r, y - p2,
  40.                 x - p, y - r2,
  41.                 x, y - r2);
  42.         
  43.         // 右下
  44.         contents.curveTo(x + p, y - r2,
  45.                 x + r, y - p2,
  46.                 x + r, y);
  47.         
  48.         // 円を赤で塗りつぶし
  49.         contents.setNonStrokingColor(Color.red);
  50.         contents.fill();
  51.         
  52.         // 線の色を指定
  53.         contents.setStrokingColor(Color.blue);
  54.         // 破線のパターン指定
  55.         contents.setLineDashPattern(new float[]{4f, 4f}, 2f);
  56.         // 線の太さ指定
  57.         contents.setLineWidth(5f);
  58.         // 線の描画
  59.         contents.stroke();
  60.         
  61.         // ストリームを閉じる
  62.         contents.close();
  63.         // pdfファイルを出力
  64.         doc.save("sample.pdf");
  65.         doc.close();
  66.         
  67.         
  68.     }
  69. }




642_02.png

塗りつぶし、線の描画いずれか先に実行したほうが優先されます。
一旦塗りつぶした後、再度図形を描画し、線を上書きしてやります。



  1. import java.awt.Color;
  2. import org.apache.pdfbox.pdmodel.PDDocument;
  3. import org.apache.pdfbox.pdmodel.PDPage;
  4. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  5. public class MainProccess {
  6.     
  7.     public static void main(String... args) throws Exception {
  8.         
  9.         PDDocument doc = new PDDocument();
  10.         
  11.         // 新しいページを追加
  12.         PDPage page = new PDPage();
  13.         doc.addPage(page);
  14.                 
  15.         // 出力用のストリームを開く
  16.         PDPageContentStream contents = new PDPageContentStream(doc, page);
  17.         
  18.         float x = 200f;
  19.         float y = 400f;
  20.         float r = 150f;
  21.         float r2 = 100;
  22.         
  23.         float p = 0.55228475f * r;
  24.         float p2 = 0.55228475f * r2;
  25.         
  26.         contents.moveTo(x + r, y);
  27.         
  28.         // 右上
  29.         contents.curveTo(x + r, y + p2,
  30.                 x + p, y + r2,
  31.                 x, y + r2);
  32.         
  33.         // 左上
  34.         contents.curveTo(x - p, y + r2,
  35.                 x - r, y + p2,
  36.                 x - r, y);
  37.         
  38.         // 左下
  39.         contents.curveTo(x - r, y - p2,
  40.                 x - p, y - r2,
  41.                 x, y - r2);
  42.         
  43.         // 右下
  44.         contents.curveTo(x + p, y - r2,
  45.                 x + r, y - p2,
  46.                 x + r, y);
  47.         
  48.         // 円を赤で塗りつぶし
  49.         contents.setNonStrokingColor(Color.red);
  50.         contents.fill();
  51.         
  52.         
  53.         // --- 再度、ライン描画用の図形を定義
  54.         contents.moveTo(x + r, y);
  55.         
  56.         // 右上
  57.         contents.curveTo(x + r, y + p2,
  58.                 x + p, y + r2,
  59.                 x, y + r2);
  60.         
  61.         // 左上
  62.         contents.curveTo(x - p, y + r2,
  63.                 x - r, y + p2,
  64.                 x - r, y);
  65.         
  66.         // 左下
  67.         contents.curveTo(x - r, y - p2,
  68.                 x - p, y - r2,
  69.                 x, y - r2);
  70.         
  71.         // 右下
  72.         contents.curveTo(x + p, y - r2,
  73.                 x + r, y - p2,
  74.                 x + r, y);
  75.         
  76.         // 線の色を指定
  77.         contents.setStrokingColor(Color.blue);
  78.         // 破線のパターン指定
  79.         contents.setLineDashPattern(new float[]{4f, 4f}, 2f);
  80.         // 線の太さ指定
  81.         contents.setLineWidth(5f);
  82.         // 線の描画
  83.         contents.stroke();
  84.         
  85.         // ストリームを閉じる
  86.         contents.close();
  87.         // pdfファイルを出力
  88.         doc.save("sample.pdf");
  89.         doc.close();
  90.         
  91.         
  92.     }
  93. }



642_03.png


関連記事

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

  1. 2015/08/26(水) 22:26:00|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Generator for Java 楕円の描画機能 | ホーム | Apache PDFBox 出力する文字列の幅、高さを取得する>>

コメント

コメントの投稿


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

トラックバック

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