gpt4 book ai didi

c# - 在保持 "Combine files..."书签结构的同时以编程方式合并 PDF?

转载 作者:太空狗 更新时间:2023-10-29 23:18:20 25 4
gpt4 key购买 nike

我最初是在 Adob​​e 的论坛上提出这个问题的,但还没有收到任何回复。

我必须每周将一组(100 多个)PDF 文件合并到一个报告中,到目前为止,我一直通过选择文件、右键单击并选择“合并”来手动完成该过程Acrobat 中支持的文件”。我想做的是以编程方式复制这个完全相同的过程(最好是在 Excel/VBA 中,但 C# 或批处理命令是可接受的替代方案)。我目前有将合并 pdf 文件的代码,但它不会像“在 Acrobat 中合并支持的文件”那样保持书签结构。

换句话说,假设我有三个名为“A.pdf”、“B.pdf”和“C.pdf”的文件,每个文件包含两个名为“Bkmrk 1”和“Bkmrk 2”的书签。我想以编程方式将这三个文件组合成一个文件,该文件具有 9 个书签,结构如下所示:

A
Bkmrk 1
Bkmrk 2
B
Bkmrk 1
Bkmrk 2
C
Bkmrk 1
Bkmrk 2

我最初尝试通过 Acrobat SDK 自动执行该过程,但据我所知,Acrobat SDK 不允许程序与执行“合并文件”菜单选项时出现的对话框进行交互,因此没有工作。我还尝试了以编程方式将页面从一个 pdf 文件插入到另一个 pdf 文件的选项,但这不会产生我正在寻找的书签结构,也不会让我操纵书签层次结构来创建我正在寻找的书签结构。

有没有人知道如何做到这一点?任何帮助将不胜感激!

最佳答案

开始工作简直是 hell ,所以我很乐意分享我所拥有的。这是改编 self 发现的代码 here ,并会合并文件,并在每个合并点放置书签:

Private mlngBkmkCounter     As Long

Public Sub updfConcatenate(pvarFromPaths As Variant, _
pstrToPath As String)

Dim origPdfDoc As Acrobat.CAcroPDDoc
Dim newPdfDoc As Acrobat.CAcroPDDoc
Dim lngNewPageCount As Long
Dim lngInsertPage As Long
Dim i As Long

Set origPdfDoc = CreateObject("AcroExch.PDDoc")
Set newPdfDoc = CreateObject("AcroExch.PDDoc")
mlngBkmkCounter = 0

'set the first file in the array as the "new"'
If newPdfDoc.Open(pvarFromPaths(LBound(pvarFromPaths))) = True Then
updfInsertBookmark "Test Start", lngInsertPage, , newPdfDoc
mlngBkmkCounter = 1

For i = LBound(pvarFromPaths) + 1 To UBound(pvarFromPaths)
Application.StatusBar = "Merging " & pvarFromPaths(i) & "..."
If origPdfDoc.Open(pvarFromPaths(i)) = True Then
lngInsertPage = newPdfDoc.GetNumPages
newPdfDoc.InsertPages lngInsertPage - 1, origPdfDoc, 0, origPdfDoc.GetNumPages, False
updfInsertBookmark "Test " & i, lngInsertPage, , newPdfDoc
origPdfDoc.Close
mlngBkmkCounter = mlngBkmkCounter + 1
End If
Next i
newPdfDoc.Save PDSaveFull, pstrToPath
End If

ExitHere:
Set origPdfDoc = Nothing
Set newPdfDoc = Nothing
Application.StatusBar = False
Exit Sub

End Sub

插入书签代码...您需要从每个文档中排列您的书签,然后设置它们

Public Sub updfInsertBookmark(pstrCaption As String, _
plngPage As Long, _
Optional pstrPath As String, _
Optional pMyPDDoc As Acrobat.CAcroPDDoc, _
Optional plngIndex As Long = -1, _
Optional plngParentIndex As Long = -1)

Dim MyPDDoc As Acrobat.CAcroPDDoc
Dim jso As Object
Dim BMR As Object
Dim arrParents As Variant
Dim bkmChildsParent As Object
Dim bleContinue As Boolean
Dim bleSave As Boolean
Dim lngIndex As Long

If pMyPDDoc Is Nothing Then
Set MyPDDoc = CreateObject("AcroExch.PDDoc")
bleContinue = MyPDDoc.Open(pstrPath)
bleSave = True
Else
Set MyPDDoc = pMyPDDoc
bleContinue = True
End If

If plngIndex > -1 Then
lngIndex = plngIndex
Else
lngIndex = mlngBkmkCounter
End If

If bleContinue = True Then
Set jso = MyPDDoc.GetJSObject
Set BMR = jso.bookmarkRoot

If plngParentIndex > -1 Then
arrParents = jso.bookmarkRoot.Children
Set bkmChildsParent = arrParents(plngParentIndex)
bkmChildsParent.createchild pstrCaption, "this.pageNum= " & plngPage, lngIndex

Else
BMR.createchild pstrCaption, "this.pageNum= " & plngPage, lngIndex
End If

MyPDDoc.SetPageMode 3 '3 — display using bookmarks'

If bleSave = True Then
MyPDDoc.Save PDSaveIncremental, pstrPath
MyPDDoc.Close
End If
End If

ExitHere:
Set jso = Nothing
Set BMR = Nothing
Set arrParents = Nothing
Set bkmChildsParent = Nothing
Set MyPDDoc = Nothing
End Sub

使用:

Public Sub uTest_pdfConcatenate()

Const cPath As String = "C:\MyPath\"

updfConcatenate Array(cPath & "Test1.pdf", _
cPath & "Test2.pdf", _
cPath & "Test3.pdf"), "C:\Temp\TestOut.pdf"
End Sub

关于c# - 在保持 "Combine files..."书签结构的同时以编程方式合并 PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5514176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com