Kết hợp các tệp PDF trong các thư mục có cấu trúc thành một tệp PDF với dấu trang


0

Tôi có rất nhiều trang được quét các báo cáo cũ được lưu trữ trong cấu trúc thư mục sau:

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

Tôi muốn tạo Report 1.pdftừ những cái này với dấu trang khớp với cấu trúc thư mục. Tôi có thể làm cái này như thế nào?

Tôi đang dùng Windows 10 và tôi không có Adobe Acrobat nhưng tôi có Foxit Phantompdf.


Tôi có 20-30 báo cáo như vậy
móng vuốt

Chỉ là một suy nghĩ nhỏ: nếu có hơn 9 chương, thứ tự có thể trở nên kỳ lạ ("chương 2" lớn hơn "chương 12" trong hầu hết các triển khai sắp xếp). Bạn có thể muốn xác định (hoặc ít nhất là tinh chỉnh) chỉ mục theo cách thủ công sau đó.
Arjan

@Arjan: Bạn có thể mở lại câu hỏi một lúc không? Tôi phát hiện ra một giải pháp đơn giản nhất cho vấn đề này. Hãy để tôi trả lời nó.
móng vuốt

1
@claws: (1) Việc đọc màn hình thường rất hữu ích. (a) Arjan không đóng câu hỏi. Anh ta (cùng với khoảng 700 người khác) có thể bỏ phiếu để mở lại, nhưng anh ta không thể tự làm tất cả. Ping người dùng cá nhân với các yêu cầu mở lại không thực sự hiệu quả. (b) Sẽ rất hữu ích nếu bạn đã chỉnh sửa câu hỏi của mình, vì hộp kín gợi ý (và như fixer1234 đã làm), để biến nó thành một ứng cử viên để mở lại. (2) Câu hỏi của bạn đã nhận được ba phiếu kín . Nó vẫn có thể được mở lại, nhưng nó đã bị xóa khỏi hàng đợi mở lại. Bạn có thể nhận được một số trợ giúp nếu bạn hỏi về meta hoặc trong trò chuyện.
Scott

@ Hủy là đúng. Nhưng tôi không hiểu tại sao điều này bị đóng cửa ...
Arjan

Câu trả lời:


1

Đây có lẽ không phải là giải pháp bạn đang tìm kiếm:

Bạn có thể sử dụng, ví dụ, LaTeX để đạt được điều này. Bạn cần tạo tệp TeX theo cách khác, ví dụ: ngôn ngữ lập trình yêu thích của bạn. Điều này đòi hỏi bạn phải biết cách lập trình, sử dụng LaTeX và, tất nhiên, cài đặt các công cụ cần thiết.

Trong trường hợp bạn quan tâm, tôi có thể giải thích về điều này và thêm các tập lệnh mẫu.

Chỉnh sửa:

Tôi đã tạo một chương trình FreeBASIC nhỏ (hơi bẩn nhưng thực hiện công việc) để tạo tệp .tex. Điều này sau đó có thể được sử dụng để tạo tệp pdf cuối cùng với, ví dụ, Miktex và TexnicCenter.

  • Tải xuống và trích xuất trình biên dịch FreeBASIC từ http://www.freebasic.net/ (Tôi đã sử dụng FreeBASIC-1.05.0-win64.zip).
  • Lưu mã dưới đây, như code.bas, và biên dịch nó với fbc.exe code.bas.
  • Kéo và thả các thư mục "Báo cáo 1", "Báo cáo 2", v.v. vào tệp thực thi mới code.exe. Điều này sẽ tạo ra các tệp "Báo cáo 1.tex", "Báo cáo 2.tex" trong thư mục tương ứng của chúng.
  • Tải xuống và cài đặt Miktex từ http://www.miktex.org/ (cho phép cài đặt nhanh chóng các gói trong khi thiết lập) và TexnicCenter từ http://www.texniccenter.org/doad/ và mở tệp báo cáo trong TexnicCenter . Tôi không chắc chắn nếu bạn cần thực hiện bất kỳ thay đổi nào đối với cài đặt mặc định nhưng internet có đầy đủ tài nguyên cho việc này. Khi biên dịch LaTeX -> PDFnên cài đặt các gói còn thiếu.

Sourcecode: Xử lý rõ ràng cấu trúc thư mục và tên tệp được đề cập và không có gì khác.

    ' 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

Trong trường hợp bạn muốn sử dụng một ngôn ngữ khác (có lẽ nó có thể được thực hiện bằng tập lệnh powershell), đây là một tệp tex mẫu:

\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}

Vâng làm ơn. Bạn có thể vui lòng mở rộng câu trả lời của bạn?
móng vuốt

1) Bạn có thể phải điều chỉnh mã FreeBASIC để thiết lập chính xác. 2) Tôi cũng không chắc chắn về cách bạn muốn hợp nhất các tệp PDF (thêm tiêu đề chương? V.v.). Vì vậy, bạn có thể cần phải điều chỉnh này là tốt.
nx105

0

PDFsam Basic làm những gì bạn muốn miễn phí

http://www.pdfsam.org/

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


1
PDF sam có làm cấu trúc bookmark không? Đó có vẻ là một phần khá quan trọng của câu hỏi
Journeyman Geek

họ nói làm nhưng không bao giờ thử bản thân mình; Tôi nghĩ những gì họ thực sự làm là kết hợp mọi dấu trang pdf riêng lẻ vào một cái được biên dịch. Chỉ cần cung cấp cho nó một thử.
Pat

Tôi đã thử pdfsam nhưng thật đáng buồn là nó không phục vụ các nhu cầu được đề cập trong câu hỏi này. Bạn có thể câu trả lời của bạn.
móng vuốt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.