整理一下有關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