看板 Visual_Basic 關於我們 聯絡資訊
整理一下有關Acrobat與PDF方面的心得. Adobe出品Acrobat已經有十個版本了, 其中,含7.0版之後,支援VB6的ActiveX元件重新整理了一次,ProgID不一樣了, 而且還出現了SDK,也就是有另外一組非控制項而是type library可以使用. 所以,如果要做個簡單的表單,表單上放一個PDF視窗,如果是使用下列二種方式 建立控制項,都不太保險: Dim WithEvents my_pdf_view As AcroPDF Set my_pdf_view = Controls.Add("AcroPDF.PDF.1") Dim WithEvents my_pdf_view Ad PDF Set my_pdf_view = Controls.Add("Pdf.PDFCtrl.6") 你不知道使用者電腦到底是有哪個版本的Acrobat. 此時就需要一種偵測式的控制項建構,如以下函式: Function GetMyPDFView(ByRef Form1 As Form) As Object Const PDFViewID As String = "PDFView" On Error Goto ErrGetMyPDFView If HasPDFControl(Form1) Then Form1.Remove PDFViewID Set GetMyPDFView = Form1.Controls.Add("AcroPDF.PDF.1", PDFViewID) If GetMyPDFView Is Nothing Then _ Set GetMyPDFView = Form1.Controls.Add("AcroPDF.PDF", PDFViewID) If GetMyPDFView Is Nothing Then _ Set GetMyPDFView = Form1.Controls.Add("Pdf.PDFCtrl.6", PDFViewID) If GetMyPDFView Is Nothing Then _ Set GetMyPDFView = Form1.Controls.Add("Pdf.PDFCtrl.5", PDFViewID) ... If GetMyPDFView Is Nothing Then _ Set GetMyPDFView = Form1.Controls.Add("Pdf.PDFCtrl.1", PDFViewID) Exit Function ErrGetMyPDFView: Resume Next End Function Function HasPDFControl(Form1 As Form) As Boolean Dim ctrl As Variant For Each ctrl In Form1.Controls If ctrl.Name = "PDFView" Then HasPDFControl = True End If Next HasPDFControl = False End Function 另外要注意,表單上別放特定版本Acrobat的ActiveX控制項,以免表單在執行時 仍檢查電腦是否有特定版本,可能因此妨礙程式執行. 而因為AcroPDF版本蠻亂的,如果你公司跨越了Acrobat這幾個版本的年代, 就算放個AcroPDF控制項,有可能在某位使用者的電腦遇到一則訊息說: "無法從"AcroPDF.dll"載入AcroPDF控制項。您的AcroPDF版本可能比較舊......" 不知道這個DLL設計過程曾經發生過什麼樣的事情. 不過,如果用程式動態新增控制項,則可以避開這個問題. 至於舊版Pdf.PDFCtrl,這是Acrobat 1 到 6 版的PDF控制項,似乎調用了AcroRd32.exe, 所以,假如用 .LoadFile <file-path> 開了檔案,並且沒有任何方法能夠關閉檔案, 假如你又用 .LoadFile 開啟另一個檔案,或者是用 Controls.Remove 拿掉控制項, 會觸發背後的Acrobat Reader關閉的動作. 而開啟的PDF如果是新格式,內容含有 JavaScript,則Acrobat Reader好像是另外用網頁瀏覽器元件來開啟吧,所以此時會 顯示關閉訊息說: "有些檔案已經開在網頁瀏覽器裡了,假如您離開了就會關閉這個 應用程式. 您確定要離開嗎?" 然後有離開和取消二個按鈕. 如果這一段程式,你是拿同一個控制項開啟第二個檔案,並且當看到這個訊息時, 你選擇了離開AcroRd應用程式,就不會正常開啟第二個檔案. 這情況很好玩, 控制項正要打開檔案,但是不知情的使用者選擇離開應用程式,而使檔案關閉. 舊版本的這種情況,我覺得程式應該要寫成,如果你要依序開關好幾個PDF檔案, 要對每個檔案都開一個獨立的PDF控制項,要關閉檔案時是用 Controls.Remove. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.112.226.142