2013-07-23 53 views
2

我正在創建一個單獨的pdf文件,我想鏈接到與PDF相同目錄中的其他文件。pdf文件中的相對文件鏈接

即。

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

我希望main.pdf有可能導致pdf上的默認程序打開其他pdf文件的鏈接。

由於我在服務器上生成這些文件,然後將它們提供給客戶端下載,所以我無法使用絕對鏈接,因爲這些鏈接在客戶端PC上不存在。

因此,首先PDF文件實際上支持這樣的相關文件鏈接,我沒有發現太多說他們做的任何一種方式。

此外,要生成我的PDF我使用abcpdf並提供它的HTML轉換爲PDF。

在HTML嘗試併產生正確的出正確的網址,我曾嘗試以下

<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「這不會解決任何事情。

關於如何讓這個工作或如果這種類型的鏈接甚至可能在pdf中的任何想法?

回答

0

所以我得到了它的結束感謝工作從abcpdf傢伙

代碼爲@Frank REM和一些幫助如下

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"); 
         } 
        } 
       } 
      } 
     } 
    } 

這將使每一個環節在觀衆中打開這是與電腦相關的。

1

我只能回答你的問題:PDF文件實際上是否支持這樣的相關文件鏈接?

是的,它的確如此。我用一個main.pdf創建了一個小測試,它有兩個鏈接到同一個文件夾中的兩個其他PDF文檔。我使用Acrobat手動創建鏈接,並將啓動操作與鏈接註釋關聯。在這裏看到的內部結構:

enter image description here

這裏是主加兩個副PDF文件的zip。請注意,您可以將其複製到任何地方,並且相關鏈接保持有效。 https://dl.dropboxusercontent.com/u/40113632/main.zip

我不確定如何使用abcpdf完成此操作,特別是因爲您正在從HTML轉換,這可能會限制可用的PDF功能。

+0

這看起來很有前途,我一直與abcpdf開發者保持聯繫,並且有一個獲得這種低級設置的API,我只需要弄清楚如何使用它,重新顯示那裏將幫助很多,會讓你知道作爲一個實驗 –

+0

你用什麼應用程序來看結構,似乎無法找到它 –

+0

它是一個內部工具(TallComponents)。 –