2011-11-14 2 views
0

drawText로 페이지에 텍스트를 쓰는 방법을 알았습니다. drawPolygon을 사용하여 올바른 위치에 다각형이 나타납니다.PDFBox를 사용하여 ploygon에 텍스트 쓰기

문제는 단지 텍스트를 그릴 때 작동하지만, 다각형을 그리면 텍스트가 더 이상 그려지지 않는다는 것입니다.

두 개의 PDPageContentStream 객체 (하나는 텍스트 용이고 다른 하나는 폴리곤 용)를 만들면 다각형이 더 이상 그려지지 않습니다.

다음은 테스트 클래스입니다. 모든 PDF는 테스트를 위해해야합니다.

package ch.sertal.vision.server.helpers; 

import ch.sertal.vision.BaseDaoTest; 
import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 
import org.testng.annotations.Test; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.URISyntaxException; 

/** 
* Created by IntelliJ IDEA. 
* User: micha.roon 
* Date: 11/13/11 
* Time: 11:22 PM 
* To change this template use File | Settings | File Templates. 
*/ 
public class WritePDFTest extends BaseDaoTest { 

    @Test 
    public void testTextPlacement() throws IOException, COSVisitorException, URISyntaxException { 
     File pdfFile = new File(this.getClass().getResource("/META-INF/menge-regierapport.pdf").toURI()); 
     PDDocument doc = PDDocument.load(pdfFile); 
     PDPage page = null; 
     for (Object kid : doc.getDocumentCatalog().getPages().getKids()) { 
     if (kid instanceof PDPage) { 
      page = (PDPage) kid; 
      break; 
     } 
     } 
     PDPageContentStream rectContent = new PDPageContentStream(doc, page, true, false); 
     rectContent.setNonStrokingColor(Color.blue); 

     PDPageContentStream content = new PDPageContentStream(doc, page, true, false); 

     writeOnPage(content, String.valueOf(page.getArtBox().getHeight()), 0, 0); 
     writeOnPage(content, String.valueOf(page.getArtBox().getWidth()), 200, 100); 
     rectContent.fillRect(100, 200, 100, 50); 
     content.close(); 
     doc.save(new FileOutputStream(
        new File(this.getClass().getResource("/META-INF/menge-regierapport.pdf").toURI()))); 
     doc.close(); 
    } 

    void writeOnPage(PDPageContentStream content, String text, int x, int y) throws IOException { 
     content.beginText(); 
     content.setFont(PDType1Font.HELVETICA, 10); 
     content.moveTextPositionByAmount(x, y); 
     content.drawString(text); 
     content.endText(); 
    } 

} 

rectContent.close() 전화 결코 당신의 주요 문제는 당신의 도움

+0

'rectContent'를 닫지 않은 것 같습니다. – mkl

답변

1
  1. 주셔서 감사합니다.
  2. rectContentcontent은 실제로 동일한 "스트림"에 대한 포인터이며 PDFBox가 실제로 작동하는 방식을 설명하기 위해 코드를 다시 작성하는 것이 좋습니다. 이것은 (a) rectContent을 제거하고 content으로 바꾸는 것을 의미합니다.

    PDPageContentStream content = new PDPageContentStream(doc, page, true, false); 
    content.setNonStrokingColor(Color.blue); 
    
    // moving this before content, so it's written "below" (I think) 
    content.fillRect(100, 200, 100, 50); 
    
    // resetting the color to black 
    content.setNonStrokingColor(Color.black); 
    
    writeOnPage(content, String.valueOf(page.getArtBox().getHeight()), 0, 0); 
    writeOnPage(content, String.valueOf(page.getArtBox().getWidth()), 200, 100); 
    content.close(); 
    doc.save(new FileOutputStream(
         new File(this.getClass().getResource("/META-INF/menge-regierapport.pdf").toURI()))); 
    doc.close(); 
    
0

나는 당신이 사각형과 텍스트를 그릴 때 setNonStrokingColor이 같은 생각합니다. 그래서 Rect는 텍스트를 숨 깁니다. 해결 방법은 setNonStrokingColor을 Rect와 텍스트에 대해 다른 값으로 호출하는 것입니다. 그럼 당신은 그들 모두를 볼 수 있어야합니다.