package kr.co.udapsoft.common.util; import java.awt.Dimension; import java.awt.Insets; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.StringReader; import java.net.MalformedURLException; import java.security.InvalidParameterException; import kr.co.hsnc.common.base.WAFLogger; import kr.co.hsnc.common.config.WAFConfig; import kr.co.hsnc.common.util.ValueObject; import org.zefer.pd4ml.PD4Constants; import org.zefer.pd4ml.PD4ML; import org.zefer.pd4ml.PD4PageMark; import crosscert.Hash; public class PDFMaker { private int htmlWidth = 750; private String header = null; private String footer = null; private String footerDefault = "*본 계약서는 상기업체 간에 전자서명법 등 관련법령에 근거하여 전자서명으로 체결한 전자계약서입니다.
  전자계약 진위여부는 협력업체포털시스템(http://partner.sgcenc.co.kr)에서 확인하실 수 있습니다."; private String cont_no = ""; private String cont_chasu = ""; private String file_seq = ""; private String random_no = ""; private String cont_userno = ""; // 사용자 계약번호 public static void main(String[] args) throws InvalidParameterException, MalformedURLException, IOException{ PDFMaker ed = new PDFMaker(); //ed.generatePDF("file:///d:/CJ-GLS 택배대리점 계약서.html", new File("d:/CJ-GLS 택배대리점 계약서.pdf"), PD4Constants.A4); try { File f = new File("D:/Project4/pd4ml/html/", "엔지니어링 표준하도급계약서(전문).html"); FileReader reader = new FileReader(f); BufferedReader buffer = new BufferedReader(reader); String html = ""; String str = buffer.readLine(); while(str!=null) { html += str; str = buffer.readLine(); } buffer.close(); StringBuffer documentContents = new StringBuffer(); //documentContents.append(""); documentContents.append(""); documentContents.append(""); documentContents.append(html); documentContents.append(""); ed.generatePDF(documentContents.toString(), "D:/Project4/pd4ml/html/", "엔지니어링 표준하도급계약서(전문).pdf"); } catch(IOException e) { e.printStackTrace(); } } public String getContNo() { return cont_no+"-"+cont_chasu+"-"+random_no; } public void setContNo(String cont_no, String cont_chasu, String random_no, String file_seq) { this.cont_no = cont_no; this.cont_chasu = cont_chasu; this.random_no = random_no; this.file_seq = file_seq; } private String getUserContNo() { return this.cont_userno; } public void setUserNo(String cont_userno) { this.cont_userno = cont_userno; } public String getHeader() { return header; } public void setHeader(String header) { this.header = header; } public String getFooter() { return footer; } public void setFooter(String footer) { this.footer = footer; } public int getHtmlWidth() { return htmlWidth; } public void setHtmlWidth(int htmlWidth) { this.htmlWidth = htmlWidth; } /** * PDF 문서 생성 * @param url * @param outputPDFFile * @param format * @return */ public boolean generatePDF(String url, File outputPDFFile, Dimension format) { FileOutputStream fos = null; try{ fos = new FileOutputStream(outputPDFFile); PD4ML pd4ml = new PD4ML(); PD4PageMark headerMark = new PD4PageMark(); headerMark.setAreaHeight( 30 ); //header 영역 설정 //header 데이터 셋팅 if(header == null){ if(!this.getUserContNo().equals("")) headerMark.setHtmlTemplate("
* 계약번호: "+this.getUserContNo()+"
"); else headerMark.setHtmlTemplate(""); }else{ headerMark.setHtmlTemplate(header); } pd4ml.setPageHeader(headerMark); //footer 영역설정 PD4PageMark footerMark = new PD4PageMark(); footerMark.setAreaHeight( 40 ); //footer 데이터 셋팅 if(footer == null){ footerMark.setHtmlTemplate("
"+footerDefault+ " (관리번호:"+this.getContNo()+")
"); }else{ footerMark.setHtmlTemplate(""+ getFooter() +""); } pd4ml.setPageFooter(footerMark); pd4ml.setPageInsets(new Insets(10,20,5,20)); //여백설정 pd4ml.setHtmlWidth(getHtmlWidth()); //변환할 html의 width 정보 pd4ml.setPageSize(PD4Constants.A4); //용지모양 A4설정 //pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4)); //가로로 설정 pd4ml.useTTF("java:fonts", true); //지정한 폰트 사용 //pd4ml.setDefaultTTFs("Nanum Gothic", "Times New Roman", "Arial"); //default 폰트 설정 pd4ml.setDefaultTTFs("Nanum Gothic", "Times New Roman", "Arial"); //default 폰트 설정 pd4ml.enableDebugInfo(); pd4ml.render(new java.net.URL(url), fos); return true; }catch(Exception e){ e.printStackTrace(); return false; }finally{ if(fos != null) try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } public ValueObject makeContPdf(ValueObject vo){ ValueObject pdf = null; try{ String fontSize = "12px"; if(!vo.get("font_size").equals("")){ fontSize = vo.get("font_size"); } String pdfDir = WAFConfig.get("waf.repository.path")+"/cont/"; String fileDir = vo.get("folder") +"/"+ vo.get("cont_no")+"/"; String fileName = vo.get("cont_no")+"_"+vo.get("cont_chasu")+"_"+vo.get("file_seq")+".pdf"; String path = pdfDir + fileDir+fileName; StringBuffer documentContents = new StringBuffer(); //documentContents.append(""); documentContents.append(""); documentContents.append(" "); documentContents.append(""); documentContents.append(vo.get("html")); documentContents.append(""); WAFLogger.debug("시작~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); WAFLogger.debug(documentContents.toString()); WAFLogger.debug("끝~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); //WAFLogger.debug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); //WAFLogger.debug(documentContents); //WAFLogger.debug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); this.setContNo(vo.get("cont_no"), vo.get("cont_chasu"), vo.get("true_random"),vo.get("file_seq")); this.setUserNo(vo.get("cont_userno")); this.setHtmlWidth(750); //하도급 대금 지급 서식 작성은 footer와 header를 셋팅한다. if (vo.get("true_random").isEmpty()){ this.setFooter("본 문서는 상기업체 간에 전자서명법등 관련법령에 근거하여 전자서명으로 체결한 전자문서입니다."); this.setHeader(" "); } boolean result = this.generatePDF(documentContents.toString(), pdfDir+fileDir, fileName); if(!result){ return null; } WAFLogger.debug("Exception PDFMAKER : "); pdf = new ValueObject(); pdf.set("file_path", fileDir); pdf.set("file_name", fileName); pdf.set("file_size", new File(path).length()); pdf.set("file_ext", "pdf"); pdf.set("file_hash", getHash(pdfDir+fileDir+fileName)); return pdf; }catch(Exception e){ WAFLogger.error("Exception PDFMAKER : " + e.getMessage()); return null; } } /** * PDF 문서 생성 * @param html * @param outputDir * @param outputFileName * @return */ public boolean generatePDF(String html, String outputDir, String outputFileName) { FileOutputStream fos = null; try{ WAFLogger.debug(outputDir+outputFileName); File outputDirFile = new File(outputDir); if(outputDirFile.exists() == false) outputDirFile.mkdirs(); fos = new FileOutputStream(new File(outputDir+outputFileName)); PD4ML pd4ml = new PD4ML(); PD4PageMark headerMark = new PD4PageMark(); headerMark.setAreaHeight( 30 ); //header 영역 설정 //header 데이터 셋팅 if(header == null){ if(!this.getUserContNo().equals("")) headerMark.setHtmlTemplate("
* 계약번호: "+this.getUserContNo()+"
"); else headerMark.setHtmlTemplate(""); }else{ headerMark.setHtmlTemplate(header); } pd4ml.setPageHeader(headerMark); //footer 영역설정 PD4PageMark footerMark = new PD4PageMark(); footerMark.setAreaHeight( 40 ); //footer 데이터 셋팅 if(footer == null){ footerMark.setHtmlTemplate("
"+footerDefault+ " (관리번호:"+this.getContNo()+")
"); }else{ footerMark.setHtmlTemplate(""+ getFooter() +""); } pd4ml.setPageFooter(footerMark); pd4ml.setPageInsets(new Insets(10,20,5,20)); //여백설정 pd4ml.setHtmlWidth(getHtmlWidth()); //변환할 html의 width 정보 pd4ml.setPageSize(PD4Constants.A4); //용지모양 A4설정 //pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4)); //가로로 설정 pd4ml.useTTF("java:fonts", true); //지정한 폰트 사용 pd4ml.setDefaultTTFs("Nanum Gothic", "Times New Roman", "Arial"); //default 폰트 설정 pd4ml.enableDebugInfo(); pd4ml.render(new StringReader(html), fos); return true; }catch(Exception e){ e.printStackTrace(); WAFLogger.error("Exception PDF : " + e.getMessage()); return false; }finally{ if(fos != null) try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * Hash 정보 가져오기 * @param sOtherFullDir * @return * @throws ConfigurationException * @throws ConfigurationException * @throws IOException */ public String getHash(String sOtherFullDir) { FileInputStream fis = null; String sHash = ""; try { /* String sBaseDir = WAFConfig.get("waf.repository.path")+"/cont"; if(sBaseDir.lastIndexOf("/") == sBaseDir.length() - 1) { sBaseDir = sBaseDir.substring(0,sBaseDir.length()-1); } if(sOtherFullDir.indexOf("/") == 0) { sOtherFullDir = sOtherFullDir.substring(1); } String sFullFilePath = sBaseDir + "/" + sOtherFullDir; */ String sFullFilePath = sOtherFullDir; //sFullFilePath = StrUtil.replace(sFullFilePath,"\\",File.separator); //sFullFilePath = StrUtil.replace(sFullFilePath,"/",File.separator); WAFLogger.debug("getHash : " + sFullFilePath); fis = new FileInputStream(new File(sFullFilePath)); int iFileLen = fis.available(); byte[] b = new byte[iFileLen]; int iRet = fis.read(b); Hash hash = new Hash(); iRet = hash.GetHash(b, b.length); if(iRet == 0) { sHash = new String(hash.contentbuf); }else { sHash = ""; } } catch (FileNotFoundException e) { WAFLogger.error("[ERROR "+this.getClass().getName() + ".getHash()] :" + e.toString()); //throw new FileNotFoundException("[ERROR "+this.getClass().getName()+".getHash()] " + e.toString()); } catch (IOException e) { WAFLogger.error("[ERROR "+this.getClass().getName() + ".getHash()] :" + e.toString()); //throw new IOException("[ERROR "+this.getClass().getName()+".getHash()] " + e.toString()); } finally { try { if(fis != null) fis.close(); } catch (IOException e) { WAFLogger.error("[ERROR "+this.getClass().getName() + ".getHash()] :" + e.toString()); //throw new IOException("[ERROR "+this.getClass().getName()+".getHash()] " + e.toString()); } } return sHash; } }