Вероятно, это не то решение, которое вы ищете:
Вы можете использовать, например, 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}