* 출처 : http://zxzx200.tistory.com/17


요세 pdf와 씨름을 하고 있습니다.
구현하고자 하는 것은 Adobe Reader 없이 웹상에서 pdf파일을 보여주고자 하는 것 입니다.
이 기능을 만들고자 iText, pdfbox, pj등등 다양한 pdf라이브러리를 조금씩 만져봤는데요.
iText에 HtmlWriter라는 클래스가 있어서 document 개체를 받아서 html형식으로 만들 수가 있습니다. 연구를 하고 시도를 했는데
결국 실패했습니다.
document를 이용해서 새로운 pdf파일은 만들 수 있는데 기존에 pdf를 읽어와 document 형으로 변환하는 방법을 못 찾아서 일단 보류 중 입니다.

다른 대안이 pdf를 이미지 파일로 만들어 웹상에서 보여주자 입니다.
인터넷을 찾다가 PDFRenderer.jar라는 것을 찾았습니다. java 어플리케이션 프로그램입니다.


위와 같은 어플리케이션 입니다.
PDFRenderer는 pdf파일을 page단위로 java.awt.Image 개체로 만듭니다. 이기능을 이용하는 것 입니다.

소스는 다음과 같습니다.

 package com.forum.pdfTest;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import javax.imageio.ImageIO;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

public class PdfImage {
 public static void main(String args[]) throws IOException
 {
  //load a pdf from a byte buffer
        File file = new File("c:\\Tmp\\FT300_manual.pdf");
        RandomAccessFile raf = new RandomAccessFile(file, "r");
        FileChannel channel = raf.getChannel();
        ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
        PDFFile pdffile = new PDFFile(buf);

        // draw the first page to an image
        PDFPage page = pdffile.getPage(2);
       
        //get the width and height for the doc at the default zoom
        Rectangle rect = new Rectangle(0,0,
                (int)page.getBBox().getWidth(),
                (int)page.getBBox().getHeight());
       
        //generate the image
       
        Image image = page.getImage(
                rect.width, rect.height, //width & height
                rect, // clip rect
                null, // null for the ImageObserver
                true, // fill background with white
                true  // block until drawing is done
                );
       
        int w = image.getWidth(null);
        int h = image.getHeight(null);
        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = bi.createGraphics();
        g2.drawImage(image, 0, 0, null);
        g2.dispose();
        try
        {
            ImageIO.write(bi, "jpg", new File("c:\\Tmp\\imageTest.jpg"));
        }
        catch(IOException ioe)
        {
            System.out.println("write: " + ioe.getMessage());
        }               
 }
}



소스파일과 PDFRenderer 파일을 첨부하겠습니다.
위에 소스에서 Image 개체를 jpg로 안만들고 JFrame개체에 담으면 어플리케이션 프로그램을 만들 수 있습니다.
jpg로 생성 하려먼 BufferedImage 개체로 만들어야 하는데 Image 개체를 BufferedImage로 변환하는 법을 몰라서 삽집을 좀 했습니다.

소스상의

// draw the first page to an image
PDFPage page = pdffile.getPage(2);

위의 코드가 pdf의 특정 page를 선택하는 부분입니다. 2페이지를 선택했습니다.

pdffile.getNumPages();

위의 코드로 pdf파일의 총 페이지 수를 알 수 있습니다.
총 페이지 수로 for문을 돌리면 모든 페이지를 이미지로 만들 수 있을 것 입니다.

어째든 pdf 짜증나네요.
PDFRenderer 말고도 iText나 pdfbox로도 pdf를 이미지로 만들 수 있을 것 입니다.
나중에 알아내면 올리겠습니다.

에초에 이미지로 만들어 웹상에 보여주는 것 자체가 마음에 안들어 좀더 다른 방법을 찾아야 겠습니다.
얼핏 보니 javascript로 pdf를 다룰 수 있는거 같습니다. 또 인터넷상에 jQuery로 pdf 뷰어가 많이 나와 있습니다. 하지만 Adobe Reader가 있어야 되는 것 같습니다.
iText로 구현 하려는 기능을 만들 수 있을 거 같은데..... 에휴.... 영어가 딸려서.....
iText는 기본적으로 pdf를 xml형으로 변환하여 처리 합니다. 그래서 html형식으로도 만들 수 있는 것인데 말이죠.
웹상에 html을 pdf만드는 것은 많이도 pdf를 html로 만드는 것은 없더군요. 쩝.
어째든 iText로 구현이 되면 블로그에 올리겠습니다.

'Java' 카테고리의 다른 글

[Java] MultiPartRequest 객체(cos.jar)를 사용한 업로드  (0) 2010.12.13
[Java] JasperReports  (1) 2010.12.07
[Java] Pdf생성  (0) 2010.12.07
[Java] File Size 체크  (0) 2010.12.07
[Java] JavaMail 패키지  (0) 2010.12.07

+ Recent posts