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 
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?