2013-10-21 94 views
3

我目前正在扩展我们的自定义PDF书写器,以便能够编写链接到网站。但是,我遇到了问题,因为我找不到如何将链接放入PDF中的任何地方。将超链接添加到PDF文档

这是什么打印的文字:“访问我的网站”

BT 
70 50 TD 
/F1 12 Tf 
(visit my website!) Tj 
ET 

我现在需要的是包装成一个超级链接这使点击,当用户被重定向到我的网站,

任何想法该怎么做?我无法使用某个工具 - 我需要知道如何将正确的PDF命令写入该文件,因为大量文档是使用C#动态生成的。目前我正在使用iTextSharp - 但是我找不到任何写超链接的功能,所以我决定添加这个功能。

回答

1

目前我正在使用iTextSharp - 但我找不到任何功能来编写超链接。

看一看在iText in Action, 2nd Edition Webified iTextSharp ExamplesMovieLinks2.csLinkActions.cs

// create an external link 
Chunk imdb = new Chunk("Internet Movie Database", FilmFonts.ITALIC); 
imdb.SetAnchor(new Uri("http://www.imdb.com/")); 
p = new Paragraph("Click on a country, and you'll get a list of movies, containing links to the "); 
p.Add(imdb); 
p.Add("."); 
document.Add(p); 

因此,它确实是简单的添加使用iTextSharp的链接。

如果您仍想手动执行该操作,请查看PDF specification。第12.5.6.5节解释链接注释,和第12.6.4.7节显示URI操作在该链接注释中使用。

+0

我理解你的解决方案,但我不能使用它,因为我直接写入PdfContentByte类中的ByteBuffer对象。所以在这种情况下,我需要知道语法并手动编写它。但是,我不太了解PDF规范,因为它不包含任何有用的示例。也许你可以帮助我呢? – NeoKenshinX

+1

如果你想手工做,你应该能够复制@ mkl的例子并查看源代码。链接时,您需要记住PDF不像HTML,所以显示文本和链接不以任何方式彼此相关或绑定,它们恰好具有相同(或类似)的位置。你不“开始文本,创建锚点,显示文本,结束锚点,结束文本”。这意味着你(可能)不能使用'PdfContentByte'创建一个链接,因为这只是图形/文本流而不是页面级字典。 –

+0

@NeoKenshinX plinth的答案显示了一个链接在pdf中的外观。但我认为你首先假设链接是页面内容流的一部分。他们不是。一般来说,动态或交互的一切都是使用与内容分离的注释完成的。正如Chris所说,只需运行我指出的示例并分析生成的PDF。 – mkl

4

下面是事情的规格方面:通过在页面上放置链接注释来创建链接。链接注释由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,添加注释并保存。

+0

感谢您的评论 - 对不起,我正在度假。我会尽快查看你的解决方案:) – NeoKenshinX