4

我正在创建一个 pdf 文件,我想将它链接到与 pdf 相同目录中的其他文件。

IE。

MyFolder
        |
        |-main.pdf
        |-myotherpdf.pdf
        |-myotherotherpdf.pdf

我希望 main.pdf 有链接,这些链接会导致 pdf 上的默认程序打开其他 pdf。

当我在服务器上生成这些文件,然后将它们下载到客户端时,我不能使用绝对链接,因为这些在客户端电脑上不存在。

所以首先 pdf 文件是否真的支持像这样的相对文件链接,我没有发现太多说明它们支持的任何一种方式。

此外,为了生成我的 pdf,我使用 abcpdf 并将其提供为 html 以转换为 pdf。

为了尝试在 html 中生成正确的正确 url,我尝试了以下操作

<a href='test.pdf'>test pdf link to local file</a>
<a href='#test.pdf'>test pdf link to local file</a>
<a href='/test.pdf'>test pdf link to local file</a>
<a href='file:///test.pdf'>test pdf link to local file</a>
<a href='file://test.pdf'>test pdf link to local file</a>

他们中的大多数要么直接指向我生成pdf文档的位置(临时文件路径),要么链接悬停在acrobat中显示“file:///test.pdf”,但单击它会弹出一个警告对话框,要求允许/deny,单击“允许”后,它会在 Firefox 中打开,其 URL 为“file:///test.pdf”,但无法解析任何内容。

关于如何使其工作或这种链接是否可以在 pdf 中实现的任何想法?

4

2 回答 2

3

我只能回答你的问题:PDF文件真的支持这样的相对文件链接吗?

是的,它确实。我用 main.pdf 创建了一个小测试,它有两个指向同一文件夹中其他两个 PDF 文档的链接。我使用 Acrobat 手动创建了链接,并将启动操作与链接注释相关联。看这里的内部结构:

在此处输入图像描述

这是包含主要 PDF 和两个辅助 PDF 的 zip。请注意,您可以将它们复制到任何地方,并且相关链接仍然有效。 https://www.dropbox.com/s/021tvynkuvr63lv/main.zip

我不确定您将如何使用 abcpdf 完成此操作,特别是因为您正在从 HTML 转换,这可能会限制可用的 PDF 功能。

于 2013-07-23T08:19:48.760 回答
1

因此,感谢@Frank Rem 和 abcpdf 人员的帮助,我最终成功了

代码如下

    foreach (var page in Enumerable.Range(0, doc.PageCount))
    {
        doc.PageNumber = page;

        var annotEnd = doc.GetInfoInt(doc.Page, "Annot Count");

        for (var i = 0; i <= annotEnd; ++i)
        {
            var annotId = doc.GetInfoInt(doc.Page, "Annot " + (i + 1));

            if (annotId > 0)
            {
                var linkText = doc.GetInfo(annotId, "/A*/URI*:Text");

                if (!string.IsNullOrWhiteSpace(linkText))
                {
                    var annotationUri = new Uri(linkText);

                    if (annotationUri.IsFile)
                    {
                        // Note abcpdf temp path can be changed in registry so if this changes
                        // will need to rewrite this to look at the registry
                        // http://www.websupergoo.com/helppdfnet/source/3-concepts/d-registrykeys.htm
                        var abcPdfTempPath = Path.GetTempPath() + @"AbcPdf\";

                        var relativePath = annotationUri.LocalPath.ToLower().Replace(abcPdfTempPath.ToLower(), string.Empty);

                        // Only consider files that are not directly in the temp path to be valid files
                        // This is because abcpdf will render the document as html to the temp path
                        // with a temporary file called something like {GUID}.html
                        // so it would be difficult to tell which files are the document
                        // and which are actual file links when trying to do the processing afterwards
                        // if this becomes and issue this could be swapped out and do a regex on {GUID}.html
                        // then the only restriction would be that referenced documents cannot be {GUID}.html
                        if (relativePath.Contains("\\"))
                        {
                            doc.SetInfo(annotId, "/A*/S:Name", "Launch");
                            doc.SetInfo(annotId, "/A*/URI:Del", "");
                            doc.SetInfo(annotId, "/A*/F:Text", relativePath);
                            doc.SetInfo(annotId, "/A*/NewWindow:Bool", "true");
                        }
                    }
                }
            }
        }
    }

这将允许在 PC 上与其关联的查看器中打开每个链接。

于 2013-09-12T05:20:03.483 回答