Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PDFBox将文本写入多边形_Pdf_Pdfbox - Fatal编程技术网

使用PDFBox将文本写入多边形

使用PDFBox将文本写入多边形,pdf,pdfbox,Pdf,Pdfbox,我了解了如何使用drawText将文本写入页面,多边形将显示在drawPolygon的正确位置 问题是,当我仅仅绘制文本时,它就工作了,但一旦我绘制多边形,文本就不再绘制了 如果创建两个PDPageContentStream对象(一个用于文本,另一个用于多边形),则不再绘制多边形 这是我的测试课。任何PDF都应该用于测试 package ch.sertal.vision.server.helpers; import ch.sertal.vision.BaseDaoTest; impor

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

}
谢谢你的帮助

  • 您的主要问题是从未调用
    rectContent.close()
  • 似乎
    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();
    

  • 我认为在绘制矩形和文本时,
    setNonSrokingColor
    是相同的。因此,Rect将隐藏文本。解决方案是使用Rect和text的不同值调用
    setNonSrokingColor
    。然后,您应该能够同时看到这两个选项。

    您似乎没有关闭“rectContent”。