0

我发现了如何使用 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();
   }

}

谢谢您的帮助

4

2 回答 2

1
  1. 你的主要问题是你从不打电话rectContent.close()
  2. 看起来rectContent并且content实际上是指向同一个“流”的指针,重新编写代码以解决 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();
    
于 2011-11-17T17:03:01.637 回答
0

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

于 2014-10-25T07:05:53.147 回答