antihero989
antihero989

Reputation: 494

Setting a text style to underlined in PDFBox

I'm trying to add underlined text to a blank pdf page using PDFBox, but I haven't been able to find any examples online. All questions on stackoverflow point to extracting underlined text, but not creating it. Has this function not been implemented for PDFBox? Looking at the PDFBox documentation, it seems that fonts are pre-rendered as bold, italic, and regular.

For example, Times New Roman Regular is denoted as:

PDFont font = PDType1Font.TIMES_ROMAN. 

Times New Roman Bold is denoted as:

PDFont font = PDType1Font.TIMES_BOLD

Italicized is denoted as:

PDFont font = PDType1Font.TIMES_ITALIC

There seems to be no underlined option. Is there anyway to underline text, or is this not a feature?

Upvotes: 5

Views: 11776

Answers (3)

Mori Manish
Mori Manish

Reputation: 179

I use below function for underlined the string.

public class UnderlineText {
PDFont font = PDType1Font.HELVETICA_BOLD;
float fontSize = 10f;
String str = "Hello";
public static void main(String[] args) {
    new UnderlineText().generatePDF(20, 200);
}

public void generatePDF(int sX, int sY)
{
    //create pdf and its contents for one page
    PDDocument document = new PDDocument();
    File file = new File("underlinePdfbox.pdf");
    PDPage page = new PDPage();
    PDPageContentStream contentStream;

    try {
        document.addPage(page);

        //create content stream
        contentStream = new PDPageContentStream(document, page);

        //being text for our page
        contentStream.beginText();
        contentStream.setFont( font, fontSize);
        contentStream.newLineAtOffset(sX, sY);
        contentStream.showText(str);
        contentStream.endText();

        //Draw Underline
        drawLine(contentStream, str, 1, sX, sY, -2);


        //close and save document
        contentStream.close();
        document.save(file);
        document.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
}

public void drawLine(PDPageContentStream contentStream, String text, float lineWidth, float sx, float sy, float linePosition) throws IOException {
     //Calculate String width
    float stringWidth = fontSize * font.getStringWidth(str) / 1000;
    float lineEndPoint = sx + stringWidth;

    //begin to draw our line
    contentStream.setLineWidth(lineWidth);
    contentStream.moveTo(sx, sy + linePosition);
    contentStream.lineTo(lineEndPoint, sy + linePosition);
    contentStream.stroke();
}
}

drawLine is a function which i created for drawing a line for specific string. You can adjust line as per specification using position attribute.

Minus (-) value in position field create under line. you can use positive value for over-line and stroke-line.(For example -2 for underline, 10 for over-line, 2 for stroke-line for above code)

Also you can manage the width for line.

Upvotes: 3

antihero989
antihero989

Reputation: 494

I'm not sure if this is a better alternative or not, but I followed Tilman Hausherr and drew a line in comparison to my text. For instance, I have the following:

public processPDF(int xOne, int yOne, int xTwo, int yTwo)
{
    //create pdf and its contents for one page
    PDDocument document = new PDDocument();
    File file = new File("hello.pdf");
    PDPage page = new PDPage();
    PDFont font = PDType1Font.HELVETICA_BOLD;
    PDPageContentStream contentStream;

    try {
        //create content stream
        contentStream = new PDPageContentStream(document, page);

        //being to create our text for our page
        contentStream.beginText();
        contentStream.setFont( font, largeTitle);

        //position of text
        contentStream.moveTextPositionByAmount(xOne, yOne, xTwo, yTwo);
        contentStream.drawString("Hello");
        contentStream.endText();

        //begin to draw our line
        contentStream.drawLine(xOne, yOne - .5, xTwo, yYwo - .5);

        //close and save document
        document.save(file);
        document.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
}

where our parameters xOne, yOne, xTwo, and yTwo are our locations of the text. The line has us subtract .5 from yOne and yTwo to move it a pinch below our text location, ultimately setting it to look like underlined text.

There may be better ways, but this was the route I went.

Upvotes: 2

serge
serge

Reputation: 1609

Try this answer:

highlight text using pdfbox when it's location in the pdf is known

This method using PDAnnotationTextMarkup, it has four values

/**
 * The types of annotation.
 */
public static final String SUB_TYPE_HIGHLIGHT = "Highlight";
/**
 * The types of annotation.
 */
public static final String SUB_TYPE_UNDERLINE = "Underline";
/**
 * The types of annotation.
 */
public static final String SUB_TYPE_SQUIGGLY = "Squiggly";
/**
 * The types of annotation.
 */
public static final String SUB_TYPE_STRIKEOUT = "StrikeOut";

Hope it helps

Upvotes: 1

Related Questions