我发现了如何使用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();
}
}
感谢您的帮助
答案 0 :(得分:1)
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();
答案 1 :(得分:0)
我认为绘制Rect和文本时setNonStrokingColor
是相同的。因此Rect将隐藏文本。解决方案是使用不同的Rect和文本值调用setNonStrokingColor
。然后你应该能够看到它们。