【发布时间】:2019-05-31 03:20:55
【问题描述】:
我正在尝试从 TextPosition 绘制相应的字形边界框,如 PDF 32000 文档中所示。
这是我的函数,它执行从字形空间到用户空间
的计算@Override
protected void processTextPosition(TextPosition text) {
PDFont font = pos.getFont();
BoundingBox bbox = font.getBoundingBox();
Rectangle2D.Float rect = new Rectangle2D.Float(bbox.getLowerLeftX(), bbox.getUpperRightY(),
bbox.getWidth(), bbox.getHeight());
AffineTransform at = pos.getTextMatrix().createAffineTransform();
if (font instanceof PDType3Font) {
at.concatenate(font.getFontMatrix().createAffineTransform());
} else {
at.scale(1 / 1000f, 1 / 1000f);
}
Shape shape = at.createTransformedShape(rect);
rectangles.add(fillBBox(text));
super.processTextPosition(text);
}
这是绘制提取矩形的函数:
private void drawBoundingBoxes() throws IOException {
String fileNameOut = path.substring(0, path.lastIndexOf(".")) + "_OUT.pdf";
log.info("Drawing Bounding Boxes for TextPositions");
PDPageContentStream contentStream = new PDPageContentStream(document,
document.getPage(document.getNumberOfPages()-1),
PDPageContentStream.AppendMode.APPEND, false , true );
contentStream.setLineWidth(1f);
contentStream.setStrokingColor(Color.RED);
try{
for (Shape p : rectangles) {
p = all.get(0);
double[] coords = new double[6];
GeneralPath g = new GeneralPath(p.getBounds2D());
for (PathIterator pi = g.getPathIterator(null);
!pi.isDone();
pi.next()) {
System.out.println(Arrays.toString(coords));
switch (pi.currentSegment(coords)) {
case PathIterator.SEG_MOVETO:
System.out.println("move to");
contentStream.moveTo ((float)coords[0], (float) coords[1]);
break;
case PathIterator.SEG_LINETO:
System.out.println("line to");
contentStream.lineTo ((float)coords[0], (float) coords[1]);
break;
case PathIterator.SEG_CUBICTO:
System.out.println("cubc to");
contentStream.curveTo((float)coords[0], (float) coords[1],
(float)coords[2], (float) coords[3],
(float)coords[4],(float) coords[5]);
break;
case PathIterator.SEG_CLOSE:
System.out.println("close");
contentStream.closeAndStroke();
break;
default:
System.out.println("no shatt");
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
contentStream.close();
document.save(new File(fileNameOut));
}
}
然后,当我尝试在 pdf 上绘图时,第一个字母(大写 V)得到以下结果
我不知道我做错了什么。有什么想法吗?
【问题讨论】:
-
看看 DrawPrintTextLocations 示例,看看青色部分,它有真正的边界框(大部分时间)
-
@TilmanHausherr 我在某些情况下边界框有一些问题,有位移。我打印了为两个文件提取的边界框如果你可以看一下:drive.google.com/open?id=1aQ6TyGVAybmlNvapCodY0Rp7IRpYm5_7 我不知道为什么它发生在某些地方而不是其他地方。提前感谢
-
这没有多大帮助,这似乎是一个截图的PDF。目前尚不清楚这是来自一个 PDF 页面还是来自多个:在“Lavande”PDF 中,右侧有位移,但左侧没有。我必须得到原始的PDF。如果这是来自几页,那么我怀疑它与cropbox有关。如果它来自一个 PDF 页面,那么我怀疑这是在错误位置隐藏文本的文本图像。
-
@TilmanHausherr 我在同一个文件夹中添加了原始文件。
-
@TilmanHausherr 你完全正确!我错误地应用了 textMatrix 的翻译,导致了这种效果!
标签: java pdf pdf-generation pdfbox