написать текст в ploygon с PDFBox - PullRequest
0 голосов
/ 15 ноября 2011

Я узнал, как писать текст на странице с помощью 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 ]

1 голос
/ 17 ноября 2011
  1. ваша главная проблема в том, что вы никогда не звоните rectContent.close().
  2. . Похоже, что rectContent и content на самом деле являются указателями на один и тот же "поток", и этосмысл переработать код, чтобы понять, как на самом деле работает PDFBox.Это будет означать (а) удаление 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 голосов
/ 25 октября 2014

Я думаю, setNonStrokingColor то же самое, когда вы рисуете Rect и текст. Таким образом, Rect будет скрывать текст. Решение состоит в том, чтобы вызвать setNonStrokingColor с различными значениями для Rect и текста. Тогда вы сможете увидеть их обоих.

...