Программное объединение PDF-файлов с сохранением структуры закладок «Объединить файлы ...»? - PullRequest
5 голосов
/ 01 апреля 2011

Я изначально спрашивал об этом на форумах Adobe, но пока не получил никаких ответов.

Мне необходимо еженедельно объединять множество (более 100) PDF-файлов в один отчет, и до сих пор я выполнял этот процесс вручную, выбрав файлы, щелкнув правой кнопкой мыши и выбрав «Объединить». поддерживаемые файлы в Acrobat ". То, что я хотел бы сделать, это воспроизвести этот точно такой же процесс программно (желательно в Excel / VBA, но команды C # или Batch являются приемлемыми альтернативами). В настоящее время у меня есть код, который будет объединять файлы 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-файла в другой, но это не приводит к созданию структуры закладок, которую я ищу, и при этом не позволяет мне манипулировать иерархией закладок для создания структуры закладок, которую я ищу.

У кого-нибудь есть идеи, как это сделать? Любая помощь будет принята с благодарностью!

Ответы [ 5 ]

2 голосов
/ 02 апреля 2011

Это был настоящий ад, чтобы работать, поэтому я рад поделиться тем, что у меня есть. Это было адаптировано из кода, который я нашел здесь , и будет объединять файлы и ставить закладки в каждой точке объединения:

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
1 голос
/ 01 сентября 2011

Библиотека Docotic.Pdf может объединять PDF-файлы при сохранении структуры контуров (закладок).

Ничего особенного делать не следует.Вы просто добавляете все документы один за другим, и все.

using (PdfDocument pdf = new PdfDocument())
{
    string[] filesToMerge = ...
    foreach (string file in filesToMerge)
        pdf.Append(file);

    pdf.Save("merged.pdf");
}

Отказ от ответственности: я работаю в Bit Miracle, продавце библиотеки.

1 голос
/ 05 апреля 2011

Используйте iText # (http://www.itextpdf.com/). imho, это один из лучших PDF-инструментов в мире. Код для выполнения (приблизительно) того, что вы хотите, можно найти здесь http://java -x.blogspot.com / 2006 /11/merge-pdf-files-with-itext.html Не беспокойтесь, что все примеры говорят о Java, классы и функции одинаковы в .NET

НТН

Mario

1 голос
/ 01 апреля 2011

Вам может понадобиться коммерческий инструмент, такой как Aspose.Pdf.Kit , чтобы получить тот уровень гибкости, который вам нужен.Он поддерживает конкатенацию файлов и манипуляции с закладками.

Существует 30-дневная неограниченная пробная версия, поэтому вы не можете проиграть, кроме времени, если оно не работает для вас.

0 голосов
/ 02 апреля 2011

Acrobat SDK поддерживает , что позволяет создавать и читать закладки. Проверьте справочник по SDK API:

PDDocGetBookmarkRoot()

PDBookmark* (AddChild, AddNewChild, GetNext, GetPrev... lots of functions in there)

Если диалоговое окно «Объединить файлы» не дает необходимого вам управления, создайте свой собственный диалог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...