2013年4月13日土曜日

Java PDF(その3 バーコード)

こんにちは, 約1年ぶりくらいに, iText をさわることとなりました。

目的は, バーコードをPDF に入れて印刷することです。iText ってバーコードをPDFにする機能があるんですよ

ちなみにiTextで扱っている種類は, com.itextpdf.text.* にいろいろあるようです。
(Barcode128, Barcode39, BarcodeCodabar, BarcodeEAN, BarcodeEANSUPP, BarcodeInter25, BarcodePostnet)


バーコードの選択には sensor.co.jp が便利。

用途によって使い分ける必要がありますが, CODE128はかなりの文字体系をカバーしている模様。

さっそくコードにまいりましょう。

必要なライブラリ  itextpdf-5.4.1.jar   バーコードならこれだけで十分です

package com.atmarkplant.samples.itext;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.Barcode128;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;

public class BarcodeSample 
{
 public void createPdf(String filename ) throws IOException, DocumentException, FileNotFoundException
 {
  // Document settings
  Document document = new Document(PageSize.A4, 25,25,25,25);
  PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
  
  document.open();
  PdfContentByte cb = writer.getDirectContent();
  
  Barcode128 code128 = new Barcode128();
  code128.setCode(UUID.randomUUID().toString());
  document.add(code128.createImageWithBarcode(cb, null, null));
  document.close();
 }
}

コードです重要なのは, 太字のところです。PDFにImageとして貼り付けています。
このサンプルでは, ランダムUUID を作って, それをバーコードにしてみました。


こんな感じになりました。UUID は, 32桁 + - なので結構長いです。

では複数生成したらどうなるのでしょう。

-> 下へどんどん追加されます。 1列に複数のバーコードを貼りたい場合はどうすればよいのでしょうか。


解決策は2つあります

1. 座標を指定してバーコードをはりつける

2. テーブルを作成してそこへはりつける

おすすめは圧倒的に2です。 1だとバーコードの大きさを綿密に計算しないといけないのと, 他の要素の座標をいちいち計算するのが面倒です


では早速サンプルを, テーブルの線は邪魔なので抜いておきました。

public void createTablePdf(String filename, int num ) throws IOException, DocumentException, FileNotFoundException
{
   // Document settings
   Document document = new Document(PageSize.A4, 25,25,25,25);
   PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
  
   document.open();
   PdfContentByte cb = writer.getDirectContent();
  
   // Prepare table
   float[] columnDefinitionSize = { 50.0f, 50.0f };
   PdfPTable table = new PdfPTable(columnDefinitionSize);
  
   for ( int i=0; i < num; i++ )
   {
      Barcode128 code128 = new Barcode128();
      code128.setCode(UUID.randomUUID().toString());
      Image barcode = code128.createImageWithBarcode(cb, null, null);
      Chunk chunk = new Chunk(barcode,0,0);
      PdfPCell cell = new PdfPCell();
      cell.addElement(chunk);
      cell.setBorder(Rectangle.NO_BORDER);
      table.addCell(cell);
   }
  
   document.add(table);
   document.close();
}

これで num 個作成できます。テーブルの各列に2つずつ表示されます。ポイントそうですね。Barcode をChunk に張り付けているところでしょうか。







0 件のコメント:

コメントを投稿