1. PDFBox中字符字体真实高度获取
TextPosition.getFontSizeInPt()
textPosition.getFontSize
这两个函数都不能获取到当前字体的真实的大小,通常用这两个函数只能返回默认的值 或者每个字符的大小
可用以下方法获取到逐个字符的字体大小
// An highlighted block
//获取真实字体的大小
def getActualFontSize(textPosition: TextPosition, pdGraphicsState: PDGraphicsState): Float = {
val fontSizeInPt: Float = textPosition.getFontSizeInPt
try {
Math.min(Math.abs(pdGraphicsState.getCurrentTransformationMatrix.getScaleX * fontSizeInPt), Math.abs(pdGraphicsState.getCurrentTransformationMatrix.getScaleY * fontSizeInPt))
}
catch {
case e: Exception =>
fontSizeInPt
}
}
同理可以拿到不同字体的高度
// An highlighted block
//字体的真实的高度
val fheight: Float = (text.getFont.getFontDescriptor.getCapHeight * 1.0f / 1000) * fs
2.PDFTextStripper 获取到的坐标与 PDPageContentStream 绘图不一至的问题
利用TextPosition的 text.getXDirAdj()和text.getYDirAdj()作为内容流中的x和y坐标。这是行不通的,因为PDFBox在文本提取过程中使用的坐标被转换为他们更喜欢的用于文本提取的坐标系
利用text.X text.Y 同样无法与 PDPageContentStream对齐,一定需要坐标的转换,才能与绘图体系对齐
这里需要做坐标转换用到如下两个函数
// An highlighted block
text.getTextMatrix().getTranslatex()
text.getTextMatrix().getTranslateY()
由于PDFBox将坐标矩阵乘以一个平移,使裁剪框的左下角成为原点。所以即使是坐标做了转换也可能需要更正,这里就用到了PDRectanger cropBox 类
// An highlighted block
text.getTextMatrix().getTranslatex() + cropBox.getLowerLeftX()
text.getTextMatrix().getTranslateY() + cropBox.getLowerLeftY()
因此,如果PDRectanger cropBox是当前页面的裁剪框,则使用
3.绘图后的效果如下
图片: