设置现有Pdf文档的BaseUrl

时间:2014-07-04 07:00:43

标签: c# pdf hyperlink itext base-url

我们在使用iTextSharp设置BaseUrl时遇到问题。我们过去曾使用过Adobes 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方法进行不同的实现,但它似乎无法正常工作。结果在大多数情况下,我们看到了框,但内部没有链接或与之关联。 (当我在框内点击时,光标没有改变,也没有发生任何事情)

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我已经为你做了几个例子。

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

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

这在Adobe Acrobat中完美运行,但是当您在Adobe Reader中尝试此操作时,会出现以下错误:

  

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_3.pdf)。

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