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

时间:2019-07-30 18:28:08

标签: c# itext7

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

我正在使用C#和IText7。我能够加载和扫描现有PDF的这些内部链接。但是我似乎无法做的是更改链接的外观。搜索之后,我发现PdfAnnotation类用于创建新链接,而不是用于更改现有链接。有人告诉我我需要使用Put()来更改现有的。我尝试了许多不同的方法,但是似乎都不起作用。

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()进行哪些具体更改?

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

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

注释仅编码可单击的矩形区域以及单击该区域时将触发的动作(或目标)。也可以配置注释的边框,但是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的样子:

initial PDF

这是输出PDF的样子

resultant PDF