2011-11-14 16 views
0

drawTextを使ってページにテキストを書き込む方法を見つけたので、drawPolygonを使って適切な場所にポリゴンが表示されます。PDFBoxでテキストをploygonに書き込む

問題は、テキストを描画すると機能しますが、ポリゴンを描画するとすぐにテキストが描画されなくなるという問題があります。

2つの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

私はあなたがのRectやテキストを描画するときsetNonStrokingColorは同じだと思います。したがって、Rectはテキストを非表示にします。解決策は、setNonStrokingColorをRectとテキストの値を変えて呼び出すことです。それで両方を見ることができるはずです。

関連する問題