2014-11-08 3 views
3

내 프로젝트에서 iText를 사용하여 PDF 문서를 생성합니다.이미지에 텍스트를 추가하는 방법은 무엇입니까?

페이지의 높이가 500pt (1 사용자 단위 = 1 포인트)이고 페이지에 텍스트를 쓰고 이미지가 뒤따라 간다고 가정합니다.

콘텐츠 및 이미지가 450pt 미만인 경우 텍스트가 이미지보다 우선합니다. 내용과 이미지가 450pt를 초과하면 텍스트가 다음 페이지로 전달됩니다.

내 질문은 : 이미지를 작성하기 전에 남아있는 사용 가능한 공간을 어떻게 얻을 수 있습니까?

답변

3

첫 번째 사항 : 텍스트 및 이미지를 페이지에 추가 할 때 iText가 텍스트 콘텐츠 및 이미지의 순서를 변경하는 경우가 있습니다. 당신은을 사용하여이 문제를 피할 수 있습니다 : 당신은 "커서"의 현재 위치를 알고 싶다면

writer.setStrictImageSequence(true); 

, 당신은 방법 getVerticalPosition()를 사용할 수 있습니다. 불행히도,이 방법은 매우 우아하지 않습니다. 새 라인을 추가하거나 (true 인 경우) 부울 매개 변수가 필요합니다 (현재인 경우).

나는 왜 당신이 수직 위치를 얻길 원하나요. 캡션 뒤에 이미지가 있고 캡션과 이미지를 같은 페이지에 넣기를 원하기 때문입니까?

이 경우 텍스트와 이미지를 표 셀 안에 넣고 iText가 행을 분할하지 않도록 지시 할 수 있습니다. 이 경우 iText는 내용이 현재 페이지에 맞지 않으면 텍스트와 이미지를 올바른 순서로 다음 페이지로 전달합니다.

업데이트 : 코멘트에 추가 된 추가 정보를 바탕으로

, 그것은 영업 이익은 워터 마크 된 이미지를 추가하고 싶어 지금은 분명하다.

실제 요구 사항에 따라이를 달성하기위한 두 가지 방법이 있습니다.

접근법 1 : 첫 번째 방법은 WatermarkedImages1 예에서 설명

. 이 예에서는 PdfTemplate을 만들고 여기에 이미지를 추가하고 해당 이미지 위에 작성된 일부 텍스트를 추가합니다. 그런 다음이 PdfTemplate을 이미지 안에 넣고 document.add() 문을 사용하여 해당 이미지를 워터 마크와 함께 추가 할 수 있습니다. 당신이 볼 수 있듯이

PdfContentByte cb = writer.getDirectContentUnder(); 
document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE1), "Bruno")); 
document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE2), "Dog")); 
document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE3), "Fox")); 
Image img = Image.getInstance(IMAGE4); 
img.scaleToFit(400, 700); 
document.add(getWatermarkedImage(cb, img, "Bruno and Ingeborg")); 

, 우리는 하나 개 매우 큰 이미지를 가지고 (사진 :

public Image getWatermarkedImage(PdfContentByte cb, Image img, String watermark) throws DocumentException { 
    float width = img.getScaledWidth(); 
    float height = img.getScaledHeight(); 
    PdfTemplate template = cb.createTemplate(width, height); 
    template.addImage(img, width, 0, 0, height, 0, 0); 
    ColumnText.showTextAligned(template, Element.ALIGN_CENTER, 
      new Phrase(watermark, FONT), width/2, height/2, 30); 
    return Image.getInstance(template); 
} 

이 우리가 이미지를 추가하는 방법입니다 :

모든 마법을 수행하는 방법 내 아내와 나). 이 이미지가 페이지에 맞도록 크기를 조정해야합니다. 이것을 피하려면 두 번째 접근법을 살펴보십시오.

접근법 2 : 두 번째 방법은 WatermarkedImages2 예에서 설명

. 이 경우 각 이미지를 PdfPCell에 추가합니다. 이 PdfPCell은 페이지 너비에 맞게 이미지의 크기를 조정합니다. 모든 이미지는 더 많거나 적은 같은 크기가있는 경우이 방법을 사용합니다

PdfPCell cell; 
cell = new PdfPCell(Image.getInstance(IMAGE1), true); 
cell.setCellEvent(new WatermarkedCell("Bruno")); 
table.addCell(cell); 
cell = new PdfPCell(Image.getInstance(IMAGE2), true); 
cell.setCellEvent(new WatermarkedCell("Dog")); 
table.addCell(cell); 
cell = new PdfPCell(Image.getInstance(IMAGE3), true); 
cell.setCellEvent(new WatermarkedCell("Fox")); 
table.addCell(cell); 
cell = new PdfPCell(Image.getInstance(IMAGE4), true); 
cell.setCellEvent(new WatermarkedCell("Bruno and Ingeborg")); 
table.addCell(cell); 

:

class WatermarkedCell implements PdfPCellEvent { 
    String watermark; 

    public WatermarkedCell(String watermark) { 
     this.watermark = watermark; 
    } 

    public void cellLayout(PdfPCell cell, Rectangle position, 
     PdfContentByte[] canvases) { 
     PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS]; 
     ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER, 
      new Phrase(watermark, FONT), 
      (position.getLeft() + position.getRight())/2, 
      (position.getBottom() + position.getTop())/2, 30); 
    } 
} 

이 세포 이벤트는 다음과 같이 사용할 수 있습니다 워터 마크를 추가하려면, 우리는 세포 이벤트를 사용 페이지에 이미지를 맞추는 것에 대해 걱정하지 않으려는 경우

고려 :

은 물론, 두 가지 접근 방식으로 인해 만들어지는 디자인 선택의 다른 결과가있다. 결과를 PDF와 비교하여 차이를 확인하십시오 : watermark_template.pdfwatermark_table.pdf

+0

, 이미지에 워터 마크 텍스트를 추가하려고하면 이미지가 첫 번째 페이지를 차지하고 텍스트는 두 번째 페이지로 이동합니다. 내용이 더 많은 공간을 차지하는 경우에만 발생합니다. 문제가 발생하지 않습니다.이 문제를 해결하려면 어떻게합니까? 이미지에 워터 마크 텍스트를 배치 할 때 세로 배치 방법을 사용합니다. – Madhesh

+0

이미지 컨텍스트에서 워터 마크 텍스트 란 무엇입니까? 올바른 단어를 사용하고 있습니까? 이해하기 쉽도록 전체 질문을 다시 작성해야했습니다. 이제 "워터 마크 텍스트를 이미지에"개념을 소개하는 반면 원래 질문은 "이미지 캡션"에 대해 이야기하는 것처럼 더 많이 들립니다. 명확히하십시오! –

+0

또한 : "이미지에 워터 마크 텍스트를 놓을 때 수직 위치 방법을 사용합니다"라고 말하면 혼란 스럽습니다. 수직 위치를 얻는 getVerticalPosition() 메소드가있다. 텍스트를 추가하는 수직 위치 방법은 없습니다. 명확하게하지 않으면 (예 : 코드 샘플 사용) 질문을 downvote해야합니다. –

관련 문제