Java 使用itextpdf在对齐的pdf文本下划线

Java 使用itextpdf在对齐的pdf文本下划线,java,pdf,itextpdf,Java,Pdf,Itextpdf,我正试图用itextpdf在pdf中强调合理的测试,我想我已经发现了一个bug,我真的很想解决这个问题 当我按上所述调用getBaseline()时,下划线将从文本末尾延伸到下一列 float lx = renderInfos.get(i).getBaseline().getStartPoint().get(0); float rx = renderInfos.get(i).getBaseline().getEndPoint().get(0); 您可以从 谢谢

我正试图用itextpdf在pdf中强调合理的测试,我想我已经发现了一个bug,我真的很想解决这个问题

当我按上所述调用getBaseline()时,下划线将从文本末尾延伸到下一列

        float lx = renderInfos.get(i).getBaseline().getStartPoint().get(0);
        float rx = renderInfos.get(i).getBaseline().getEndPoint().get(0);

您可以从

谢谢

4.1.0
到最近的
5.5.0
,我在我尝试过的所有版本的itextpdf上都看到了这一点

要将下划线代码与我无法共享的其他专有代码分开,需要付出一些努力。如果你觉得有帮助,我可以做

如果这是一个bug,是否有一个问题追踪器可以记录它

PS(mkl):这里是一个简短的代码片段,用于重现问题:

PdfReader reader = new PdfReader(...);

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(...));

for (int page = 1; page <= reader.getNumberOfPages(); page++)
{
    final List<TextRenderInfo> infos = new ArrayList<TextRenderInfo>();
    PdfTextExtractor.getTextFromPage(reader, page, new TextExtractionStrategy()
    {
        public void renderText(TextRenderInfo renderInfo)
        {
            infos.add(renderInfo);
        }

        public void renderImage(ImageRenderInfo renderInfo) { }
        public void endTextBlock() { }
        public void beginTextBlock() { }
        public String getResultantText() { return "";}
    });

    PdfContentByte content = stamper.getOverContent(page);
    for (TextRenderInfo info : infos)
    {
        float lx = info.getBaseline().getStartPoint().get(0);
        float rx = info.getBaseline().getEndPoint().get(0);
        float y = info.getBaseline().getEndPoint().get(1);
        content.moveTo(lx, y);
        content.lineTo(rx, y);
        content.stroke();
    }
}

stamper.close();
PdfReader=newpdfReader(…);
PdfStamper stamper=新PdfStamper(读取器,新文件输出流(…);

对于(int page=1;page这个问题下面的错误是OP在一些列表
renderefos
中收集他在
renderText
中检索到的
TextRenderInfo
对象,然后使用它们。(在我添加到问题中以重现问题的示例代码中,我同样使用了列表
infos

TextRenderInfo
对象在出现时不会存储整个图形状态,也不会计算以后可以查询的所有属性。而是在请求其属性时,使用属性请求时的当前信息计算属性

调用例如
TextRenderInfo
实例的
getBaseline()
方法时,基线是使用
getBaseline()时解析器的图形状态计算的
call。如果代码再现问题,这意味着基线是使用页面末尾内容流的图形状态设置计算的。这尤其包括对基线长度有影响的图形状态属性,如字符和字间距

因此,要修复OP的代码,必须在调用
renderText
期间计算
TextRenderInfo
实例所需的所有信息

例如,为了修复我添加到问题中的代码以重现问题,可以如下更改:

PdfReader reader = new PdfReader(...);

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(...));

for (int page = 1; page <= reader.getNumberOfPages(); page++)
{
    final List<LineSegment> lines = new ArrayList<LineSegment>();
    PdfTextExtractor.getTextFromPage(reader, page, new TextExtractionStrategy()
    {
        public void renderText(TextRenderInfo renderInfo)
        {
            lines.add(renderInfo.getBaseline());
        }

        public void renderImage(ImageRenderInfo renderInfo) { }
        public void endTextBlock() { }
        public void beginTextBlock() { }
        public String getResultantText() { return "";}
    });

    PdfContentByte content = stamper.getOverContent(page);
    for (LineSegment line : lines)
    {
        float lx = line.getStartPoint().get(0);
        float rx = line.getEndPoint().get(0);
        float y = line.getEndPoint().get(1);
        content.moveTo(lx, y);
        content.lineTo(rx, y);
        content.stroke();
    }
}

stamper.close();
PdfReader=newpdfReader(…);
PdfStamper stamper=新PdfStamper(读取器,新文件输出流(…);

对于(int page=1;page)您可以共享您的文档和来源吗?iText版本号也会有帮助。也许这是一个已经解决的问题。@BrunoLowagie感谢您的快速回复。我已经用一些相关信息编辑了这个问题。确实,大小似乎有问题。。。