2013-02-05 1 views
3

일부 필드는 정적이고 다른 필드는 동적 인 문서 템플릿이 있습니다. 일부 데이터 (이름, 성, 급여)를 대체하고 새 파일을 생성해야합니다. 이 작업을 수행하기 위해 어떤 라이브러리를 권장합니까? 관심 장소가 적절한가요? 저는 Spring, Java EE6 및 Oracle과 협력하고 있습니다.Java로 템플릿 또는 기존 문서에서 Word 문서를 만드는 방법은 무엇입니까?

+0

이 질문을보십시오. http://stackoverflow.com/questions/10005678/learning-apache-poi –

답변

3

아파치 POI를 사용해 볼 수도 있지만 POI의 HWPF와 XWPF 부분은 단어 파일을 조작하는 데 정말로 복잡합니다. 단어 파일이 어떻게 구성되어 있는지 잘 이해하고 있어야합니다. 이 iText 및 PDF

를 사용

솔루션 나는 PDF와 비슷한

1) 당신은 Acrobat의 (같은 문서에 필드를 만들 LibreOffice와 사용할 수 있습니다 (이것은 당신을위한 옵션이 될 수 있음) 않았다

  • 는 .ODT 파일과 스타일 그것을
  • 만들기 또는 MS Word 또는 리브레 오피스 라이터를 사용하여 귀하의 템플릿으로 변환) 프로
  • > Toolsbars - -
  • 그런 다음보기로 이동> 양식 디자인을 지금
  • 을 (이 필드의 속성을 엽니 다 더블 클릭) 당신은 당신의 파일에 필드를 추가 할 수 있습니다
  • "온/오프 디자인 모드"로 설정 완료 : - :

    public byte[] getDocumentAsByteArray(Object dataBean, String pdfTemplateName) throws KkmsException { 
    
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
        PdfStamper stamp = null; 
        InputStream templateInputStream = null; 
    
        Locale local = new Locale(language); 
    
        try { 
         templateInputStream = // get the file input stream of the pdf 
         PdfReader reader = new PdfReader(templateInputStream); 
    
         // Create a stamper that will copy the document to a new file 
         stamp = new PdfStamper(reader, outputStream); 
    
         AcroFields form = stamp.getAcroFields(); 
    
         // form fields are normal text in the end 
         stamp.setFormFlattening(true); 
         Map<String, AcroFields.Item> map = (Map<String, AcroFields.Item>)form.getFields(); 
         if (map != null) { 
          if (map.size() == 0) { 
           logger.debug("There are no fields in this PDF layout"); 
          } 
          for (Entry<String, AcroFields.Item> e : map.entrySet()) { 
           logger.debug("PDF fieldname = " + e.getKey()); 
    
           // at the moment we only handle text fields 
           if (AcroFields.FIELD_TYPE_TEXT == form.getFieldType(e.getKey())) { 
            fillForm(dataBean, form, e.getKey(), local); 
           } else { 
            logger.warn("Field type is not supported: "+form.getFieldType(e.getKey())); 
           } 
          } 
         } 
    
         stamp.close(); 
        } catch (Exception e) { 
         logger.warn("Failed to create PDF document", e); 
         throw new KkmsException("Failed to create PDF document: "+e.getMessage()); 
        } finally { 
         if (templateInputStream != null) { 
          try { 
           templateInputStream.close(); 
          } catch (IOException e) { 
           throw new KkmsException("Failed to close InputStream of PDF document", e); 
          } 
         } 
        } 
        return outputStream.toByteArray(); 
    } 
    
    "파일> 내보내기 PDF로"

2) 이제 다음 생성 된 필드

채우기 위해 iText를 사용할 수 있습니다 그냥 예제 코드입니다

결국 당신은 PDF를 얻습니다 -> 이것이 당신을 적어도 조금 도와 줄 수 있기를 바랍니다!

또 다른 신속하고 더러운 솔루션

ODT의 전원 또는 DOCX 사용할 수 있을까 - 그래서 압축을 해제> - -> 당신은 것입니다> 당신의 DOCX하는 문서 또는 ODT로 변환 ->의 단지 zip 파일을 우편의 루트에하고 content.xml 파일을 참조 ->이 에있는 모든 문서 내용은 이제 나중에 프로그램에 의해 대체 될 수있는 마법의 태그 (예 : $$$) 여기에 추가 할 수있다

<text:p text:style-name="P3">SAP Customer Number:</text:p> 

<text:p text:style-name="P3">SAP Customer Number: $$$sapCustomerNumber$$$</text:p> 

이제 odt/docx 파일을 압축 해제하는 프로그램을 작성하십시오 -> 태그를 바꿉니다 -> 파일을 다시 압축합니다

2

These slides은 OSDC 2012에서 발표 한 프리젠 테이션에서 몇 가지 주요 접근법에 대해 설명합니다.

요즘은 "XHTML로 원하는 것을 생성 한 다음 docx로 내 보냅니다."라고 덧붙였다. CSS @class 값을 Word 스타일로 변환하는 기능을 지원하는 docx4j-ImportXHTML을 도입 한 이후로 우리는이 접근 방식을 점점 더 많이 보았습니다.

관련 문제