How to fit a text to a position by PDFBox

47 Views Asked by At

I'm using PDFBox 3.0.0-RC1. I want to insert some transparent text to fit the fixed position of pdf page. Here is my source code:

// Insert image
PDImageXObject pdImage = JPEGFactory.createFromImage(document, image, 0.9f);
contentStream.drawImage(pdImage, 0, 0);

// set transparent text
PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState();
graphicsState.setNonStrokingAlphaConstant(0f);
contentStream.setGraphicsStateParameters(graphicsState);

// x1, x2, y1, y2 is position of text which I want to insert
// calculate font size base on field height and font family
float fontSizeByHeight = Math.abs(y2 - y1) * 1000 / font.getFontDescriptor().getCapHeight();

// calculate font size base on field width and font family
float fontSizeByWidth = Math.abs(x2 - x1) * 1000 / font.getStringWidth(field.getFieldResult();

float fontSize = Math.min(fontSizeByHeight, fontSizeByWidth);
contentStream.setFont(font, fontSize);
contentStream.beginText();
contentStream.newLineAtOffset(x1, y1);
contentStream.showText(field.getFieldResult());
contentStream.endText();

x1,x2,y1,y2 is position of the text in image. field.getFieldResult() is text in image (we insert transparent text into an image then user can copy/search text). However, when field.getFieldResult() width is < width of position, user experience is not good Image
So I need to improve user experience when copying. However, I can't use character spacing because I want to keep searchable.

I tried to append space at the end of text if text width < width of position. However, Spaces are auto removed by Chrome/Adobe reader.

int avaliableWidth = Math.abs(x2 - x1);
float fieldResultWidthBaseOnFontSize = (fieldResultByFont / 1000.0f) * (1.0f * fontSize);
float spaceWidthBaseOnFontSize = (font.getStringWidth(" ")/ 1000.0f) * (1.0f * fontSize);
if (avaliableWidth > fieldResultWidthBaseOnFontSize) {
    int numberOfSpaceInserted = (int) ((avaliableWidth - fieldResultWidthBaseOnFontSize) / spaceWidthBaseOnFontSize);
    field.setFieldResult(StringUtils.rightPad(field.getFieldResult(), numberOfSpaceInserted));
  }

How can I fit it?

0

There are 0 best solutions below