gpt4 book ai didi

java - 使用 PDFClown 突出显示文本而不使用 PDF 注释

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

几周前我开始使用 PDFClown。我的目的是多字突出显示,主要是在报纸上。从 org.pdfclown.samples.cli.TextHighlightSample 示例开始,我成功提取了多单词位置并突出显示它们。我什至解决了大多数情况下由于文本排序和匹配而产生的一些问题。

不幸的是我的框架包括 FPDI并且它不考虑 PDFAnnotations。因此,页面内容流之外的所有内容(例如文本注释和其他所谓的标记注释)都会丢失。

那么关于使用 PdfClown 创建“文本突出显示”而不使用 PDF 注释有什么建议吗?

最佳答案

为了不在注释中突出显示,而是在实际页面内容流中突出显示,必须将图形命令放入页面内容流中,在 org.pdfclown.samples.cli.TextHighlightSample< 的情况下 示例被隐式放入普通注释外观流中。

可以这样实现:

org.pdfclown.files.File file = new org.pdfclown.files.File(resource);
Pattern pattern = Pattern.compile("S", Pattern.CASE_INSENSITIVE);
TextExtractor textExtractor = new TextExtractor(true, true);

for (final Page page : file.getDocument().getPages())
{
final List<Quad> highlightQuads = new ArrayList<Quad>();

Map<Rectangle2D, List<ITextString>> textStrings = textExtractor.extract(page);
final Matcher matcher = pattern.matcher(TextExtractor.toString(textStrings));

textExtractor.filter(textStrings, new TextExtractor.IIntervalFilter()
{
@Override
public boolean hasNext()
{
return matcher.find();
}

@Override
public Interval<Integer> next()
{
return new Interval<Integer>(matcher.start(), matcher.end());
}

@Override
public void process(Interval<Integer> interval, ITextString match)
{
{
Rectangle2D textBox = null;
for (TextChar textChar : match.getTextChars())
{
Rectangle2D textCharBox = textChar.getBox();
if (textBox == null)
{
textBox = (Rectangle2D) textCharBox.clone();
}
else
{
if (textCharBox.getY() > textBox.getMaxY())
{
highlightQuads.add(Quad.get(textBox));
textBox = (Rectangle2D) textCharBox.clone();
}
else
{
textBox.add(textCharBox);
}
}
}
highlightQuads.add(Quad.get(textBox));
}
}

@Override
public void remove()
{
throw new UnsupportedOperationException();
}
});

// Highlight the text pattern match!
ExtGState defaultExtGState = new ExtGState(file.getDocument());
defaultExtGState.setAlphaShape(false);
defaultExtGState.setBlendMode(Arrays.asList(BlendModeEnum.Multiply));

PrimitiveComposer composer = new PrimitiveComposer(page);
composer.getScanner().moveEnd();
// TODO: reset graphics state here.
composer.applyState(defaultExtGState);
composer.setFillColor(new DeviceRGBColor(1, 1, 0));
{
for (Quad markupBox : highlightQuads)
{
Point2D[] points = markupBox.getPoints();
double markupBoxHeight = points[3].getY() - points[0].getY();
double markupBoxMargin = markupBoxHeight * .25;
composer.drawCurve(new Point2D.Double(points[3].getX(), points[3].getY()),
new Point2D.Double(points[0].getX(), points[0].getY()),
new Point2D.Double(points[3].getX() - markupBoxMargin, points[3].getY() - markupBoxMargin),
new Point2D.Double(points[0].getX() - markupBoxMargin, points[0].getY() + markupBoxMargin));
composer.drawLine(new Point2D.Double(points[1].getX(), points[1].getY()));
composer.drawCurve(new Point2D.Double(points[2].getX(), points[2].getY()),
new Point2D.Double(points[1].getX() + markupBoxMargin, points[1].getY() + markupBoxMargin),
new Point2D.Double(points[2].getX() + markupBoxMargin, points[2].getY() - markupBoxMargin));
composer.fill();
}
}
composer.flush();
}

file.save(new File(RESULT_FOLDER, "multiPage-highlight-content.pdf"), SerializationModeEnum.Incremental);

(HighlightInContent.java方法testHighlightInContent)

您将识别原始示例中的文本提取框架。只是现在,整个页面中的四边形在处理之前会被收集,并且处理代码(主要是从 TextMarkup.refreshAppearance() 借用的)将表示四边形的表单绘制到页面内容中。

请注意,要使此功能正常工作,必须在插入新指令之前重置图形状态(该位置用 TODO 注释标记)。这可以通过应用保存/恢复状态或通过实际抵消不需要的更改状态条目来完成。不幸的是,我没有看到如何在 PDF Clown 中执行前者,也没有时间执行后者。

关于java - 使用 PDFClown 突出显示文本而不使用 PDF 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37021130/

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