我正在使用最新的PDFBOX库提取文本,为此,我编写了自定义PDFStreamEngine(显示了部分代码,但其余部分应该相似):
book_id | book_name | book_author
=====================================================
1 | NoSQL Distilled | Pramod J. Sadalage
-----------------------------------------------------
1 | NoSQL Distilled | Martin Fowler
-----------------------------------------------------
2 | Building Microservices | Sam Newman
但是,我遇到3个问题: 第一个:“ Tf”运算符-PDF / F1中1 Tf:当我显示fontName和大小时,它显示:EVMANJ + MyriadPro-Regular,大小1;但是,插图画家和Adobe Acrobat上的实际字体名称为:Myriad Pro,大小为8磅
第三个问题:如何正确对待TJ运营商?
P.S:我可以私下提供pdf。
答案 0 :(得分:1)
这个问题的答案不是直接的,我不得不扩展showFontGlyph
protected void showFontGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, Vector displacement) throws IOException {
..do you logic here}
为了找到旋转位置,我不得不将代码从PDFBox 1.8复制粘贴到我的类中
/**
* Return the direction/orientation of the string in this object based on
* its text matrix.
*
* @return The direction of the text (0, 90, 180, or 270)
*/
public int getDir() {
int direction = -1;
if (direction < 0) {
float a = getTextMatrix().getScaleY();
float b = getTextMatrix().getShearY();
float c = getTextMatrix().getShearX();
float d = getTextMatrix().getScaleX();
// 12 0 left to right
// 0 12
if (a > 0 && Math.abs(b) < d && Math.abs(c) < a && d > 0) {
direction = 0;
}
// -12 0 right to left (upside down)
// 0 -12
else if (a < 0 && Math.abs(b) < Math.abs(d) && Math.abs(c) < Math.abs(a) && d < 0) {
direction = 180;
}
// 0 12 up
// -12 0
else if (Math.abs(a) < Math.abs(c) && b > 0 && c < 0 && Math.abs(d) < b) {
direction = 90;
}
// 0 -12 down
// 12 0
else if (Math.abs(a) < c && b < 0 && c > 0 && Math.abs(d) < Math.abs(b)) {
direction = 270;
} else {
direction = 0;
}
}
return direction;
}
当我在处理流时检测到TJ运算符时,就会调用getDir函数。