2

我继承了一个 VB6 程序,它使用 Crystal Reports 8.5 来运行报表,然后将输出导出为 PDF。然后,它使用 Adob​​e Acrobat 5.0 类型库将生成的 PDF 合并为单个 PDF 文档。我们的问题是我们需要升级 Acrobat 5.0 类型库,但最新版本的 Acrobat 似乎没有提供适用于 VB6 的类型库。有人知道 VB6 支持的最新版本的 Acrobat 吗?另外,是否有人对如何在不将整个应用程序升级到.Net 的情况下升级它有任何建议?提前感谢您提供的任何帮助。

4

2 回答 2

0

我会掏出钱来 pdftk。手册页中的示例:

将两个或多个 PDF 合并到一个新文档中

pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf

请注意,如果您的应用是分布式的且非 GPL,则您需要为其提供商业许可,但目前只需 24 美元。

于 2012-11-08T16:17:11.797 回答
0

15 年前我也有同样的要求,并在 vb6 中创建了一个 mod 来做到这一点:

modMergePDF

公共功能 MergePDFFiles

我最近更新了处理 Acrobat 10.0 类型库的代码,因此您需要安装截至 2020 年 8 月 1 日的最新版本 Acrobat DC Pro,以...

  1. 使用下面的代码
  2. 使用编译好的 MergePDF.exe

此外,该模组使用许多 PDF 的文件名添加书签,并使用清理代码来删除一些难看的文件名(如果您需要将文件名清理为书签名称,您可能需要详细说明),进入单个pdf文件。

还包括一个生成批处理文件代码的功能:

公共函数 BuildBatchFileCode

在命令行中调用 MergePDF.exe,该命令行由许多 pdf 目录和单个 pdf 合并文件目录和文件名组成。您还可以传入一个标志以对 CaseSensitive 进行排序(任何大写的文件名都将按小写排序),并且您可以传入另一个标志以维护书签名称中的 .pdf 扩展名。

在 git 上找到 MergePDF.exe 以及此处的所有支持代码:

https://github.com/Brad-Skidmore/MergePDF

注意:错误处理参考 goUtil.utErrorLog 你也可以在 GitHub 上找到,或者你可以用你自己的错误处理替换它。这是 Mod 代码:modMergePDF

'  http://www.xlsure.com 2020.07.30
' *********************************************************************
'  You are free to use this code within your own applications, but you
'  are expressly forbidden from selling or otherwise distributing this
'  source code without prior written consent.
'  Merge PDF Files - modMergePDF
' *********************************************************************

Option Explicit
'PDF documents must be declared in general declaration space and not local!
Private moMainDoc As Acrobat.AcroPDDoc
Private moTempDoc As Acrobat.AcroPDDoc

Private Property Get msClassName() As String
    msClassName = "modMergePDF"
End Property

Public Function MergePDFFiles(psRawPDFFilesDir As String, _
                                psSinglePDFOutputDir As String, _
                                psSinglePDFOutputName As String, _
                                Optional ByVal pbRemovePdfExtFromBookMark As Boolean = True, _
                                Optional pbCaseSensitiveSort As Boolean = False, _
                                Optional ByVal pbShowError As Boolean = False) As Boolean
    On Error GoTo EH
    
    Dim bFirstDoc As Boolean
    Dim sRawPDFFilesDir As String
    Dim sSinglePDFOutputDir As String
    Dim sSinglePDFOutputName As String
    Dim saryFileSort() As String
    Dim sBMName As String
    'Track pos of things
    Dim lBMPageNo As Long
    Dim lPos As Long
    Dim lFile As Long
    Dim lInsertPageAfter As Long
    Dim lNumPages As Long
    Dim lRet As Long
    'Need to use Adobe internal Java Object
    'in order to Add Book marks
    Dim oJSO As Object 'JavaScript Object
    Dim oBookMarkRoot As Object
    'File I/O
    Dim oFolder As Scripting.Folder
    Dim oFile As Scripting.File
    Dim oFSO As Scripting.FileSystemObject
    
    
    sRawPDFFilesDir = psRawPDFFilesDir
    'ensure backslash for the 2 b merged PDF files directory
    If StrComp(Right(sRawPDFFilesDir, 1), "\", vbBinaryCompare) <> 0 Then
        sRawPDFFilesDir = sRawPDFFilesDir & "\"
        psRawPDFFilesDir = sRawPDFFilesDir
    End If

    sSinglePDFOutputDir = psSinglePDFOutputDir
    sSinglePDFOutputName = psSinglePDFOutputName
    
    'ensure .pdf for the PDFOutputName (If it's CAP .PDF should be okay)
    If StrComp(Right(sSinglePDFOutputName, 4), ".pdf", vbTextCompare) <> 0 Then
        sSinglePDFOutputName = sSinglePDFOutputName & ".pdf"
        psSinglePDFOutputName = sSinglePDFOutputName
    End If

    Set oFSO = New Scripting.FileSystemObject
    
    Set oFolder = oFSO.GetFolder(sRawPDFFilesDir)
    
    bFirstDoc = True

    If oFolder.Files.Count = 0 Then
        Exit Function
    End If
    
    'Because the FSO folder files collection does not allow for
    'Native sorting, need to plug all the files into an array and sort that motha
    ReDim saryFileSort(1 To oFolder.Files.Count)
    lFile = 0
    For Each oFile In oFolder.Files
        lFile = lFile + 1
        saryFileSort(lFile) = oFile.Name
    Next
    
    'Once they is all in der sor the array
    'Sort is Case Sensitive
    If pbCaseSensitiveSort Then
        goUtil.utBubbleSort saryFileSort
    End If
    
    For lFile = 1 To UBound(saryFileSort, 1)
        If LCase(Right(saryFileSort(lFile), 4)) = ".pdf" Then
            If bFirstDoc Then
                bFirstDoc = False
                Set moMainDoc = CreateObject("AcroExch.PDDoc") 'New AcroPDDoc
                lRet = moMainDoc.Open(sRawPDFFilesDir & saryFileSort(lFile))
                Set oJSO = moMainDoc.GetJSObject
                Set oBookMarkRoot = oJSO.BookMarkRoot
                sBMName = saryFileSort(lFile)
                lPos = InStr(1, sBMName, "_{", vbBinaryCompare)
                If lPos > 0 Then
                    sBMName = left(sBMName, lPos - 1) & ".pdf"
                End If
                If pbRemovePdfExtFromBookMark Then
                    sBMName = Replace(sBMName, ".pdf", vbNullString, , , vbTextCompare)
                End If
                lRet = oBookMarkRoot.CreateChild(sBMName, "this.pageNum =0", lFile - 1)
            Else
                Set moTempDoc = CreateObject("AcroExch.PDDoc") 'New AcroPDDoc
                lRet = moTempDoc.Open(sRawPDFFilesDir & saryFileSort(lFile))
                'get the Book mark page number before the actual instert of new pages
                lBMPageNo = moMainDoc.GetNumPages
                lInsertPageAfter = lBMPageNo - 1
                lNumPages = moTempDoc.GetNumPages
                lRet = moMainDoc.InsertPages(lInsertPageAfter, moTempDoc, 0, lNumPages, 0)
                moTempDoc.Close
                If lRet = 0 Then
                    sBMName = saryFileSort(lFile)
                    lPos = InStr(1, sBMName, "_{", vbBinaryCompare)
                    If lPos > 0 Then
                        sBMName = left(sBMName, lPos - 1) & ".pdf"
                    End If
                    'Need to copy the errored document over to be included in the enitre document
                    goUtil.utCopyFile sRawPDFFilesDir & saryFileSort(lFile), sSinglePDFOutputDir & "\" & sBMName
                    sBMName = "PDF Insert Page Error_" & sBMName
                Else
                    sBMName = saryFileSort(lFile)
                    lPos = InStr(1, sBMName, "_{", vbBinaryCompare)
                    If lPos > 0 Then
                        sBMName = left(sBMName, lPos - 1) & ".pdf"
                    End If
                End If
                If pbRemovePdfExtFromBookMark Then
                    sBMName = Replace(sBMName, ".pdf", vbNullString, , , vbTextCompare)
                End If
                lRet = oBookMarkRoot.CreateChild(sBMName, "this.pageNum =" & lBMPageNo, lFile - 1)
            End If
        End If
    Next
    
    lRet = moMainDoc.Save(1, sSinglePDFOutputDir & "\" & sSinglePDFOutputName)
    moMainDoc.Close
    
    MergePDFFiles = True
    
CLEAN_UP:
    Set oFolder = Nothing
    Set oFile = Nothing
    Set oFSO = Nothing
    Set oBookMarkRoot = Nothing
    Set oJSO = Nothing
    Set moMainDoc = Nothing
    Set moTempDoc = Nothing
    
    Exit Function
EH:
    goUtil.utErrorLog Err, App.EXEName, msClassName, "Public Function MergePDFFiles", pbShowError
End Function

Public Function BuildBatchFileCode(psRawPDFFilesDir As String, _
                                    psSinglePDFOutputDir As String, _
                                    psSinglePDFOutputName As String, _
                                    pbRemovePdfExtFromBookMark As Boolean, _
                                    pbCaseSensitiveSort As Boolean) As String
    
    On Error GoTo EH
    
    Dim sRawPDFFilesDir As String: sRawPDFFilesDir = psRawPDFFilesDir
    Dim sSinglePDFOutputDir As String: sSinglePDFOutputDir = psSinglePDFOutputDir
    Dim sSinglePDFOutputName As String: sSinglePDFOutputName = psSinglePDFOutputName
    Dim bRemovePdfExtFromBookMark As Boolean: bRemovePdfExtFromBookMark = pbRemovePdfExtFromBookMark

    'ensure backslash for the 2 b merged PDF files directory
    If StrComp(Right(sRawPDFFilesDir, 1), "\", vbBinaryCompare) <> 0 Then
        sRawPDFFilesDir = sRawPDFFilesDir & "\"
        psRawPDFFilesDir = sRawPDFFilesDir
    End If

    'ensure .pdf for the PDFOutputName (If it's CAP .PDF should be okay)
    If StrComp(Right(sSinglePDFOutputName, 3), ".pdf", vbTextCompare) <> 0 Then
        sSinglePDFOutputName = sSinglePDFOutputName & ".pdf"
        psSinglePDFOutputName = sSinglePDFOutputName
    End If
    
    Dim sCommandLine As String
    
    sCommandLine = "RawPDFFilesDir|" & sRawPDFFilesDir _
                    & "|SinglePDFOutputDir|" & sSinglePDFOutputDir _
                    & "|SinglePDFOutputName|" & sSinglePDFOutputName _
                    & "|RemovePdfExtFromBookMark|" & CStr(bRemovePdfExtFromBookMark) _
                    & "|CaseSensitiveSort|" & CStr(pbCaseSensitiveSort)

    BuildBatchFileCode = """" & App.Path & "\" & App.EXEName & ".exe"" """ & sCommandLine
    Exit Function
EH:
    goUtil.utErrorLog Err, App.EXEName, msClassName, "Public Function BuildBatchFileCode"
End Function
于 2020-08-01T21:45:25.027 回答