iText がなかなか楽しい。
画像を紙の幅に合わせてPDFに出力してみる。

サンプルソースコード(ImageSample.java)


import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;
 
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
 
public class ImageSample {
 
  public static void main(String[] args) throws Exception {
    
    String files[] = {
      "20070804_0.jpg",
      "20070804_1.jpg",
      "20070804_2.jpg",
    };
  
    float margin = 20;
    Document doc =
      new Document(PageSize.A7, margin, margin, margin, margin);
    PdfWriter writer =
      PdfWriter.getInstance(
        doc, new FileOutputStream("20070804_image_sample.pdf"));
    doc.open();
    
    Paragraph p = new Paragraph();
    
    float pageWidth = doc.right() - doc.left();
    
    // A7Width - (margin * 2) == PageWidth
    System.out.println("A7 Width  = " + PageSize.A7.getWidth());
    System.out.println("PageWidth = " + pageWidth);
    System.out.println("Margin  = " + margin);
 
    // 紙の横幅に合わせて拡大or縮小
    for(int i=0; i<files.length; i++){
      Image img = getImage(files[i], pageWidth);
      p.add(new Chunk(img, 0, 0, true));
      p.add(new Chunk(files[i]));
      p.add(Chunk.NEWLINE);
    }
    
    doc.add(p);
    doc.close();
  }
  
  private static Image getImage(String file, float newWidth) throws Exception {
    
    BufferedImage bi = ImageIO.read(new File(file));
    com.lowagie.text.Image image = com.lowagie.text.Image.getInstance(bi, null);
    float percent = newWidth / image.getWidth() * 100.0f;
    image.scalePercent(percent);
    
    System.out.println("----------" + file + "----------");
    System.out.println("BufferedImage = " + bi.getWidth() + "," + bi.getHeight());
    System.out.println("Image     = " + image.getWidth() + "," + image.getHeight());
    System.out.println("Image Scaled  = " + image.getScaledWidth() + "," + image.getScaledHeight());
 
    return image;
  }
}

出力結果

20070804_0.jpg は 160 -> 170 で拡大。
20070804_1.jpg は 400 -> 170 で縮小。
20070804_2.jpg は 600 -> 170 で縮小。
というのがわかる出力結果。


A7 Width  = 210.0
PageWidth = 170.0
Margin    = 20.0
----------20070804_0.jpg----------
BufferedImage = 160,160
Image         = 160.0,160.0
Image Scaled  = 170.0,170.0
----------20070804_1.jpg----------
BufferedImage = 400,300
Image         = 400.0,300.0
Image Scaled  = 170.0,127.5
----------20070804_2.jpg----------
BufferedImage = 600,324
Image         = 600.0,324.0
Image Scaled  = 170.0,91.8

出力したPDF -> 20070804_image_sample.pdf
ちょっと画像が切れちゃっているけど、とりあえず横幅の大きさに合わせるという目的は果たしたので良しとする。今後の課題誕生。

tags: zlashdot Java Java PDF iText

Posted by NI-Lab. (@nilab)