2011-11-14 28 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(); 
    } 

} 

謝謝您的幫助

+0

您似乎沒有關閉'rectContent'。 – mkl

回答

1
  1. 您的主要問題是,你永遠不會調用rectContent.close()
  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會隱藏文字。解決方法是使用Rect和文本的不同值調用setNonStrokingColor。那麼你應該可以看到他們兩個。