【问题标题】:Add a hyperlink into a PDF document在 PDF 文档中添加超链接
【发布时间】:2013-10-29 19:26:16
【问题描述】:

我目前正在扩展我们的自定义 PDF 编写器,以便能够编写指向网站的链接。但是,我有一个问题,因为我在任何地方都找不到如何在 PDF 中放置链接。

这是打印文本的内容:

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

我现在需要将其包装成一个超链接,以便用户在点击“访问我的网站!”时被重定向到我的网站!

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

【问题讨论】:

    标签: pdf hyperlink itextsharp


    【解决方案1】:

    以下是规范方面的说明:通过在页面上放置链接注释来创建链接。链接注释由 Rect 键或一组四边形表示。假设您正在使用矩形。为了放置链接,您至少需要这样的字典:

    << /Type /Annot /Subtype /Link /Rect [ x1 y1 x2 y2 ] >>
    

    (x1, y1) 和 (x2, y2) 描述了链接活动区域所在矩形的角。

    要使用它,这应该是 PDF 中的间接对象,并从页面的 Annots 数组中引用。

    如果你能创建这个,你会在页面上得到一个无处可去的链接。

    要让链接到达某个地方,您需要在链接 annot 中添加 /Dest 或 /A 条目(但不能同时使用两者)。 /Dest 是用于页面级导航的较旧工件 - 您不会使用它。相反,使用 /A 条目,它是一个动作字典。所以如果你想导航到 url 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,添加注释,然后保存。

    【讨论】:

    • 感谢您的评论 - 对不起,我正在度假。我很快就会看看你的解决方案:)
    【解决方案2】:

    目前我正在使用 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 操作

    【讨论】:

    • 我了解您的解决方案,但我无法使用它,因为我直接写入 PdfContentByte 类中的 ByteBuffer 对象。所以在这种情况下,我需要知道语法并手动编写。但是我并不真正理解 PDF 规范,因为它不包含任何有用的示例。也许你可以帮我解决这个问题?
    • 如果你想手工做,你应该可以复制@mkl的例子并查看源代码。链接时,您需要记住 PDF 与 HTML 不同,因此显示文本和链接不会以任何方式相互关联或绑定,它们只是碰巧具有相同(或相似)的位置。您不会“开始文本、创建锚点、显示文本、结束锚点、结束文本”。这意味着您(可能)将无法使用 PdfContentByte 创建链接,因为这只是图形/文本流,而不是页面级字典。
    • @NeoKenshinX plinth 的回答显示了链接在 pdf 中的外观。但我认为您从错误的假设开始,即链接是页面内容流的一部分。他们不是。通常,所有动态或交互的东西都是使用与内容分开的注释来完成的。正如 Chris 所说,只需运行我指向您的示例并分析生成的 PDF。
    • 好的,感谢您的所有输入。下周当我回到办公室时,我将在这个问题上再调查一些时间。下周我会告诉你我的情况:)
    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2011-08-17
    • 2018-12-01
    • 2017-11-21
    相关资源
    最近更新 更多