gpt4 book ai didi

java - PDFClown:创建 TextMarkup 会导致 TextMarkup 的框不准确

转载 作者:行者123 更新时间:2023-12-02 12:18:24 24 4
gpt4 key购买 nike

我正在与 PDFClown 合作来分析和使用 PDFDocuments。我的目标是突出显示表格中的所有数字。对于属于在一起的所有数字(例如:表格一列中的所有数字),我将创建一个带有四边形列表的 TextMarkup。首先,看起来 everythink 工作得很好:左侧的所有突出显示都属于一个 TextMarkup,右侧的所有突出显示都属于另一个 TextMarkup。

HighlightedText

但是在分析 TextMarkup 的大小时,发现它的大小比图片上看到的要大。因此,当在左侧 TextMarkup 框周围绘制一个矩形时,尽管左侧 TextMarkup 的突出显示没有与另一列相交,但该矩形仍与另一列相交。有没有办法优化TextMarkup的Box?我认为该框有一个球状结尾,因此该框与其他 TextMarkup 相交

这是创建 TextMarkup 的代码:

List<Quad> highlightQuads = new ArrayList<Quad>();
for (TextMarkup textMarkup : textMarkupsForOneAnnotation) {
Rectangle2D textBox = textMarkup.getBox();
Rectangle2D.Double rectangle = new Rectangle2D.Double(textBox.getX(), textBox.getY(), textBox.getWidth(), textBox.getHeight());
highlightQuads.add(Quad.get(rectangle));
}

if (highlightQuads.size() > 0) {

TextMarkup _textMarkup = new TextMarkup(pagesOfNewFile.get(lastFoundNewFilePage).getPage(), highlightQuads,"", MarkupTypeEnum.Highlight);
_textMarkup.setColor(DeviceRGBColor.get(Color.GREEN));
_textMarkup.setVisible(true);
allTextMarkUps.add(_textMarkup);
}

这是一个示例文件 Example

谢谢!!

最佳答案

您的代码并不是真正独立的(我无法运行它,因为它特别缺少输入数据),所以我只能做一些 PDF Clown 代码分析。不过,该代码分析确实发现了 PDF Clown 实现细节,可以解释您的观察结果。

PDF Clown如何计算标记注释的尺寸?

标记注释矩形必须足够大,以包含所有四边形以及开始和结束装饰(标记矩形上的圆形左右大写字母)。

PDF Clown 在 TextMarkup 中按如下方式计算此矩形:

  public void setMarkupBoxes(
List<Quad> value
)
{
PdfArray quadPointsObject = new PdfArray();
double pageHeight = getPage().getBox().getHeight();
Rectangle2D box = null;
for(Quad markupBox : value)
{
/*
NOTE: Despite the spec prescription, Point 3 and Point 4 MUST be inverted.
*/
Point2D[] markupBoxPoints = markupBox.getPoints();
quadPointsObject.add(PdfReal.get(markupBoxPoints[0].getX())); // x1.
quadPointsObject.add(PdfReal.get(pageHeight - markupBoxPoints[0].getY())); // y1.
quadPointsObject.add(PdfReal.get(markupBoxPoints[1].getX())); // x2.
quadPointsObject.add(PdfReal.get(pageHeight - markupBoxPoints[1].getY())); // y2.
quadPointsObject.add(PdfReal.get(markupBoxPoints[3].getX())); // x4.
quadPointsObject.add(PdfReal.get(pageHeight - markupBoxPoints[3].getY())); // y4.
quadPointsObject.add(PdfReal.get(markupBoxPoints[2].getX())); // x3.
quadPointsObject.add(PdfReal.get(pageHeight - markupBoxPoints[2].getY())); // y3.
if(box == null)
{box = markupBox.getBounds2D();}
else
{box.add(markupBox.getBounds2D());}
}
getBaseDataObject().put(PdfName.QuadPoints, quadPointsObject);

/*
NOTE: Box width is expanded to make room for end decorations (e.g. rounded highlight caps).
*/
double markupBoxMargin = getMarkupBoxMargin(box.getHeight());
box.setRect(box.getX() - markupBoxMargin, box.getY(), box.getWidth() + markupBoxMargin * 2, box.getHeight());
setBox(box);

refreshAppearance();
}

private static double getMarkupBoxMargin(
double boxHeight
)
{return boxHeight * .25;}

因此,它获取所有四边形的边界框并添加左右边距,每个边距的宽度为整个边界框高度的四分之一

您的案例结果如何?

虽然如果只有一个四边形,那么添加的边距宽度是合理的,但如果您的标记注释包含多个彼此重叠的四边形,则会导致巨大的、不必要的边距。

如何改进代码?

由于添加的上限取决于各个上限而不是它们的组合边界框,因此可以通过使用各个四边形的最大高度而不是所有四边形的边界框的高度来改进代码,例如像这样:

Rectangle2D box = null;
double maxQuadHeight = 0;
for(Quad markupBox : value)
{
double quadHeight = markupBox.getBounds2D().getHeight();
if (quadHeight > maxQuadHeight)
maxQuadHeight = quadHeight;
...
}
...
double markupBoxMargin = getMarkupBoxMargin(maxQuadHeight);
box.setRect(box.getX() - markupBoxMargin, box.getY(), box.getWidth() + markupBoxMargin * 2, box.getHeight());
setBox(box);

如果您不想为此修补 PDF Clown,您也可以在构造 TextMarkup _textMarkup 后执行此代码(稍加修改)以更正预先计算的注释矩形。

这是否修复了 PDF Clown 错误?

这不是错误,因为文本标记注释矩形不需要最小化; PDF Clown 还可以始终为每个此类注释使用整个裁剪框。

不过,我假设代码的作者想要计算一个最小的矩形,但只针对单行进行了优化,因此在某种程度上没有达到他自己的期望。 .

这段代码还有其他问题吗?

是的。标记注释标记的文本不需要是水平的,它可以以一定角度存在,甚至可以是垂直的。在这种情况下,注释矩形的顶部和底部也需要一些边距,而不仅仅是左侧和右侧。

关于java - PDFClown:创建 TextMarkup 会导致 TextMarkup 的框不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45984062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com