2015-02-04 7 views
-2

우리는 우리의 응용 프로그램에서 PDF 생성 작업을 위해 itextpdf 및 xmlworker API (itextpdf-5.1.1.jar, Xmlworker-1.1.0.jar)를 사용합니다. XML-XSLT 변환에서 HTML 컨텐트를 생성 한 다음 HTML 컨텐트를 사용하여 pdf 문서를 만듭니다.ItextPdf에서 페이지 매김

페이지 매김을 구현할 때 (1/3, 2/3 등), 우리는 itextpdf 온라인 샘플을 통해 우리가 생성 한 PDF 문서와는 별도로 생성 된 PDF 문서를 생성해야한다는 것을 배웠습니다 각 페이지 내용에 페이지 번호를 찍으십시오.

이 접근법은 중간 PDF 문서를 제거하는 데 어려움을 낳습니다. pdf 문서를 하나 생성하는 것을 피할 수 있도록 pdf를 처음 만들 때 페이지 번호를 결정할 수있는 방법이 있습니까?

감사 벤 카트

class TableFooter extends PdfPageEventHelper {   
     String header;   
     PdfTemplate total; 

     public void setHeader(String header) {    
      this.header = header; 
     } 

     public void onOpenDocument(PdfWriter writer, Document document) { 
      total = writer.getDirectContent().createTemplate(30, 16); 

     } 

     public void onEndPage(PdfWriter writer, Document document) { 
      Font ffont = new Font(Font.FontFamily.UNDEFINED, 7, Font.NORMAL); 
      PdfPTable table = new PdfPTable(2); 
      try 
      { 
       table.setWidths(new int[]{1,1}); 
       table.setTotalWidth(50); 
       table.getDefaultCell().setFixedHeight(15); 
       table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); 
       Phrase footer = new Phrase(String.format("%d of", writer.getPageNumber()), ffont); 
       table.addCell(footer);     
       PdfPCell cell = new PdfPCell(Image.getInstance(total)); 
       table.addCell(cell); 
       table.writeSelectedRows(0, -1, 275, 20, writer.getDirectContent()); 
      } 
      catch(Exception de) { 
       throw new ExceptionConverter(de); 
      } 
     } 

     public void onCloseDocument(PdfWriter writer, Document document) {    
     ColumnText.showTextAligned(total, Element.ALIGN_LEFT, new Phrase(String.valueOf(writer.getPageNumber() - 1)), 10, 4, 0); 
     } 
    } 

답변

1

무료 전자 책 The Best iText Questions on StackOverflow을 다운로드 "페이지 이벤트"장에 나와있는 질문을 읽어 보시기 바랍니다. 다음은이 책 선정 된 몇 가지 질문은 다음과 같습니다

또한 공식에 keywords page 볼 수 있습니다 iText 사이트,보다 구체적으로는 핵심 단어 Page X of Y.

귀하의 질문에 중간 문서 작성을 참조하십시오. 이것이 바로 TwoPasses 예제입니다. Page X of Y을 한 번에 추가하는 방법을 묻습니다. 그것이 바로 예문 인 MovieCountries1입니다.

class PageXofYHeader extends PdfPageEventHelper { 
    /** The template with the total number of pages. */ 
    PdfTemplate total; 

    /** 
    * Creates the PdfTemplate that will hold the total number of pages. 
    * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(
    *  com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document) 
    */ 
    public void onOpenDocument(PdfWriter writer, Document document) { 
     total = writer.getDirectContent().createTemplate(30, 16); 
    } 

    /** 
    * Adds a header to every page 
    * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
    *  com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document) 
    */ 
    public void onEndPage(PdfWriter writer, Document document) { 
     PdfPTable table = new PdfPTable(2); 
     try { 
      table.setWidths(new int[]{48, 2}); 
      table.setTotalWidth(527); 
      table.setLockedWidth(true); 
      table.getDefaultCell().setFixedHeight(20); 
      table.getDefaultCell().setBorder(Rectangle.BOTTOM); 
      table.getDefaultCell() 
       .setHorizontalAlignment(Element.ALIGN_RIGHT); 
      table.addCell(
       String.format("Page %d of", writer.getPageNumber())); 
      PdfPCell cell = new PdfPCell(Image.getInstance(total)); 
      cell.setBorder(Rectangle.BOTTOM); 
      table.addCell(cell); 
      table.writeSelectedRows(0, -1, 34, 803, 
       writer.getDirectContent()); 
     } 
     catch(DocumentException de) { 
      throw new ExceptionConverter(de); 
     } 
    } 

    /** 
    * Fills out the total number of pages before the document is closed. 
    * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(
    *  com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document) 
    */ 
    public void onCloseDocument(PdfWriter writer, Document document) { 
     ColumnText.showTextAligned(total, Element.ALIGN_LEFT, 
       new Phrase(String.valueOf(writer.getPageNumber() - 1)), 
       2, 2, 0); 
    } 
} 

당신이 볼 수 있듯이

, 우리는 onOpenDocument() 방법 total라는 작은 장소 홀더를 만들 수 있습니다. 우리는 총 페이지 수를 미리 알지 못하므로이 페이지의 총계가 일지 모른 채 각 페이지에이 자리 표시자를 추가합니다. 문서를 닫을 때 최종 페이지 수만 알 수 있습니다. 그 때문에 onCloseDocument() 메서드가 트리거되어 자리 표시 자에 내용을 추가 할 때까지 기다리는 이유입니다.

+0

페이지 패스워드 X의 달성에 대한 자세한 설명은 Bruno Lowagie에게 감사합니다. 우리는 XML-XSLT-HTMLContent 접근 방식으로 PDF 문서를 생성하므로 MovieCountries1과 비슷한 방식으로 시도한 샘플 프로그램은 헤더에 Page X of Y를 만들었습니다. Page X of Y를 바닥 글 영역에 배치 할 샘플이 있습니까? 나를 견본으로 안내해 주시겠습니까? – VenkatRam

+0

추가 샘플이 필요 없습니다. 추가 콘텐츠를 추가 할 때 좌표 만 변경하십시오. 803을 20과 같은 것으로 바꾸십시오 (바닥 글의 위치를 ​​결정하는 것은 귀하에게 달려 있습니다). –

+0

감사합니다. Bruno Lowagie. 샘플에서 좌표를 변경하려고 시도했지만 페이지의 총 개수 (Y)를 X에 더 가깝게 가져 오는 데 도움이되지 않았습니다. – VenkatRam