Объединение PDF-файлов в структурированных каталогах в один PDF-файл с закладками

665
claws

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

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.

0
У меня 20-30 таких отчетов claws 7 лет назад 0
Небольшая мысль: если имеется более 9 глав, порядок может стать странным («глава 2» больше, чем «глава 12» в большинстве реализаций сортировки). Возможно, вы захотите определить (или, по крайней мере, точно настроить) индекс вручную. Arjan 7 лет назад 0
@Arjan: Можете ли вы открыть вопрос на некоторое время? Я обнаружил самое простое решение этой проблемы. Позвольте мне ответить на это. claws 7 лет назад 0
@claws: (1) Часто полезно читать на экране. (а) Арджан не закрыл вопрос. Он (наряду с приблизительно 700 другими людьми) может голосовать, чтобы открыть его, но он не может сделать все сам. Пинг отдельных пользователей с повторным открытием запросов не очень продуктивен. (б) Было бы полезно, если бы вы отредактировали свой вопрос, как предлагает ** закрытое ** поле (и как сделал fixer1234), чтобы он был кандидатом на повторное открытие. (2) Ваш вопрос набрал три ** оставленных закрытых ** голоса. Его все еще можно открыть, но оно было удалено из очереди повторного открытия. Вы можете получить некоторую помощь, если вы спросите в мета или в чате. Scott 7 лет назад 1
@ Скотт прав. Но я не понимаю, почему это было закрыто ... Arjan 7 лет назад 0
@Arjan: Ну, в оригинальной версии вопроса говорилось: «Я был бы признателен, если бы кто-то мог предложить бесплатные / открытые инструменты для достижения этой цели», что делает его довольно однозначным запросом на рекомендацию продукта. Scott 7 лет назад 0

2 ответа на вопрос

1
nx105

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

Вы можете использовать, например, 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 
Да, пожалуйста. Не могли бы вы расширить свой ответ? claws 7 лет назад 0
1) Возможно, вам придется настроить код FreeBASIC в соответствии с вашими настройками. 2) Я также не был уверен, как вы хотите объединить PDF-файлы (добавить заголовки глав? И т. Д.). Так что вам, возможно, придется это отрегулировать. nx105 7 лет назад 0
0
Pat

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

http://www.pdfsam.org/

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

Сам PDF делает структуру закладки? Это кажется довольно важной частью вопроса Journeyman Geek 7 лет назад 1
они говорят, что делают, но никогда не пробовали себя; Я думаю, что они действительно объединяют каждую отдельную PDF-закладку в скомпилированную. Просто попробуйте. Pat 7 лет назад 0
Я пробовал pdfsam, но, к сожалению, он не отвечает потребностям, указанным в этом вопросе. Вы можете дать свой ответ. claws 7 лет назад 0

Похожие вопросы