Combinando PDFs em diretórios estruturados em um único PDF com marcadores

0

Tenho muitas páginas digitalizadas de relatórios antigos armazenados na seguinte estrutura de diretórios:

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

Eu quero gerar Report 1.pdf destes com marcadores correspondentes à estrutura de diretórios. Como posso fazer isso?

Estou no Windows 10 e não tenho o Adobe Acrobat, mas tenho o Foxit Phantompdf.

    
por claws 11.07.2016 / 14:26

2 respostas

1

Esta provavelmente não é a solução que você está procurando:

Você pode usar, por exemplo, o LaTeX para conseguir isso. Você precisa gerar o arquivo TeX de outra forma, por exemplo, sua linguagem de programação favorita. Isso requer que você saiba como programar, use o LaTeX e, é claro, instale as ferramentas necessárias.

Caso você esteja interessado, posso elaborar isso e adicionar scripts de amostra.

Editar:

Eu fiz um pequeno programa FreeBASIC (pouco sujo, mas faz o trabalho) para gerar o arquivo .tex. Isto pode então ser usado para gerar o arquivo pdf final com, por exemplo, Miktex e TexnicCenter.

  • Faça o download e extraia o compilador FreeBASIC do link (usei FreeBASIC-1.05.0-win64.zip ).
  • Salve o código abaixo como, digamos, code.bas e compile com fbc.exe code.bas .
  • Arraste e solte as pastas "Relatório 1", "Relatório 2" etc. no novo executável code.exe . Isso gerará os arquivos "Report 1.tex", "Report 2.tex" em sua respectiva pasta.
  • Faça o download e instale o Miktex a partir do link (habilite a instalação rápida de pacotes durante a configuração) e do TexnicCenter de link e abra os arquivos de relatório no TexnicCenter. Não tenho certeza se você precisa fazer alterações nas configurações padrão, mas a internet está cheia de recursos para isso. Ao compilar LaTeX -> PDF , deve instalar os pacotes que faltam.

Sourcecode: processa explicitamente a estrutura de pastas e os nomes de arquivos mencionados e nada mais.

    ' 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

Caso você queira usar um idioma diferente (talvez isso possa ser feito com um script powershell), aqui está um exemplo de arquivo 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}
    
por 17.07.2016 / 10:51
0

PDFsam Basic faz o que você quer de graça

link

link

    
por 16.07.2016 / 15:11