Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java iText查找pdf中文本的位置_Java_Pdf_Itext - Fatal编程技术网

Java iText查找pdf中文本的位置

Java iText查找pdf中文本的位置,java,pdf,itext,Java,Pdf,Itext,我正在创建一个实用程序,它将在现有PDF文档的最后一行文本下方添加一个多行文本字段。这将用于希望向从其他系统生成的报告添加注释的用户 我遵循了iText书中的示例,也研究了这个问题: 现在我有了一个解析文档最后一页的方法和一个自定义侦听器,它可以找到我要查找的文本的坐标 以下是我的代码解析方法: private void parsePdfPage2(String src, int pageNum) throws IOException { PdfReader reader = new P

我正在创建一个实用程序,它将在现有PDF文档的最后一行文本下方添加一个多行文本字段。这将用于希望向从其他系统生成的报告添加注释的用户

我遵循了iText书中的示例,也研究了这个问题:

现在我有了一个解析文档最后一页的方法和一个自定义侦听器,它可以找到我要查找的文本的坐标

以下是我的代码解析方法:

private void parsePdfPage2(String src, int pageNum) throws IOException {
    PdfReader reader = new PdfReader(src);

    RenderListener listener = new MyTextRenderListener();
    PdfContentStreamProcessor processor = new PdfContentStreamProcessor(listener);
    PdfDictionary pageDic = reader.getPageN(pageNum);
    PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES);
    processor.processContent(ContentByteUtils.getContentBytesForPage(reader, pageNum), resourcesDic);
}
下面是听众:

public class MyTextRenderListener implements RenderListener {
@Override
public void beginTextBlock() {}

@Override
public void endTextBlock() {}

@Override
public void renderImage(ImageRenderInfo renderInfo) {}

@Override
public void renderText(TextRenderInfo renderInfo) {
    // Check if this is the text marker
    String text = renderInfo.getText();
    if (text.equalsIgnoreCase("Comments")) {
        // Found it
        LineSegment ls = renderInfo.getBaseline(); 
        System.out.println("Found at X: " + ls.getBoundingRectange().getX() +
                ",  Y: " + ls.getBoundingRectange().getY());
    }
}
}

但是,现在我需要将找到的线段对象(或单个坐标)发送回原始解析方法。当然,我可以将这些值写入磁盘并在解析方法中读取,但这看起来很可怕。我很确定有一种更优雅的方法来实现这一点,我希望有指针。

让您的自定义侦听器保留对原始解析器的引用,并以这种方式传递找到的坐标?这不是最优雅的方法(增加了类之间的耦合),但可能比写入磁盘要好。从体系结构的角度来看,将包含解析方法的对象实现为侦听器,并让侦听器触发文本查找事件可能是最优雅的,但这可能是设计过度了。让自定义侦听器保留对原始解析器的引用并以这种方式传递查找到的坐标?这不是最优雅的方法(增加了类之间的耦合),但可能比写入磁盘要好。从体系结构的角度来看,将包含解析方法的对象实现为侦听器,并让侦听器触发文本发现事件可能是最优雅的,但这可能是设计过度