【问题标题】:Merge PDF files command line with bookmarks将 PDF 文件命令行与书签合并
【发布时间】:2017-03-29 09:14:00
【问题描述】:

我正在尝试完成一项将 PDF 文件合并为一个 PDF 的简单任务。我希望生成的 PDF 文件对文件名中的每个文件都有书签。最好我想为此提供一个免费的解决方案。

我在 Windows 系统上,想从命令行执行此操作,甚至从 MSSQL 执行此操作更好。

问题是我将使用 Crystal Reports 从 ERP 系统创建订单的 PDF 文件。存储过程将创建这些 PDF 文件。之后,我想获取选定的 PDF 并创建一个新的合并 PDF,合并的 PDF 应该将每个订单号(来自文件名)作为书签。这样,如果您正在搜索特定的订单号,您就可以轻松跳转到订单号。

正如我所说的最好是免费的解决方案,如果不可用,我准备用例如 C# 或类似代码编写我自己的合并程序。

【问题讨论】:

  • 你走了多远?哪些位有效?你卡在哪些位?
  • 我已经用谷歌搜索了合并 PDF 文件以寻找命令行工具的解决方案,但没有找到任何解决方案。我正处于完成单个 PDF 文件的地步,并且无法真正决定是否应该尝试制作自己的程序来处理合并,或者是否已经有这样做的东西。我想这就是我卡住的地方。
  • 需要合并吗?您不能:a) 导出单个 PDF b) 重复使用相同的过程来导出合并的 PDF?

标签: sql-server pdf command-line merge bookmarks


【解决方案1】:

我认为您至少需要 Adob​​e Acrobat。或者,如果您没有该文件并且不想为此付费,则可以将所有 PDF 转换为 TXT 文件,并合并所有 TXT 文件。这听起来有点麻烦,但实际上,这是最简单的事情。 . .可能是 。 . .是将所有这些TXT文件转换为Excel文件,然后合并它们。这应该不难。这是一个将所有 TXT 文件转换为 Excel 文件的脚本。

Private Declare Function SetCurrentDirectoryA Lib _
        "kernel32" (ByVal lpPathName As String) As Long

Public Function ChDirNet(szPath As String) As Boolean
'based on Rob Bovey's code
    Dim lReturn As Long
    lReturn = SetCurrentDirectoryA(szPath)
    ChDirNet = CBool(lReturn <> 0)
End Function

Sub Get_TXT_Files()
'For Excel 2000 and higher
    Dim Fnum As Long
    Dim mysheet As Worksheet
    Dim basebook As Workbook
    Dim TxtFileNames As Variant
    Dim QTable As QueryTable
    Dim SaveDriveDir As String
    Dim ExistFolder As Boolean

    'Save the current dir
    SaveDriveDir = CurDir

    'You can change the start folder if you want for
    'GetOpenFilename,you can use a network or local folder.
    'For example ChDirNet("C:\your_path_here\")
    'It now use Excel's Default File Path

    ExistFolder = ChDirNet("C:\your_path_here\\Text\")
    If ExistFolder = False Then
        MsgBox "Error changing folder"
        Exit Sub
    End If

    TxtFileNames = Application.GetOpenFilename _
    (filefilter:="TXT Files (*.txt), *.txt", MultiSelect:=True)

    If IsArray(TxtFileNames) Then

        On Error GoTo CleanUp

        With Application
            .ScreenUpdating = False
            .EnableEvents = False
        End With

        'Add workbook with one sheet
        Set basebook = Workbooks.Add(xlWBATWorksheet)

        'Loop through the array with txt files
        For Fnum = LBound(TxtFileNames) To UBound(TxtFileNames)

            'Add a new worksheet for the name of the txt file
            Set mysheet = Worksheets.Add(After:=basebook. _
                                Sheets(basebook.Sheets.Count))
            On Error Resume Next
            mysheet.Name = Right(TxtFileNames(Fnum), Len(TxtFileNames(Fnum)) - _
                                    InStrRev(TxtFileNames(Fnum), "\", , 1))
            On Error GoTo 0

            With ActiveSheet.QueryTables.Add(Connection:= _
                        "TEXT;" & TxtFileNames(Fnum), Destination:=Range("A1"))
                .TextFilePlatform = xlWindows
                .TextFileStartRow = 1

                'This example use xlDelimited
                'See a example for xlFixedWidth below the macro
                .TextFileParseType = xlDelimited

                'Set your Delimiter to true
                .TextFileTabDelimiter = True
                .TextFileSemicolonDelimiter = False
                .TextFileCommaDelimiter = False
                .TextFileSpaceDelimiter = False

                'Set the format for each column if you want (Default = General)
                'For example Array(1, 9, 1) to skip the second column
                .TextFileColumnDataTypes = Array(1, 9, 1)

                'xlGeneralFormat  General          1
                'xlTextFormat     Text             2
                'xlMDYFormat      Month-Day-Year   3
                'xlDMYFormat      Day-Month-Year   4
                'xlYMDFormat      Year-Month-Day   5
                'xlMYDFormat      Month-Year-Day   6
                'xlDYMFormat      Day-Year-Month   7
                'xlYDMFormat      Year-Day-Month   8
                'xlSkipColumn     Skip             9

                ' Get the data from the txt file
                .Refresh BackgroundQuery:=False
            End With
        ActiveSheet.QueryTables(1).Delete
        Next Fnum

        'Delete the first sheet of basebook
        On Error Resume Next
        Application.DisplayAlerts = False
        basebook.Worksheets(1).Delete
        Application.DisplayAlerts = True
        On Error GoTo 0

CleanUp:

        ChDirNet SaveDriveDir

        With Application
            .ScreenUpdating = True
            .EnableEvents = True
        End With
    End If
End Sub

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 2019-11-17
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多