web/Spring

Spring framework에서 html을 pdf만들어 다운로드 하기

업무적으로 html 코드를 이용하여 pdf 파일로 내보내기 위해서 자료수집을 많이했다.

하지만 결론부터 이야기하면 원하는대로 다 되지는 않았다.
밑에 이야기 하겠지만 html을 pdf로 만들어주는 라이브러리가 정확하게 html모든 태그를 파싱하지 못할뿐만 아니라, css적용도 정상적으로 되지 않았다. 



그래도 다시해본 결과!!!!! ( 이 글 쓰고나서 더 조사해본 결과.. 포기하지 마시길 )

=> html2pdf를 사용하면 거의 대부분의 css를 적용할 수있다.



1. pom.xml 설정 
itextpdf -> pdf를 생성하기 위해 필요한 라이브러리
xmlworker -> xml 파싱을 위해 필요한 라이브러리
html2pdf -> itext의 7버전을 사용하기 위해 필요한 라이브러리


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>
        
<!-- https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker -->
<dependency>
    <groupId>com.itextpdf.tool</groupId>
    <artifactId>xmlworker</artifactId>
    <version>5.5.13</version>
</dependency>
            
<!-- https://mvnrepository.com/artifact/com.itextpdf/html2pdf -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>html2pdf</artifactId>
    <version>2.0.2</version>
</dependency>
cs



2. view 관련 설정
BeanNameViewResolver 설정은 뷰 이름과 동일한 이름을 가진 빈을 뷰 클래스로 사용한다.
ex) 만약 pdfview라는 view를 컨트롤러에서 호출 할 시 해당요청에 대한 view는 pdfview 클래스에 처리



1
2
3
<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
    <beans:property name="order" value="0" />
</beans:bean>
cs




3. AbstractView 클래스 설정
기존의 Spring에서 제공하는 AbstractPdfView 클래스를 이용하여 pdf view를 사용할 수 있으나, 해당 클래스는 com.itext라이브러리가 아닌 com.lowagie만을 사용할 수 있다. 

 두 개의 라이브러리는 서로 같지만 com.lowagie 라이브러리는 com.itext의  2.1.7버전과 동일하고 더이상 지원이 멈추어서 새로 제공되는 기능을 사용할 수 없다. 그렇기 때문에 이 문제를 해결하기 위해서 AbstractView를 상속하여 com.itext 라이브러리를 사용할 수 있는 클래스를 재정의 해야한다. 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.wedul.pdf;
 
import java.io.ByteArrayOutputStream;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.web.servlet.view.AbstractView;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
 
public abstract class AbstractITextPdfView extends AbstractView {
 
public AbstractITextPdfView() {
    setContentType("application/pdf");
}
 
@Override
protected boolean generatesDownloadContent() {
    return true;
}
 
@Override
protected final void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception  {
 
    // IE workaround: write into byte array first.
    ByteArrayOutputStream baos = createTemporaryOutputStream();
 
    // Apply preferences and build metadata.
    Document document = new Document(PageSize.A4.rotate(), 36365436);
    PdfWriter writer = PdfWriter.getInstance(document, baos);
    prepareWriter(model, writer, request);
    buildPdfMetadata(model, document, request);
 
    // Build PDF document.
    document.open();
    buildPdfDocument(model, document, writer, request, response);
    document.close();
 
    // Flush to HTTP response.
    response.setHeader("Content-Disposition""attachment");    // make browser to ask for download/display
    writeToResponse(response, baos);
}
 
protected void prepareWriter(Map<String, Object> model, PdfWriter writer, HttpServletRequest request) throws DocumentException {
    writer.setViewerPreferences(getViewerPreferences());
}
 
protected int getViewerPreferences() {
    return PdfWriter.ALLOW_PRINTING | PdfWriter.PageLayoutSinglePage;
}
 
 
protected void buildPdfMetadata(Map<String, Object> model, Document document, HttpServletRequest request) {
}
 
 
protected abstract void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer,
                                         HttpServletRequest request, HttpServletResponse response) throws Exception;
}
cs



그리고 기본적으로 폰트가 한글을 지원하지 않기때문에 한글지원을 위해서 폰트를 제공해 주어야한다. 이를 위해서 사용하는 fontprovider 클래스를 구현해야한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.wedul.pdf;
 
import java.io.IOException;
 
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactoryImp;
import com.itextpdf.text.pdf.BaseFont;
 
class DefaultFontProvider extends FontFactoryImp {
 private String _default;
 public DefaultFontProvider(String def) {
  _default = def;
 }
 
 // I believe this is the correct override, but there are quite a few others.
 public Font getFont(String fontname,String encoding, boolean embedded, float size,int style, BaseColor color) {
  try {
   //한글 깨짐을 방지 하기위한 폰트 세팅
   return new Font(BaseFont.createFont(_default, BaseFont.IDENTITY_H, BaseFont.EMBEDDED), 9, style, BaseColor.BLACK);
  } catch (DocumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return null;
 }
 
}
cs




3. Controller 


1
2
3
4
5
6
@RequestMapping(value = "/download/pdf", method = RequestMethod.GET)
public ModelAndView downloadPdf() {
    ModelAndView modelAndView = new ModelAndView("pdfView""fileName""test.pdf");
    return modelAndView;
}
 
cs




4. PdfView 클래스
실질적인 pdf 파일을 만드는 클래스이다. pdf를 만드는 라이브러리는 버전 별로 사용하는 방법이 다르다.

1.) 2.x 버전
HTMLWorker를 사용하여 만들수 있다. 하지만 아주 기초적인 태그에 대해서 지원해주고 css지원이 적으나 심플하게 pdf를 만들 수 있기 때문에 가장 많이 사용 되는 버전이다.

2.) 5.x 버전
XMLWorker와 XMLParser를 통해서 pdf를 만들수있다. 하지만 여기서 문제가 발생했는데, 단순하게 XMLParser 클래스에서 parse 메소드를 통해서 pdf를 만들수있지만 div 태그가 포함될경우 만들어지지 않는다. 또 XMLWorkerHelper 클래스를 통해서 각각 Element를 사용할 경우 css가 적용이 되지 않는다. (삽질을 하게 만들었다 아주 맘에 안들었다...)

3.) 7.x
HtmlConverter 클래스를 통해서 변경할 수 있지만 이것을 spring에서 사용하기에는 좀 부적절 했다.

-> Spring에서 ModelAndView를 사용해서 pdf를 만들지 않고 라이브러리에서 제공하는 방식으로 하면 가장 좋게 만들어진다.

모든 버전에 대한 코드를 적어보았다..



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import java.io.FileInputStream;
import java.io.StringReader;
import java.nio.charset.Charset;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.stereotype.Component;
 
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.ElementList;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.CssFile;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.CssAppliers;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.ElementHandlerPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
 
@Component
public class PDFView extends AbstractITextPdfView {
 
    @SuppressWarnings({ "static-access""deprecation""unchecked" })
    protected void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        // version 7        
//        PdfWriter writer2 = PdfWriter.getInstance(document, response.getOutputStream());
//        String fileName = String.valueOf(model.get("fileName"));
//         
//        // 파일 다운로드 설정
//        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
//        response.setHeader("Content-Transfer-Encoding", "binary");
//        response.setContentType("application/pdf");
//        
//        document.open();
//        XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
//
//        // 폰트 설정에서 별칭으로 줬던 "MalgunGothic"을 html 안에 폰트로 지정한다.
//        String htmlStr = "<html><head><body style='font-family: MalgunGothic;'>"
//                    + "<p>PDF 안에 들어갈 내용입니다.</p>"
//                    + "<div><h3>한글, English, 漢字.</h3></div>"
//                + "</body></head></html>";
//         
//        HtmlConverter.convertToPdf(htmlStr, response.getOutputStream(), null);
        
        
        // version 5
        // PdfWriter 생성
        PdfWriter.getInstance(document, response.getOutputStream());
        String fileName = String.valueOf(model.get("fileName"));
         
        // 파일 다운로드 설정
        response.setHeader("Content-Disposition""attachment; filename=\"" + fileName + "\";");
        response.setHeader("Content-Transfer-Encoding""binary");
        response.setContentType("application/pdf");
         
        // Document 오픈
        document.open();
        
        // CSS
        CSSResolver cssResolver = new StyleAttrCSSResolver();
        CssFile cssFile = XMLWorkerHelper.getInstance().getCSS(new FileInputStream(PDFView.class.getClassLoader().getResource("pdf.css").getPath()));
        cssResolver.addCss(cssFile);
             
        // HTML, 폰트 설정
        XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
        fontProvider.register(PDFView.class.getClassLoader().getResource("malgun.ttf").getPath(), "MalgunGothic"); // MalgunGothic은 alias,
        CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
         
        HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
        htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
         
        // Pipelines
        ElementList elements = new ElementList();
        ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);
        HtmlPipeline html = new HtmlPipeline(htmlContext, end);
        CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
        
        String htmlStr0 = "<html><head><body style='font-family: MalgunGothic;'>"
                + "<p>PDF 안에sdf 들어갈 내용입니다.</p>"
                + "<div style='text-align:center; font-size:30px;'; ><h3>한글sdf, English, 漢字.</h3></div>"
                + "</body></head></html>";
        
        XMLWorker worker = new XMLWorker(css, true);
        XMLParser xmlParser = new XMLParser(worker, Charset.forName("UTF-8"));
        
        for (int i =0 ; i <= 1 ; i++) {
            // 폰트 설정에서 별칭으로 줬던 "MalgunGothic"을 html 안에 폰트로 지정한다.
            StringReader strReader;
            
            strReader = new StringReader(htmlStr0);
            xmlParser.parse(strReader);
            
            PdfPTable table = new PdfPTable(1);
            PdfPCell cell = new PdfPCell();
            
            for (Element element : elements) {
                cell.addElement(element);
            }
            table.addCell(cell);
            document.add(table);
            document.newPage();
        }
        
        document.close();
        writer.close();
 
// version 2                
//        String fileName = String.valueOf(model.get("fileName"));
//        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
//        response.setHeader("Content-Transfer-Encoding", "binary");
//        response.setContentType("application/pdf");
//        
//        StyleSheet css = new StyleSheet();
//        css.loadTagStyle(HtmlTags.H1, "color", "red");
//        
//        HTMLWorker htmlWorker = new HTMLWorker(document);
//        HashMap<String, Object> interfaceProps = new HashMap<String, Object>();
//        
//        DefaultFontProvider dfp = new DefaultFontProvider(PDFView.class.getClassLoader().getResource("malgun.ttf").getPath());
//        interfaceProps.put(HTMLWorker.FONT_PROVIDER, dfp);
//
//        StringReader reader = null; 
//        PdfWriter.getInstance(document, response.getOutputStream());
//        document.open();
//        
//        reader = new StringReader(
//                  new
//                  StringBuffer("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
//                  .append("<html xmlns=\"http://www.w3.org/1999/xhtml\"><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head><body>").append("<h1>").append("test").
//                  append("</h1>")
//                  .append("테스트 입니다").append("</body></html>").toString());
//        
//        List<Element> objects = htmlWorker.parseToList(reader, css, interfaceProps);
//        for (int k = 0; k < objects.size(); ++k) {
//            document.add((Element) objects.get(k));
//        }
//            
//        document.close();
    }
}
cs


삽질의 결론은 스프링에서 Pdf ModelAndView를 사용할 때는 2.x 버전의 HTMLWorker를 쓰기로 하였고 단순 pdf파일을 만들때는 7.x 버전을 사용하기로 하였다.



몇가지 삽질 하면서 찾은 고생하신 분들의 출처 사이트도 적어본다.


출처
버전 2
http://zero-gravity.tistory.com/251

버전 5
http://kooremo.tistory.com/m/entry/itext이용해서-pdf파일-만드는-샘플-소스

XMLParser 사용시 div가 포함된 html이 생성되지 않는다고 고민하는 사람의 주소
http://itext.2136553.n4.nabble.com/Problems-with-the-font-tags-and-div-tags-in-xml-worker-td4657646.html






소스 풀버전은 내 github 페이지에서 확인할 수 있다.
https://github.com/weduls/pdfdown_example

  1. 제발 편집답글

    2번 view 관련설정을 springboot gradle project 에서 하려면 어떻게 설정해줘야 하나요
    광고는 클릭 했습니다. (찡긋)

    • wedul 편집

      광고 클릭 감사합니다.
      gradle 프로젝트 여부와 상관없이 글에서 2번은 xml로 bean을 생성해 준것이기 때문에 저대로 하셔도 됩니다. 만약 자바로 configuration으로 bean을 생성해주고 싶을때는 이 소스를 참고하시면 될거에요 https://github.com/weduls/pdfdown_example/blob/master/src/main/java/com/wedul/pdf/Conf.java

      위에 git 주소에 샘플 코드가 들어있으니 한번 확인해보세요~

    • 제발 편집

      2버전은 이미지가 안들어가고

      5버젼은 inline으로 css 줘도 에러나고

      7버전은 한글 안나오는거 맞나요?

      제가 잘 못하고 있는건지 원래 그런건지 모르겠어서 여쭤 봅니다. ㅜㅜ

    • wedul 편집

      개발을한지 좀 되어서 기억이 가물가물하지만 정리하면 2번은 간단한기능만 심플하게 가능했고 5번은 div와 같은 특정 태그가 제공되지 않았습니다.

      이 글에는 없지만 git에 있는 코드를 보면 7버전을 사용하여 한글화 까지 진행한 코드가 있을 겁니다.

      아마 제발님도 7버전을 사용하시면 원하시는대로 pdf를 만드실 수 있을 것 같습니다.

      아무쪼록 성공하시길 바랍니다.

  2. 덕덕 편집답글

    안녕하세요. 초보개발자입니다. 제가 bootstrap에서 제공되는 summernote의 code(css와 html이 모두 들어있는)를 ajax로 넘겨서 pdf로 똑같이 출력하고 싶은데요. Spring을 사용하다보니 이해가 안가는 부분이 있어서 질문드려요. ajax에서 넘긴 정보(정보까진 가져왔습니다 controller로)를 어떻게 pdfview로 가져가서 셋팅하고 파일을 생성하는지 궁금합니다.

    • Favicon of https://wedul.site BlogIcon 위들 wedul 편집

      네 안녕하세요. 위에 올려놓고 git에도 올려놓은방식대로 AbstractITextPdfView을 상속잗아 구현한 pdfView 컴포넌트를 만드시고 그 후 컨트롤러에서 받은 html코드를 해당 view로 넘겨서 라이브러리 버전중 편하신 방식대로 처리하시면 될 것 같습니다.

      위에 있는 코드만 사실 복붙하셔도 잘될거에요

    • 덕덕 편집

      여기서 사용되고 있는 css와 폰트 설정을 안쓰고 부트스트랩에서 제공하는걸 쓰려면 그 경로로 설정해줘야 하나요?
      제 css 경로가 ${pageContext.request.contextPath}/resources/css/vertical-layout-light/style.css" 인데 계속 널포인트가 뜨네요 ㅠ..

    • Favicon of https://wedul.site BlogIcon 위들 wedul 편집

      spring 자체에 이해가 조금 더 필요할 것 같습니다. 제가 더 설명하고 싶지만 덕덕님에 소스를 보지 못하는 상태에서는 많이 어렵네요.

      쉽게 설명하자면 pdfView를 하나 만들고 그 부분에서 라이브러리를 사용해서 html소스와 css를 넣어주고 해서 다운로드 가능하게 해준다.

      위에 부분이 실 로직에 전부입니다. 파일을 잘 가지고 오셔서 다시한번 시도해보세요. 건승을 빌겠습니다!!!

  3. 덕덕 편집답글

    다시 한번 질문해서 죄송합니다. 에러 없이 모든 코드가 실행되는데 따로 다운로드 창이 따로 나오지 않습니다. 뭐가 문제일까요??

    • Favicon of https://wedul.site BlogIcon 위들 wedul 편집

      컨트롤러에서 modelandview객체를 정상적으로 반환 하셨나요? pdfview 컴포넌트에 함수 반환 부분도 확인해보세요

  4. 닉넴 편집답글

    안녕하세요. 먼저 좋은 글 남겨주셔서 감사합니다.
    그런데 혹시 itext 에서는 <input type='text' id='aa' name='aa' vlaue='abcd'> 이렇게 value값을 absolute 를 이용해서
    원하는 위치에 찍어낼 방법은 없을까요??

  5. hans 편집답글

    개발중 막막해서 질문남깁니다..
    추상클래스내 prepareWriter 메소드는 어디에 존재하는 메소드인가요? 에러가나서 컴파일되지않는데..

    • Favicon of https://wedul.site BlogIcon 위들 wedul 편집

      같은 추상클래스내에 있습니다

    • hans 편집

      아...그러네요ㅠㅠ 감사합니다!!

  6. 초보개발 편집답글

    안녕하세요! 스프링공부하는 학생입니다. pdf 2버전을 사용하면 태그가 적용이안되고 7버전을 사용하면 한글이 안되던데 한글 적용시키는 방법이 혹시 있을까요???
    fontprovider는 만들었습니다

    • Favicon of https://wedul.site BlogIcon 위들 wedul 편집

      한글 글꼴파일을 지정해주면 한글을 출력하실수 있습니다.

    • 초보개발 편집

      죄송한데 한글 글꼴파일을 어떻게지정하는거죠??ㅠㅠ 7버전에 한글글꼴파일을 지정하는 코드를 추가해야하나요??

    • Favicon of https://wedul.site BlogIcon 위들 wedul 편집

      https://itextpdf.com/en/blog/technical-notes/pdfhtml-configuration-options

      이 글을 참고해보세요.
      폰트 설정하는 방법이 있네요

  7. 감사합니다 편집답글

    먼저 너무나 감사드립니다.

    작성해주신 게시물 보고 현재 만들고 있는 휴가신청서 양식을 거의 다 만들었습니다.
    마지막 하나만 해결하면 되는데요 ..

    밑에 이름이 있고 서명하는 '(인)' 부분에 서명 이미지 파일을 img 태그에 박아서 z-index 로
    '(인)' 위에다가 서명 이미지 파일이 박혀있는 <img> 겹치게 배치하고 싶은데요.. 이게 잘 안되네요 ..
    p태그인 '(인)'에 background-image 를 줘도 안먹더라구요 ...

    이게 해결이 잘 안되고 있어서 완성을 못하고 있습니다 ㅎㅎㅎㅎㅎ

    일단 버전은 현재 게시물에 있는 버전으로 개발을 했습니다.

    위 댓글에 '아마 제발님도 7버전을 사용하시면 원하시는대로 pdf를 만드실 수 있을 것 같습니다.'
    라고 하셨는데요. 7버전에서는 위 같은 문제를 해결할 수 있으려나요..
    7버전 소스를 넣었는데 계속 에러가 나서 ... 아직 적용을 못해봤습니다 ...

    현재 게시물에 있는 버전으로는 z-index를 통해서 태그끼리 겹치기는 불가능한 걸까요 ??

    • Favicon of https://wedul.site BlogIcon 위들 wedul 편집

      해당 라이브러리가 태그랑 css가 조금 제한되기 때문에 조금 답답한 부분이 있습니다. 계속 테스트 해보셔야 할거같아요 ㅠ 그리고 7버전이 그나마 가장 많이 호환되는거 같으니 잘 적용해보시면 도움이 되실거에여.

      저도 이걸 적용해 본적이 오래되어 크게 도움은 못드려서 죄송합니다 ㅠ

    • 감사합니다 편집

      ㅎㅎㅎ 아닙니다 위들님 덕분에 만들 수 있었는걸요
      7버전 적용이 시급한데 .. 에러 해결에 힘써야겠군요 ㅎㅎㅎ
      답변 감사드려요 ^^

      좋은 하루 되세요 ^^

  8. 감사합니다 편집답글

    ㅎㅎㅎ 아닙니다 위들님 덕분에 만들 수 있었는걸요
    7버전 적용이 시급한데 .. 에러 해결에 힘써야겠군요 ㅎㅎㅎ
    답변 감사드려요 ^^

  9. 핵초보 편집답글

    안녕하세요! 스프링 공부하고 있는 학생입니다.!!
    jsp 페이지에서 폼 작성 후 버튼을 누르면 pdf 파일이 생성되고 다시 홈페이지에 보이게 만들고 싶은데 ,
    일단 jsp의 html 태그들을 Controller 로 보내질 못하고 있습니다..
    jsp 의 html 태그를 그대로 PDFview.java 로 보내는지
    아니면 jsp 의 데이터들을 PDFview.java 에 미리 만들어 놓은 html 폼에 적용 시켜주는지 궁금합니다.!!
    만약 jsp에서 html 태그를 그대로 PDFview.java 로 보낸다면 어떻게 해야하는지 궁금합니다!!!

    • Favicon of https://wedul.site BlogIcon 위들 wedul 편집

      jsp폼에서 작성한 내용으로 만들고 싶으시면 컨트롤러에서 데이터를 받아서 modelAndView에서 PdfView호출시 값을 넘겨서 html코드를 대신해서 사용하시면 해결되실거에요

  10. 초보개발자 편집답글

    안녕하세요! 좋은 소스덕분에 pdf출력을 쉽게 할수있었습니다!ㅎㅎ
    pdf출력시 테두리가 생기던데
    어떤 이유에 의해서 생기는건지 알수있을까요??

    • Favicon of https://wedul.site BlogIcon 위들 wedul 편집

      도움이 되었다니 다행이네요. 테두리는 div나 테두리 cas가 적용되었는지 한번 확인해보세요~

    • 초보개발자 편집

      PdfPCell 의 border문제였습니당! 감사합니다ㅎㅎㅎ

푸터바

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

  • Today : 18
  • Yesterday : 371
  • Total : 93,047