作者yauhh (哟)
看板Visual_Basic
标题[VB6 ] Acrobat & PDF
时间Wed Jan 18 01:35:42 2012
整理一下有关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