设置现有Pdf文档的BaseUrl

本文关键字:BaseUrl 文档 Pdf 设置 | 更新日期: 2023-09-27 18:11:37

我们在使用iTextSharp设置BaseUrl时遇到了麻烦。我们过去曾使用adobe Implementation实现此功能,但我们遇到了一些严重的性能问题。所以我们切换到iTextSharp,它快了大约10倍。Adobe使我们能够为每个文档设置一个基本url。为了在不同的服务器上部署文档,我们确实需要这个。但是我们似乎找不到正确的代码来做这件事。

这是我们在Adobe中使用的代码:

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方法,但它似乎不能正常工作。结果是,在大多数情况下,我们看到了一个框,但里面没有链接或与之相关。(光标没有改变,什么也没发生,当我点击框内)

设置现有Pdf文档的BaseUrl

我给你们举了几个例子。

首先,让我们看一下BaseURL1。在你的评论中,你提到了JavaScript,所以我创建了一个文档,我添加了一个文档级JavaScript片段:

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

这在adobeacrobat中工作得很好,但是当您在adobereader中尝试时,您会得到以下错误:

NotAllowedError:安全设置阻止访问此属性或方法。Doc.baseURL: 1:文档级:0000000000000000

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

所以我没有按照你建议的路径,而是咨询了ISO-32000-1(这是我要求你做的,但是…我在速度上胜过了你。

我发现您可以将URI字典添加到具有Base条目的目录中。所以我写了第二个例子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_name .pdf)的链接。

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