Menggabungkan PDF dalam direktori terstruktur menjadi satu PDF dengan bookmark

0

Saya memiliki banyak halaman yang dipindai dari laporan lama yang disimpan dalam struktur direktori berikut:

Report 1/
 contents.pdf
 execsummary.pdf
 chapter 1/
   page 1.pdf
   page 2.pdf
   page 3.pdf
 chapter 2/
   page 4.pdf
   page 5.pdf
   page 6.pdf

Saya ingin menghasilkan Report 1.pdfdari ini dengan bookmark yang cocok dengan struktur direktori. Bagaimana saya bisa melakukan ini?

Saya menggunakan Windows 10 dan saya tidak memiliki Adobe Acrobat tetapi saya memiliki Foxit Phantompdf.

cakar
sumber
Saya punya 20-30 laporan seperti itu
cakar
Hanya sedikit pemikiran: jika ada lebih dari 9 bab, urutannya mungkin menjadi aneh ("bab 2" lebih besar dari "bab 12" dalam sebagian besar implementasi penyortiran). Anda mungkin ingin mendefinisikan (atau setidaknya menyempurnakan) indeks secara manual.
Arjan
@Arjan: Bisakah Anda membuka kembali pertanyaan untuk sementara waktu? Saya menemukan solusi paling sederhana untuk masalah ini. Biarkan saya jawab.
cakar
1
@ claws: (1) Sering kali berguna untuk membaca layar. (a) Arjan tidak menutup pertanyaan. Dia (bersama dengan sekitar 700 orang lainnya) dapat memilih untuk membukanya kembali, tetapi dia tidak dapat melakukan semuanya sendiri. Mem-ping setiap pengguna dengan permintaan buka kembali tidak terlalu produktif. (B) Akan sangat membantu jika Anda telah mengedit pertanyaan Anda, seperti kotak tertutup menyarankan (dan seperti fixer1234 lakukan), untuk menjadikannya kandidat untuk dibuka kembali. (2) Pertanyaan Anda mendapatkan tiga suara Leave Closed . Itu masih dapat dibuka kembali, tetapi telah dihapus dari antrian dibuka kembali. Anda mungkin mendapatkan bantuan jika Anda bertanya pada meta atau dalam obrolan.
Scott
@Scott benar. Tapi saya tidak mengerti mengapa ini ditutup ...
Arjan

Jawaban:

1

Ini mungkin bukan solusi yang Anda cari:

Anda dapat menggunakan, misalnya, LaTeX untuk mencapai ini. Anda perlu membuat file TeX dengan cara lain, misalnya, bahasa pemrograman favorit Anda. Ini mengharuskan Anda untuk mengetahui cara memprogram, menggunakan LaTeX dan, tentu saja, menginstal alat yang diperlukan.

Jika Anda tertarik, saya bisa menguraikan hal ini dan menambahkan skrip sampel.

Sunting:

Saya membuat program FreeBASIC kecil (agak kotor tetapi melakukan pekerjaan) untuk menghasilkan file .tex. Ini kemudian dapat digunakan untuk menghasilkan file pdf akhir dengan, misalnya, Miktex dan TexnicCenter.

  • Unduh dan ekstrak kompiler FreeBASIC dari http://www.freebasic.net/ (saya menggunakan FreeBASIC-1.05.0-win64.zip).
  • Simpan kode di bawah ini sebagai, katakan code.bas, dan kompilasi dengan fbc.exe code.bas.
  • Seret dan lepas folder "Laporkan 1", "Laporkan 2" dll. Ke folder yang dapat dieksekusi baru code.exe. Ini akan menghasilkan file "Laporkan 1.tex", "Laporkan 2.tex" di folder masing-masing.
  • Unduh dan instal Miktex dari http://www.miktex.org/ (aktifkan instalasi paket langsung saat setup) dan TexnicCenter dari http://www.texniccenter.org/download/ dan buka file laporan di TexnicCenter . Saya tidak yakin apakah Anda perlu melakukan perubahan pada pengaturan default tetapi internet penuh dengan sumber daya untuk ini. Saat mengompilasinya LaTeX -> PDFharus menginstal paket yang hilang.

Sourcecode: Memproses secara eksplisit struktur folder dan nama file yang disebutkan dan tidak lebih.

    ' Drag and drop folders onto the executable in order to generate a .tex-file 
    ' which can be used to merge the pdfs in each passed folder using LaTeX.
    '

    #include "vbcompat.bi"

    sub expandEnviron__isFileOrFolder ( byref strPath as string )
        dim iLetter as integer
        if left(strPath,1)="%" then
            for iLetter=2 to len(strPath)
                if mid(strPath,iLetter,1)="%" then              
                    strPath=environ(mid(strPath,2,iLetter-2))+right(strPath,len(strPath)-iLetter)
                    exit for
                end if
            next iLetter
        end if
    end sub

    function isFileOrFolder ( byref strPath as string, byval expPath as string ptr = 0 ) as integer
        ' return value:
        '    0: path doesn't exist
        '    1: file
        '    2: folder
        '

        dim strDir as string = curdir

        dim as string strPathCopy
        dim as string ptr pPath
        if expPath then
            *expPath = strPath
            expandEnviron__isFileOrFolder(*expPath)
            pPath = expPath
        else
            strPathCopy = strPath
            expandEnviron__isFileOrFolder(strPathCopy)
            pPath = @strPathCopy
        end if

        if fileExists(*pPath) then
            return 1
        elseif ( chdir(*pPath) = 0 ) then
            chdir(strDir)
            return 2
        else
            return 0
        end if
    end function


    color(1,15)
    cls

    if command(1) = "" then
        print "Drag and drop folders onto the executable."
        sleep
        end
    end if

    dim as string basedir
    dim as string strPath = ""
    dim as integer i = 1
    ' Process all command line arguments i.e process all folders.
    while command(i) <> ""
        basedir = command(i)
        dim as string basedirName

        ' Make sure the argument is indeed a folder.
        if isFileOrFolder(basedir,@strPath) = 2 then
            if right(strPath,1) = "\" then basedir = left(strPath,len(strPath)-1)
            basedirName = right(basedir,len(basedir)-instrrev(basedir,"\"))
            print ""
            print baseDirName
            '
            ' Print some LaTeX commands.
            open basedir+"\"+baseDirName+".tex" for output as #1
            print #1, $"\documentclass{scrreprt}"
            print #1, $"\usepackage{grffile}"
            print #1, $"\usepackage{pdfpages}"
            print #1, $"\usepackage{bookmark}"
            print #1, $"\hypersetup{pageanchor=false}"
            print #1, $"\begin{document}"
            print #1, $"\pagestyle{empty}"
            print #1, $"\pagenumbering{gobble}"
            print #1, "%"
            '
            ' Process contents.pdf.
            dim as string tmp = basedir+"\contents.pdf"
            if isFileOrFolder(tmp) = 1 then
                print #1, $"\includepdf[pages=-]{contents.pdf}"
            else
                color(12,15):print chr(9);"missing contents.pdf":color(1,15)
            end if
            '
            ' Process execsummary.pdf.
            tmp = basedir+$"\execsummary.pdf"
            if isFileOrFolder(tmp) = 1 then
                print #1, $"\includepdf[pages=-]{execsummary.pdf}"
            else
                color(12,15):print chr(9);"missing execsummary.pdf":color(1,15)
            end if
            '
            ' Process all subfolders named "chapter 1", "chapter 2" etc.
            ' If "chapter 4" exists but "chapter 3" does not, then "chapter 4" and 
            ' all after that will be ignored.
            dim as integer chapter_link_cnt = 0
            dim as integer j = 1
            dim as string nextChapterDir = basedir+$"\chapter "+str(j)
            while isFileOrFolder(nextChapterDir) = 2
                print #1, "%"
                dim as integer k = 1
                '
                ' Process all files named "page 1", "page 2" etc.
                dim as string nextPage = nextChapterDir + $"\page "+str(k)+".pdf"
                while isFileOrFolder(nextPage) = 1
                    if k = 1 then
                        chapter_link_cnt += 1
                        print #1, $"\includepdf[link,linkname=l";str(chapter_link_cnt); _
                            ",pages=-]{chapter ";str(j);"/page ";str(k);".pdf}"
                        print #1, $"\bookmark[dest=l";str(chapter_link_cnt); _
                            ".1]{chapter ";str(j);"}"
                    else
                        print #1, $"\includepdf[pages=-]{chapter ";str(j);"/page ";str(k);".pdf}"
                    end if
                    k += 1
                    nextPage = nextChapterDir + $"\page "+str(k)+".pdf"
                wend
                j += 1
                nextChapterDir = basedir+$"\chapter "+str(j)
            wend
            '
            print #1, $"\end{document}"
            close #1
        else
            print ""
            color(12,15):print "Error (not a folder): ";command(i):color(1,15)
        end if
        i += 1
    wend

    print ""
    print ""
    print "Done."
    sleep

Jika Anda ingin menggunakan bahasa yang berbeda (mungkin bisa dilakukan dengan skrip powershell), berikut adalah contoh file tex:

\documentclass{scrreprt}
\usepackage{grffile}
\usepackage{pdfpages}
\usepackage{bookmark}
\hypersetup{pageanchor=false}
\begin{document}
\pagestyle{empty}
\pagenumbering{gobble}
%
\includepdf[pages=-]{contents.pdf}
\includepdf[pages=-]{execsummary.pdf}
%
\includepdf[link,linkname=l1,pages=-]{chapter 1/page 1.pdf}
\bookmark[dest=l1.1]{chapter 1}
\includepdf[pages=-]{chapter 1/page 2.pdf}
%
\includepdf[link,linkname=l2,pages=-]{chapter 2/page 1.pdf}
\bookmark[dest=l2.1]{chapter 2}
\includepdf[pages=-]{chapter 2/page 2.pdf}
%
\includepdf[link,linkname=l3,pages=-]{chapter 3/page 1.pdf}
\bookmark[dest=l3.1]{chapter 3}
\includepdf[pages=-]{chapter 3/page 2.pdf}
\includepdf[pages=-]{chapter 3/page 3.pdf}
\includepdf[pages=-]{chapter 3/page 4.pdf}
\end{document}
nx105
sumber
Ya silahkan. Bisakah Anda memperluas jawaban Anda?
cakar
1) Anda mungkin harus menyesuaikan kode FreeBASIC ke pengaturan yang tepat. 2) Saya juga tidak yakin bagaimana Anda ingin menggabungkan file PDF (tambahkan judul bab? Dll.). Jadi, Anda mungkin perlu menyesuaikan ini juga.
nx105
0

PDFsam Basic melakukan apa yang Anda inginkan secara gratis

http://www.pdfsam.org/

https://sourceforge.net/projects/pdfsam/

Menepuk
sumber
1
Apakah PDF sam melakukan struktur bookmark? Itu sepertinya bagian yang cukup kritis dari pertanyaan
Journeyman Geek
mereka mengatakan do tetapi tidak pernah mencoba sendiri; Saya pikir apa yang sebenarnya mereka lakukan adalah menggabungkan setiap bookmark pdf individu ke dalam yang dikompilasi. Cobalah saja.
Pat
Saya mencoba pdfsam tetapi sayangnya itu tidak melayani kebutuhan yang disebutkan dalam pertanyaan ini. Anda dapat menjawabnya.
cakar