아래의 소스 처럼 pdf를 만드는 소스를 작업 하게 되면 한글 및 css때문에 처리에 어려움이 있습니다.
css도 제약이 많아서 우선 아래와 같이 xml형식으로 처리 하는 경우 태그를 닫는건 잘 찾아서 처리 해줘야 합니다. 요즘에는 소스 코딩을 html5로 하니까... 태그를 안 닫는 경우가 많아 관련 부분 작업이 필요 합니다. 한글은 font파일로 해결 합니다.
public static void main(String[] args) throws Exception {
// Document 생성
Document document = new Document(PageSize.A4, 50, 50, 50, 50); // 용지 및 여백 설정
// PdfWriter 생성
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/테스트/test.pdf")); // 바로 다운로드.
//PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());
writer.setInitialLeading(12.5f);
// Document 오픈
document.open();
XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
// CSS
CSSResolver cssResolver = new StyleAttrCSSResolver();
CssFile cssFile = helper.getCSS(new FileInputStream("D:/테스트/pdf.css"));
cssResolver.addCss(cssFile);
// HTML, 폰트 설정
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("D:/테스트/NanumGothic-Regular.ttf", "NanumGothic"); // MalgunGothic은 alias,
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
// Pipelines
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"));
String htmlStr = "html태그 여기에 작성해서 처리 한글이 처리 안되면 폰트가 안맞아서 그러는거니 아래 처럼 폰트를 임의로 수정";
htmlStr = htmlStr.replaceAll("<br>", "<br>");
htmlStr = htmlStr.replaceAll("rgb\\(0, 0, 0\\);", "");
htmlStr = htmlStr.replaceAll("font-family: 굴림;", "font-family: NanumGothic;");
htmlStr = htmlStr.replaceAll("font-family: 굴림체;", "font-family: NanumGothic;");
htmlStr = htmlStr.replaceAll("img src=\"/", "img src=\"http://xxxxxxxxxx/");
htmlStr = htmlStr.replaceAll(".*","");
//이미지 태그 안닫힌 태그들 찾아서 닫는 작업 진행
Pattern pattern = Pattern.compile("</p><img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>");
Matcher match = pattern.matcher(htmlStr);
while(match.find()){
String imgTag = match.group();
String imgTag2 = imgTag.replaceAll(">", "/>");
htmlStr = htmlStr.replaceAll(imgTag, imgTag2);
}
Pattern pattern2 = Pattern.compile("<col[^>]*style=[\"']?([^>\"']+)[\"']?[^>]*>");
Matcher match2 = pattern2.matcher(dataContent);
while(match2.find()){
String colTag = match2.group();
String colTag2 = colTag.replaceAll(">", "/>");
dataContent = dataContent.replaceAll(colTag, colTag2);
}
StringReader strReader = new StringReader(htmlStr);
xmlParser.parse(strReader);
document.close();
}
반응형
'JAVA' 카테고리의 다른 글
문자열에서 특정문자 개수 확인하기 (0) | 2017.12.07 |
---|---|
sitemash 이용시 한글 깨지는 경우 (0) | 2017.02.27 |
스크린샷 소스 (0) | 2016.05.10 |
html화면 pdf로 변경하는 소스 (0) | 2016.05.10 |
트위터 연동(java 소스기준 로그인) (0) | 2016.03.01 |