JSP야

[복사되는블로그 꼬마갱이] HTML을 PDF로 변환하기

administrators 2010. 6. 18. 14:43

HTML(JSP)를 PDF로 변환 해봅시다.

 

iText, iReport ... 에휴.. 정말 많기는 하죠...

 

JSP를 만들고 그냥 바로 PDF로 변환하는 방법이 있다면...

 

그래서~~  wkhtmltopdf(GNU라이센스)을 이용해서 만들었습니다.

 

 우선 개념은

1. 출력할 HTML(JSP)를 만들고

2. wkhtmltopdf를 이용해서 로컬에 PDF를 만들고

3. 그 PDF문서를 다운받게 해준다.

 

맘에 안드시는 분은 뒤로~ 클릭하시고요...

 

쉬우니까 걍 쓰시겠다는분은 이제 계속보세요.

 

1. 출력할 HTML(JSP)를 만듭니다. (생략ㅋㅋ)

 

2. wkhtmltopdf를 다운 받습니다.

 home: http://code.google.com/p/wkhtmltopdf/

download: http://code.google.com/p/wkhtmltopdf/downloads/list

각 OS에 맞는 버젼을 설치 하세요.

윈도우는 wkhtmltopdf-0.9.0_beta3 Windows Static Binary 를 사용하셔도 됩니다.(deprecate 된버전이긴합니다만;;)

 

3. 다음 2개의 자바파일을 적절히 사용해서 변환하세요.

Test.java

package com;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

    public class Test {
        public boolean runCmd(String strCmd) {
            boolean returnVal = false;
            Runtime run = Runtime.getRuntime();
            Process p = null;
            try {
                p = run.exec(strCmd);
                StreamPrintThread errprint = new StreamPrintThread(p.getErrorStream());
                StreamPrintThread okprint = new StreamPrintThread(p.getInputStream());
                p.getOutputStream().close();
                errprint.start();
                okprint.start();
                int rst = p.waitFor();
                if ( 0 == rst) {
                    System.out.println("RunProgram success : " + strCmd);
                    returnVal = true;
                }else {
                    System.out.println("RunProgram fail (rst:"+ rst +") : " + strCmd);
                    returnVal = false;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (null != p) p.destroy();
            }
            return returnVal;
        }
}
   
    class StreamPrintThread extends Thread {
        BufferedReader br = null;
        private StreamPrintThread() {}
        public StreamPrintThread(InputStream is) {
            br = new BufferedReader(new InputStreamReader(is));
        }
        void close() {
            try {
                if(br != null) br.close();
            }catch(Exception e) {
                e.printStackTrace();
                System.out.println(e);
            }
        }
        public void run() {
            try {
                String line = null;
                while((line = br.readLine()) != null) {
                    System.out.println(line);
                }
            }catch(Exception e) {
                e.printStackTrace();
                System.out.println(e);
            }finally {
                close();
            }
        }
    }

  

Test2.java

package com;
public class Test2 {
    public static void main(String[] args) {
        String strHtml = "\"http://www.naver.com\"";
        String strPdf = "D:\\pdf\\test.pdf";
        String strCmd = "D:\\pdf\\wkhtmltopdf-0.8.3.exe";
        strCmd += " " + strHtml;
        strCmd += " " + strPdf;
       
        Test t = new Test();
        System.out.println(  t.runCmd(strCmd)  );
    }
}

 

Test2에서 리턴되는 값이 True/False입니다.

 True일때 스트림을 열어서 다운로드 시키면 되겠네요 ㅎㅎ

 

 

아름답거나 정통 방법은 아니지만 쉬운방법이지요

급할땐 이걸로 쓰세요~~

 

 아래는 명령어 도움말입니다.

help.txt

 

 

- write by 꼬마갱이 2010.06.18 -

 

 

 

원숭이가 질문을 했더군요

http://code.google.com/p/wkhtmltopdf/issues/detail?id=227&q=encoding

대충 내용은 EUC-JP가 나오게 해달라고요;;

클릭했다가 스모하는 사진이랑 왕창깨진 원숭이말을 볼수있었어요(PDF)

http://wkhtmltopdf.googlecode.com/issues/attachment?aid=4243962110247761538&name=yahoo_jp_dailynews.pdf&token=LCPxqENqD9KgPNVDMDQUiOP5q24%3A1351751105357


혹시 PDF에 한글이 깨지시는 분들

원숭이처럼 거기에 질문하지 마시고요.

꼬마갱이가 대신 삽질해봤습니다.

 

우선 JSP를 UTF-8로 만드세요.

 <%@ page contentType="text/html;charset=utf-8" %>

반드시 파일인코딩도 utf-8로 맞추세요(멜폼드익셉숀이 일어날수있습니다.ㅋ 발음조타)

그러면 끝~~~

 

 

 

Test2.java
0.0MB
Test.java
0.0MB
help.txt
0.01MB

'JSP야' 카테고리의 다른 글

request  (0) 2009.12.23
User-Agent - 브라우져 알아내기  (0) 2009.12.23
java.util.Date  (0) 2009.12.07
sendRedirect  (0) 2009.12.07
Parameter알아보기  (0) 2009.12.07