ralfstuckert/pdfbox-layout

Underline, Strikethrough not working in pdfboxlayout2 while using content stream

Opened this issue · 3 comments

While using pdfbox pagecontentstream, the markups like underline and strikethrough is not working

try (PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, true,
true)) {
Paragraph paragraph = new Paragraph();
String str = "You can alternate the position\n and thickness of an underline, \n so you may also use this \nto {0.25:}strike through \n\n"
paragraph.drawText(contentStream, position, txtAlignment, null);
contentStream.close();
}

Try paragraph.addMarkup to add the string to the paragraph.
Where do you add the text to the paragraph?
How do you do this?

As arnthom said, first thing is to use addMarkup(). Alas, some decoration - as underline etc. - need extra handling when using the low level API. See LowLevelText.java for a complete example.

Thanks @arnthom @ralfstuckert.
What I did is, I override the drawn() method from AnnotationDrawListener to a custom class and create a DrawContext object for DrawListener. Now it is working...

Please see the code snippets
/*******************************************************************/
paragraph.addMarkup(str, fontSize, rFont, bFont, iFont, biFont);
Position position = new Position(bottomX, topY);

	DrawContext  context = new DrawContext() {
		@Override
		public PDDocument getPdDocument() {
			return document;
		}
		
		@Override
		public PDPageContentStream getCurrentPageContentStream() {
			return contentStream;
		}
		
		@Override
		public PDPage getCurrentPage() {
			return page;
		}
	};
	CustomAnnotationDrawListner listner = new CustomAnnotationDrawListner(context);
	paragraph.drawText(contentStream, position, txtAlignment, listner);
	listner.afterPage();
	contentStream.close();

/**************************************************************************/

/************CustomAnnotationDrawListner.java/

public class CustomAnnotationDrawListner extends AnnotationDrawListener {

private static final Logger LOGGER = LoggerFactory.getLogger(CustomAnnotationDrawListner.class);

private final DrawContext drawContext;
private final Iterable<AnnotationProcessor> annotationProcessors;

 public CustomAnnotationDrawListner(final DrawContext drawContext) {
	 super(drawContext);
		this.drawContext = drawContext;
		annotationProcessors = AnnotationProcessorFactory
			.createAnnotationProcessors();
	    }

public void afterPage() throws IOException {
for (AnnotationProcessor annotationProcessor : annotationProcessors) {
    try {
	annotationProcessor.afterPage(drawContext);
    } catch (IOException e) {
    	LOGGER.error("Exception in afterPage ", e);
    }
}
}

@Override
public void drawn(Object drawnObject, Position upperLeft, float width,
    float height) {
if (!(drawnObject instanceof Annotated)) {
    return;
}
for (AnnotationProcessor annotationProcessor : annotationProcessors) {
    try {
	annotationProcessor.annotatedObjectDrawn(
		(Annotated) drawnObject, drawContext, upperLeft, width,
		height);
    } catch (IOException e) {
    	LOGGER.error("Exception in drawn ", e);
    }
}
}

}

/********************************************************************************/