У меня есть много отсканированных страниц старых отчетов, хранящихся в следующей структуре каталогов:

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

Я хочу создать Report 1.pdf из них с закладками, соответствующими структуре каталогов. Как я могу это сделать?

У меня Windows 10, и у меня нет Adobe Acrobat, но у меня есть Foxit Phantompdf.

2 ответа2

1

Вероятно, это не то решение, которое вы ищете:

Вы можете использовать, например, LaTeX для достижения этой цели. Вам нужно сгенерировать TeX-файл другим способом, например, вашим любимым языком программирования. Для этого вам необходимо уметь программировать, использовать LaTeX и, конечно же, устанавливать необходимые инструменты.

Если вам интересно, я могу уточнить это и добавить примеры сценариев.

Редактировать:

Я создал небольшую программу FreeBASIC (немного грязную, но выполняет свою работу) для генерации .tex-файла. Затем его можно использовать для генерации окончательного PDF-файла, например, с помощью Miktex и TexnicCenter.

  • Загрузите и извлеките компилятор FreeBASIC с http://www.freebasic.net/ (я использовал FreeBASIC-1.05.0-win64.zip).
  • Сохраните приведенный ниже код как, скажем, code.bas , и скомпилируйте его с помощью fbc.exe code.bas .
  • Перетащите папки "Отчет 1", "Отчет 2" и т.д. На новый исполняемый файл code.exe . Это создаст файлы «Report 1.tex», «Report 2.tex» в соответствующей папке.
  • Загрузите и установите Miktex с http://www.miktex.org/ (включить установку пакетов на лету во время установки) и TexnicCenter с http://www.texniccenter.org/download/ и откройте файлы отчетов в TexnicCenter , Я не уверен, нужно ли вам вносить какие-либо изменения в настройки по умолчанию, но Интернет полон ресурсов для этого. При компиляции LaTeX -> PDF он должен установить недостающие пакеты.

Исходный код: явно обрабатывает упомянутую структуру папок и имена файлов и ничего более.

    ' 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

Если вы хотите использовать другой язык (возможно, это можно сделать с помощью скрипта powershell), вот пример текстового файла:

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

PDFsam Basic делает то, что вы хотите бесплатно

http://www.pdfsam.org/

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .