下面是事情的规格方面:通过在页面上放置链接注释来创建链接。链接注释由Rect键或一组四边形表示。我们假设你正在使用矩形。为了放置链接,你需要这样一本字典在最低限度:
<< /Type /Annot /Subtype /Link /Rect [ x1 y1 x2 y2 ] >>
(X1,Y1)和(x2,y2)的描述矩形,其中的链接的活动区域生活的角落。
要处理这个问题,这应该是PDF中的间接对象,并且是您的页面的Annots数组引用的。
如果你可以创建这个,你会在页面上得到一个无处不在的链接。
要让链接去某个地方,您需要链接注释中的/ Dest或an/A条目(但不是两者)。/Dest是页面级导航的较旧工件 - 您不会使用它。而是使用作为操作字典的/ A条目。所以,如果你想浏览的网址http://www.google.com,你让你的注释是这样的:
<< /Type /Annot /Subtype /Link /Rect [ x1 y1 x2 y2 ]
/A << /Type /Action /S /URI /URI (http://www.google.com) >>
>>
我不能帮你专门用如何做到这一点的iTextSharp的。我不特别喜欢他们使用的模型或抽象。我为Atalasoft写了一个PDF工具包,我会告诉你如何在我自己的工具箱中做到这一点。再次,我不遗余力地隐藏这是一个商业产品,而这正是我为谋生而做的。我只想让你看到还有其他选择。
// make a document, add a font, get its metrics
PdfGeneratedDocument doc = new PdfGeneratedDocument();
string fontResource = doc.Resources.Fonts.AddFromFontName("Times New Roman");
PdfFontMetrics mets = doc.Resources.Fonts.Get(fontResource).Metrics;
// make a page, place a line of text
PdfGeneratedPage page = doc.Pages.AddPage(PdfDefaultPages.Letter);
PdfTextLine line = new PdfTextLine(fontResource, 12.0, "Visit my web site.",
new PdfPoint(72, 400));
page.DrawingList.Add(line);
// get the bounds of the text we place, make an annotation
PdfBounds bounds = mets.GetTextBounds(12.0, "Visit my web site.");
bounds = new PdfBounds(72, 400, bounds.Width, bounds.Height);
LinkAnnotation annot = new LinkAnnotation(bounds, new PdfURIAction(new URI("my url")));
page.Annotations.Add(annot);
// save the content
doc.Save("finaldoc.pdf");
是“刁钻”的唯一的事情是,有间的哪些内容是页面和链接注释上解关联 - 但这是因为这是多么的Acrobat机型链接。如果您正在修改现有文档,您将从现有的文件/流中构建一个PdfGeneratedDocument,添加注释并保存。
我理解你的解决方案,但我不能使用它,因为我直接写入PdfContentByte类中的ByteBuffer对象。所以在这种情况下,我需要知道语法并手动编写它。但是,我不太了解PDF规范,因为它不包含任何有用的示例。也许你可以帮助我呢? – NeoKenshinX
如果你想手工做,你应该能够复制@ mkl的例子并查看源代码。链接时,您需要记住PDF不像HTML,所以显示文本和链接不以任何方式彼此相关或绑定,它们恰好具有相同(或类似)的位置。你不“开始文本,创建锚点,显示文本,结束锚点,结束文本”。这意味着你(可能)不能使用'PdfContentByte'创建一个链接,因为这只是图形/文本流而不是页面级字典。 –
@NeoKenshinX plinth的答案显示了一个链接在pdf中的外观。但我认为你首先假设链接是页面内容流的一部分。他们不是。一般来说,动态或交互的一切都是使用与内容分离的注释完成的。正如Chris所说,只需运行我指出的示例并分析生成的PDF。 – mkl