【问题标题】:itextsharp hyperlink a image and have it open in default viewer when pickeditextsharp 超链接图像并在选择时在默认查看器中打开它
【发布时间】:2015-12-31 20:09:52
【问题描述】:

我有一个使用 itextsharp 创建的 pdf 文件,文件中包含图像。我想在文件中放置一个超链接,如果您选择图片,它将在图片查看器中打开该图片。我可以设置一个指向网址的超链接,但不知道如何让它打开文件。下面是代码,是的,我知道 c:\test.jpg 是一个错误的硬编码文件名,但这只是一个测试。当您单击图片时,它什么也不做,但我不知道如何告诉它该做什么。

iTextSharp.text.Image pic =TextSharp.text.Image.GetInstance(comment.examplePic);
pic.ScaleToFit(200f, 200f);
Chunk cImage = new Chunk(pic, 0, 0, false);
Anchor anchor = new Anchor(cImage);
anchor.Reference = "c:\\test.jpg";
doc.Add(pic);
doc.Add(anchor);

【问题讨论】:

  • 您最终使用了哪些建议的解决方案?

标签: c# image hyperlink itextsharp


【解决方案1】:

PDF 是独立的。这意味着显示 PDF 所需的所有资源(通常)都存储在 PDF 中(例外情况是可以从操作系统中检索到的字体)。

当您有一个显示在 PDF 页面上的图像时,该图像的字节存储在我们所谓的 Image XObject 中。 XObject 是页面外部的对象,但作为单独的对象存储在 PDF 文件中。

您要求将存储在此单独对象中的图像字节提供给操作系统上的查看器。这是不可能的。我不知道有任何查看器可以获取这些字节并以某种方式将它们转发给图像查看器。

我能想到三种可能的解决方法。我不知道您是否可以接受这些变通方法。

1.在线提供图片

您可以将图像放在服务器上并使用您在 sn-p 中的代码链接到该在线图像。当然:这只有在查看文档的人在线并且当他的查看者询问他是否可以链接到 Internet 上的资源时单击确定时才有效。

2。将图像用作注释

在这种情况下,您将创建一个注释,并为其创建一个外观,该外观在注释层中呈现相同的图像 XObject(所有注释都显示在页面内容的顶部)。您可以轻松更改注释的可见性状态,使其不可见(在您的情况下,这将是默认状态)或可见(在您的情况下,这将在单击链接时由 JavaScript 操作触发)。

这里有一个这样的注释示例:Advertisement。如果您打开advertisement.pdf,您会看到一个带有“关闭此广告”按钮的图像。单击该按钮后,注释的状态将更改为不可见。您可以执行类似的操作,但反过来:单击链接使其可见而不是不可见。

此解决方案不依赖于外部查看器,图像显示在 PDF 查看器中。

3.将图片添加为可选内容

从 PDF 1.5 开始,PDF 支持可选内容。例如参见OptionalContentExample。在这个例子中,我们有一些问题和答案,但默认情况下答案是不可见的。见layer_actions.pdf。有“开/关/切换”链接可以使答案可见或不可见。

您可以对图像执行相同的操作:您可以将它们添加到默认情况下不可见的图层,但如果有人单击链接,则可以使其可见。但是:这需要支持 OCG(可选内容组)的查看器以及更改这些 OCG 状态的操作。例如:如果您在 Chrome 的 PDF 查看器中尝试 layer_actions.pdf 示例,它不会工作,但如果您下载 PDF 并在 Adob​​e Reader 中打开它,您会看到我描述的行为。

总结:

您提出的问题是不可能的,但有一些解决方法。如果您选择了一种变通方法并且您没有成功地提出该变通方法,请发布另一个问题(但请注意,并非所有观众都支持每种变通方法)。

【讨论】:

    【解决方案2】:

    没有冒犯,但太多的知识有时会让你对小事一无所知。

    这个问题的简单解决方案就在这里

    http://kuujinbo.info/iTextSharp/imageAnchor.aspx

    我实现的示例代码像魅力一样工作

            PdfPCell p1 = new PdfPCell();
            p1 = new PdfPCell();
            p1.Padding = 0;
            p1.Border = 0;
            PdfPTable nav = new PdfPTable(1);
            nav.WidthPercentage = 100;
            nav.SpacingAfter = 12;
            navbarImg.Annotation= new Annotation(0, 0, 0, 0, ur);
            p1.Image = navbarImg;
            nav.AddCell(p1);
            _doc.Add(nav);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2015-11-01
      相关资源
      最近更新 更多