【问题标题】:Set BaseUrl of an existing Pdf Document设置现有 Pdf 文档的 BaseUrl
【发布时间】:2014-08-25 10:39:36
【问题描述】:

我们在使用 iTextSharp 设置 BaseUrl 时遇到问题。我们过去曾为此使用过 Adob​​es Implementation,但我们遇到了一些严重的性能问题。所以我们切换到 iTextSharp,它的速度大约快了 10 倍。 Adobe 使我们能够为每个文档设置一个基本 URL。为了在不同的服务器上部署我们的文档,我们确实需要这个。但我们似乎无法找到正确的代码来执行此操作。

这段代码是我们在 Adob​​e 中使用的:

public bool SetBaseUrl(object jso, string baseUrl)
{
    try
    {
        object result = jso.GetType().InvokeMember("baseURL", BindingFlags.SetProperty, null, jso, new Object[] {baseUrl });
        return result != null;
    }
    catch
    {
        return false;
    }
}

许多解决方案都描述了如何在新文档或空文档中插入链接。但是我们的文档已经存在,并且包含的​​不仅仅是文本。我们希望使用指向一个或多个其他文档的链接覆盖特定的单词。因此,对我们来说非常重要的是,我们可以在不访问文本本身的情况下插入链接。也许在这些单词上放置一个框并设置它的位置(因为我们知道单词在文档中的位置)

我们尝试了不同的实现,使用setAction 方法,但它似乎不能正常工作。结果在大多数情况下,我们看到了盒子,但里面没有链接或与之相关联。 (当我在框内单击时,光标没有改变,也没有发生任何事情)

感谢任何帮助。

【问题讨论】:

  • 您能与我们分享一个带有 BaseUrl 和一个没有 BaseUrl 的 PDF 吗?或者请解释您如何使用 Adob​​e 的实现定义 BaseUrl。甚至更好:您能指出 ISO-32000-1 中描述该概念的部分吗?我知道 HTML 中基本 Url 的概念,但我认为我在 PDF 的上下文中没有遇到过它。一旦我们在规范中看到它,我们就可以轻松地将它添加到 iText。
  • 很遗憾,我无法与您分享任何有问题的文件,因为它们包含机密信息。我添加了 Adob​​e 实现的代码示例,但它所做的只是设置 JavaScript 对象的 baseURL 属性,如本文档中所述:adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/…
  • 好的,这看起来很简单。根据我的时间,我会给你做一些例子。我从头开始创建 PDF 并引入 BaseURL 的地方。另一个我改编现有 PDF 的地方。
  • 我已经做了一些实验,但是我马上要开会,所以我还不能发布任何东西。但是,我已经发现设置 baseURL 仅在 Acrobat 中查看 PDF 时有效。在 Reader 中,您会遇到以下异常:NotAllowedError:安全设置阻止访问此属性或方法。 Doc.baseURL:1:Document-Level:0000000000000000

标签: c# pdf hyperlink itext base-url


【解决方案1】:

我给你举了几个例子。

首先,我们来看看BaseURL1。在您的评论中,您提到了 JavaScript,因此我创建了一个文档,并在其中添加了一个文档级 JavaScript 的 sn-p:

writer.addJavaScript("this.baseURL = \"http://itextpdf.com/\";");

这在 Adob​​e Acrobat 中完美运行,但是当您在 Adob​​e Reader 中尝试时,您会收到以下错误:

NotAllowedError:安全设置阻止访问此属性或 方法。 Doc.baseURL:1:Document-Level:0000000000000000

这与 Acrobat 的 JavaScript 参考一致,其中明确指出更改基本 URL 需要特殊权限。

因此,我没有遵循您建议的路径,而是参考了 ISO-32000-1(这是我要求您做的,但是...我在速度上击败了您)。

我发现您可以使用Base 条目将URI 字典添加到目录中。所以我写了第二个例子,BaseURL2,我把这个字典添加到 PDF 的根字典中:

PdfDictionary uri = new PdfDictionary(PdfName.URI);
uri.put(new PdfName("Base"), new PdfString("http://itextpdf.com/"));
writer.getExtraCatalog().put(PdfName.URI, uri);

现在 BaseURL 在 Acrobat 和 Reader 中都可以使用。

假设您想将 BaseURL 添加到现有文档,我写了BaseURL3。在本例中,我们将相同的字典添加到现有 PDF 的根字典中:

PdfReader reader = new PdfReader(src);
PdfDictionary uri = new PdfDictionary(PdfName.URI);
uri.put(new PdfName("Base"), new PdfString("http://itextpdf.com/"));
reader.getCatalog().put(PdfName.URI, uri);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();

使用此代码,您可以将指向“index.php”(base_url.pdf)的链接更改为指向“http://itextpdf.com/index.php”(base_url_3.pdf)的链接。

现在您可以用更便宜的 iTextSharp 许可证替换您的 Adob​​e 许可证 ;-)

【讨论】:

  • 像魅力一样工作。非常感谢
  • 这是一个很好的问题,因为通过回答我学到了一些我还不知道的东西。
  • 这些示例 PDF 的链接已损坏。你能更新它们吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2012-07-26
  • 2011-08-13
  • 2015-06-23
  • 2010-11-27
相关资源
最近更新 更多