使用PDFBox将文本写入多边形

时间:2011-11-14 23:02:18

标签: pdf pdfbox

我发现了如何使用drawText将文本写入页面,并且多边形出现在drawPolygon的正确位置。

问题在于,当我只是绘制文本时,它会起作用,但是一旦绘制多边形,就不会再绘制文本。

如果我创建两个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();
   }

}

感谢您的帮助

2 个答案:

答案 0 :(得分: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();
    

答案 1 :(得分:0)

我认为绘制Rect和文本时setNonStrokingColor是相同的。因此Rect将隐藏文本。解决方案是使用不同的Rect和文本值调用setNonStrokingColor。然后你应该能够看到它们。