我们经常使用 Word 生成具有许多内部交叉引用的大型文档。我正在编写一个工具来查找并为这些可点击的内部交叉引用添加蓝色下划线。(我知道我可以在 Word 级别执行此操作,但是即使我无法访问原始 Word 文件,我也需要能够执行此操作。)
我正在使用 C# 和 IText 7。我能够加载和扫描这些内部链接的现有 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()
添加这些下划线进行哪些具体更改?
谢谢你的时间!!
据我所知,您尝试实现的目标无法通过纯粹修改注释对象来实现。可能可以尝试使用外观流,但我不确定它是否会起作用,即使它会产生一些副作用。
注释只是对可点击的矩形区域以及点击该区域时将触发的动作(或目标)进行编码。也可以配置注释的边框,但 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 的样子
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句