Вероятно, это не то решение, которое вы ищете:
Вы можете использовать, например, 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" print #1, $"\usepackage" print #1, $"\usepackage" print #1, $"\usepackage" print #1, $"\hypersetup" print #1, $"\begin" print #1, $"\pagestyle" print #1, $"\pagenumbering" print #1, "%" ' ' Process contents.pdf. dim as string tmp = basedir+"\contents.pdf" if isFileOrFolder(tmp) = 1 then print #1, $"\includepdf[pages=-]" 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=-]" 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=-]" print #1, $"\bookmark[dest=l";str(chapter_link_cnt); _ ".1]" else print #1, $"\includepdf[pages=-]" end if k += 1 nextPage = nextChapterDir + $"\page "+str(k)+".pdf" wend j += 1 nextChapterDir = basedir+$"\chapter "+str(j) wend ' print #1, $"\end" 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 \usepackage \usepackage \usepackage \hypersetup \begin \pagestyle \pagenumbering % \includepdf[pages=-] \includepdf[pages=-] % \includepdf[link,linkname=l1,pages=-] \bookmark[dest=l1.1] \includepdf[pages=-] % \includepdf[link,linkname=l2,pages=-] \bookmark[dest=l2.1] \includepdf[pages=-] % \includepdf[link,linkname=l3,pages=-] \bookmark[dest=l3.1] \includepdf[pages=-] \includepdf[pages=-] \includepdf[pages=-] \end