如何使用 IText7 和 C# 为现有 PDF 中的内部链接添加下划线?

How do I underline internal links in an existing PDF using IText7 and C#?

我们经常使用 Word 生成包含许多内部交叉引用的大型文档。我正在编写一个工具来查找这些可点击的内部交叉引用并为其添加蓝色下划线。 (我知道我可以在 Word 级别执行此操作,但即使我无法访问原始 Word 文件,我也需要能够执行此操作。)

我正在使用 C# 和 IText 7。我能够加载和扫描现有 PDF 以获取这些内部链接。但我似乎无法做的是改变链接的外观。经过搜索,我了解到 PdfAnnotation class 用于 创建 新链接,而不是用于更改现有链接。我被告知我需要使用 Put() 来更改现有的。我尝试了多种不同的方法,但其中 none 似乎有效。

var pdfDoc = new PdfDocument(new PdfReader(txt_FileLoaded.Text), new PdfWriter(outfile));
for (int x = pgStart; x <= pgEnd; x++)
{
    PdfPage page = pdfDoc.GetPage(x);
    var annotations = page.GetAnnotations();
    foreach (var a in annotations)
    {
        if (a.GetSubtype() == PdfName.Link)
        {
            PdfLinkAnnotation link = (PdfLinkAnnotation)a;
            var action = link.GetAction();
            if (action != null)
            {
                if ( 
                    (action.Get(PdfName.S) == PdfName.URI) || 
                    (action.Get(PdfName.S) == PdfName.GoToR) )
                {
                    //Do something with external links if you want
                }
                else if ( 
                    (action.Get(PdfName.S) == PdfName.GoTo) ||
                    (action.Get(PdfName.S) == PdfName.GoToE))
                {
                    //Do something with internal links
                    link.Put(PdfName.C, new PdfArray(ColorConstants.BLUE.GetColorValue()));
                    link.Put(PdfName.Border, new PdfArray(new int[] {0,0,5}));
                }
            }
        }
    }
}
pdfDoc.Close();

当我调用Close()时,新文件被正确写入,但没有出现下划线。我再次确认它确实找到了链接。我需要通过 Put() 进行哪些具体更改才能添加这些下划线?

感谢您的宝贵时间!!

据我所知,您试图实现的目标无法通过纯粹修改注释对象来实现。也许可以尝试使用外观流,但我不确定它是否会起作用,即使它会产生一些副作用。

注释只对变为可点击的矩形区域以及点击该区域时将触发的动作(或目标)进行编码。也可以配置注释的边框,但 PDF 规范不允许您进行细粒度调整,因此您将无法仅设置底部边框来模拟下划线。

我们要做的是直接在页面内容中画一条线,希望标注位置足够准确。

我们可以用annotation.getRectangle()得到注释的面积,然后用PdfCanvas画一条坐标匹配的线(如果需要也可以向上移动一点)。代码在 Java 中,但您会发现转换为 C# 非常容易,因为只有方法名称会以大写字母开头。

PdfPage page = pdfDocument.getPage(i);
// Create canvas where we would draw additional lines
PdfCanvas pageCanvas = new PdfCanvas(page);
for (PdfAnnotation annotation : page.getAnnotations()) {
    Rectangle annotationArea = annotation.getRectangle().toRectangle();
    // Draw a line at the bottom of the annotation area
    pageCanvas.setStrokeColor(ColorConstants.BLUE).
            moveTo(annotationArea.getLeft(), annotationArea.getBottom()).
            lineTo(annotationArea.getRight(), annotationArea.getBottom()).
            stroke();
}

这是初始 PDF 的样子:

这是输出 PDF 的样子