2013-03-19 143 views
1

好的,這裏是獨家新聞。我幾乎完全鎖定(僅查看)來自郵局的PDF。我必須創建一個Web應用程序,用戶可以在其中輸入書籤名稱,以便在PDF中顯示正確的頁面。我知道沒有辦法以編程方式跳轉到特定的書籤。文檔中沒有命名的目標,也無法創建它們。有沒有一種方法可以通過JavaScript以編程方式從PDF文檔中的書籤中提取頁碼?我可以通過書籤循環找到正確的並閱讀頁碼嗎?爲什麼要這麼難呢?使用Javascript訪問PDF瀏覽器的書籤

+0

您是否使用Acrobat Reader和特定的服務器解決方案被鎖定? – plinth 2013-03-19 20:09:36

+0

嗨,Plinth。我們所有的主要東西都使用IIS,但Apache可用。 PDF將從Oracle數據庫中提供。我打算編寫某種ASP頁面,或者相反,直接從Oracle提供網頁 - 在這種情況下很難將頁面與數據分開,但它是可行的。 Reader是我們的默認設置,但我在Firefox中使用了PDF.js和Sumatra插件。不知道如何處理IE,這是我們的默認瀏覽器。這給我帶來麻煩,只是在對象或嵌入標籤中顯示基本PDF。 – Shadeclan 2013-03-20 12:39:52

回答

1

我的公司,Atalasoft,使Ajax/asp.net control有能力做你想做的。它可以讓你顯示PDF文件,並且在服務器端,把書籤和目的地取出併發送到客戶端控制並不難。

實質上,您正在使用基於圖像的查看器替換Acrobat(或其他)查​​看器,該查看器在服務器端解析了PDF並可以告訴查看器要去哪裏。

下面是拉出書籤的一些示例代碼 - 這段代碼看起來比您想象的要複雜得多,這是因爲PDF中的書籤是完整的樹。

delegate void BookmarkReceiver(PdfBookmark bookmark); 

public void VisitBookmarks(PdfBookmarkList bookmarks, BookmarkReceiver receiever) 
{ 
    foreach (PdfBookmark mark in bookmarks) 
    { 
     receiver(mark); 
     VisitBookmarks(mark.Children); 
    } 
} 

// here's a matcher: 

IList<PdfBookmark> FindBookmarksWithName(string s, PdfBookmarkTree tree) 
{ 
    List<PdfBookmark> marks = new List<PdfBookmark>(); 
    VisitBookmarks(tree.Bookmarks, mark => if (mark.Text == s) marks.Add(mark)); 
    return marks; 
} 

當然,如果您只想找到一個訪問者,可以修改訪問者的謂詞和短路。

現在要弄清楚如果你有特定的書籤,你應該去哪個頁面並不像拉出頁面索引那麼簡單。這是因爲書籤不必轉到特定的頁面。書籤具有與其關聯的動作,並且該動作可以是當點擊書籤時要做的事情的列表。例如,我可以製作一個點擊操作,該操作是首先交換第一頁和最後一頁然後進入第一頁的兩個操作的列表。

因此,您所做的是獲取點擊操作並遍歷列表並嘗試查找「轉到視圖」操作,然後將目標識別爲頁面索引並抓取該目標。

是的,這是比您想象的更多的步驟,因爲PDF比指定更豐富。目標頁面可能是一個索引頁面,但它也可能是本地文件系統上不同文檔中的一個頁面,所以我們確實需要檢查以瞭解我們每一步的具體步驟。

+0

儘管如你所說,Adobe看起來可能會起作用,但它比它所需要的更復雜。此外,這可能是一個困難的銷售 - 我正在與我們的軟件霸主一起檢查,看看我們目前是否正在從您那裏獲得軟件許可。再次回顧這個問題,我認爲每次掃描書籤都是一個更好的辦法,可以在處理PDF時將書籤頁碼提前存儲在數據庫中 - 這應該使整個馬戲團變得更簡單。副手,你知道是否有辦法使用GhostScript或其他腳本機制來做到這一點? – Shadeclan 2013-03-20 19:26:26

+0

向我的老闆和我們的客戶說道 - 我想我試圖提供比他們實際需要更多的功能。感謝Plinth和其他所有爲我看過這個問題的人。 – Shadeclan 2013-03-21 14:01:47