본문 바로가기
자바

자바 HTML 을 PDF파일로 변환!

by 처리2 2020. 12. 22.
반응형

ajax를 통해서 html을 받아 그 데이터를 pdf파일로 변환하여 다운로드 받는 작업을 해야했다..

 

여기 저기 검색해보고 나서 나온 결과는 과연?

두구둑두굳굳구둑두구구구구구

 

 

아 그전에

 

compile group: 'com.itextpdf', name: 'itextpdf', version: '5.5.13'

compile group: 'com.itextpdf', name: 'itext-pdfa', version: '5.5.13'

compile group: 'com.itextpdf.tool', name: 'itext-pdfaxmlworker', version: '5.5.13'

* 간혹

compile group: 'com.itextpdf', name: 'itext-xtra', version: '5.5.13'

이거 하라는 게시글 있는데 바로 닫기 누르셈 저거 넣으면 실행안됌 ㅋㅋ

 

 

 

자 다시 두굳구둑둑구두구구구

	public MultipartFile createPdf()
            throws DocumentException, IOException {
        
		String resourcePath = "리소시스 경로";
		
        //서버 내 파일 주소
        String path = "";
        
        File saveFolder = new File(path);
        
        //경로가 없으면 생성한다.
        if (!saveFolder.exists() || saveFolder.isFile()) {
            saveFolder.mkdirs();
        }
        
        //용지 설정이 가능하다. 생략해도 무관
        // Document document = new Document(PageSize.A4, 50, 50, 50, 50); 
        Document document = new Document();
        
        //파일 확장자는 pdf
        String filename = "newPDF"
        filename += ".pdf";
        
        //전체 경로 파일 확장자 포함
        String realName = path;
        realName += filename;
        File pdfFile = new File(realName);

        //파일이 있으면 삭제(같은 이름으로 만들 때마다 새로 쓰기 위해서)
            if (pdfFile.isFile()) {
                pdfFile.delete();
            }
        
            //pdf를 만들기 시작한다.
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(realName));      
        
        document.open();

        //이미지 태그 절대경로 사용해야 한다.(반드시)        
//        htmlStr = htmlStr.replaceAll("src=\"/", "src=\"http://127.0.0.1:8080/");
        //폰트를 설정한다. 폰트 설정 누락시 한글이 안보이는 경우 발생
        htmlStr = "<html><body style='font-family: MalgunGothic;'>"+ 여기 html값 아무거나 +"</body></html>";
        
        XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
        
        //css파일
        CSSResolver cssResolver = new StyleAttrCSSResolver();
        CssFile cssFile = XMLWorkerHelper.getCSS(new FileInputStream(resourcePath + "sub.css"));
        CssFile cssFile2 = XMLWorkerHelper.getCSS(new FileInputStream(resourcePath + "common.css"));
        cssResolver.addCss(cssFile);
        cssResolver.addCss(cssFile2);
        
        XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
        
        //매우매우 중요!! 
        //반드시 해당 폰트가 경로내에 있어야한다. 
        //(폰트 존재하지 않을 시 pdf 생성 후 열리지 않는 에러 발생)
        fontProvider.register(resourcePath +"/malgun.ttf", "MalgunGothic"); //MalgunGothic은 font-family용 alias
        CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
            
        HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
        htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
            
        // html을 pdf로 변환시작
        PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
        HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
        CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
            
        XMLWorker worker = new XMLWorker(css, true);
        //캐릭터 셋 설정
        XMLParser xmlParser = new XMLParser(worker, Charset.forName("UTF-8"));
        
        StringReader strReader = new StringReader(htmlStr);
        xmlParser.parse(strReader);
        
        document.close();
        writer.close();
        
        FileItem fileItem = new DiskFileItem("mainFile", Files.probeContentType(pdfFile.toPath()), false, pdfFile.getName(), (int) pdfFile.length(), pdfFile.getParentFile());

        try {
            InputStream input = new FileInputStream(pdfFile);
            OutputStream os = fileItem.getOutputStream();
            IOUtils.copy(input, os);
        } catch (IOException ex) {
            // do something.
        }

        MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
        
        return multipartFile;        
    }

 

 

여기서 중요한거 !!

 

1. html에 input 태그 , br 태그 , col 태그 는 안먹힌다.. 아마 들어가있으면 주석으로 처리를 해줘야합니다.

 

2. css는 절대 경로로 지정해주어야함. 그리고 html 안에 넣어봤자 따로 설정해줘야하기 때문에 빼서 쓰는게 좋습니다.

 

3. 그리고 폰트 malgun.ttf 부분도 꼭 넣어줘야함 절대경로로 넣어주시길 바랍니다.

 

반환은 MultipartFile 로 했는데 따로 file을 변환해준것... 저거는 다시 작성해보겠슴다.!

반응형

댓글