我正在创建一个单独的pdf文件,我想链接到与pdf相同的目录中的其他文件。
即
MyFolder
|
|-main.pdf
|-myotherpdf.pdf
|-myotherotherpdf.pdf
我希望main.pdf有链接,这会导致pdf上的默认程序打开其他pdf文件。
当我在服务器上生成这些文件然后将它们下载到客户端时,我无法使用绝对链接,因为客户端PC上不存在这些链接。
首先,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”但是单击它会导致弹出警告对话框要求允许/拒绝,点击允许它在firefox中打开,其中url“file:///test.pdf”无法解析为任何内容。
有关如何使其工作的任何想法,或者甚至可以在pdfs中进行这种链接吗?
答案 0 :(得分:2)
我只能回答你的问题:PDF文件是否真的支持这样的相对文件链接?
是的,确实如此。我用main.pdf创建了一个小测试,它有两个链接到同一文件夹中的另外两个PDF文档。我使用Acrobat手动创建了链接,并将启动操作与链接注释相关联。请参阅此处的内部结构:
这是带有主要加上两个辅助PDF的zip。请注意,您可以将它们复制到任何位置,相关链接仍然有效。 https://www.dropbox.com/s/021tvynkuvr63lv/main.zip
我不确定如何使用abcpdf完成此操作,尤其是因为您从HTML转换可能会限制可用的PDF功能。
答案 1 :(得分:0)
所以我最终得到了它,感谢@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上与其关联的查看器中打开每个链接。