使用Pdftk合并.pdf文件

3
我有很多位于一个文件夹中的.pdf文件。同时我还有一个与Pdftk程序一起使用的.bat脚本。但是当我执行这个.bat脚本时它不起作用。
请查看我的脚本:
@echo off
setlocal enabledelayedexpansion
FOR %%A IN (%*) DO (set command=!command! %%A)
pdftk.exe %command% cat output "%~dp1binder.pdf"

我的.pdf文件,.bat脚本以及pdftk.exe和它的libiconv2.dll都在同一个文件夹中。
有人可以帮我吗?我需要合并文件夹中的所有.pdf文件。
谢谢!
伙计们,这个简单的命令对我来说很好用,只有一个问题。如果没有命令中的文件,它就不会处理。 看一下脚本:
@echo off
pdftk fbw1.pdf fbw2.pdf fbw3.pdf fbw4.pdf fbw5.pdf fbw6.pdf fbw7.pdf fbw8.pdf fbw9.pdf fbw10.pdf fbw11.pdf fbw12.pdf fbw13.pdf fbw14.pdf fbw15.pdf fbw16.pdf fbw17.pdf fbw18.pdf fbw19.pdf fbw20.pdf fbw21.pdf fbw22.pdf fbw23.pdf fbw24.pdf fbw25.pdf fbw26.pdf fbw27.pdf fbw28.pdf cat output testieee.pdf >nul 2>nul

例如:如果我在目录中没有文件fbw1.pdf,它将不会处理任何内容。我需要程序处理所有的文件,即使缺少一个或多个...
有人能帮忙吗?
谢谢!
好的,命令pdftk *.pdf cat output combined.pdf现在可以工作了,但它不会按顺序合并.pdf文件。 例如:1.pdf 2.pdf 3.pdf....是我想要的顺序,但命令以这种方式合并:1.pdf 3.pdf 2.pdf 7.pdf....是否有一种方法来识别顺序?
谢谢

1
不知道你传递给批处理的参数,就无法进行诊断。%*将被替换为你传递的所有参数,输出的位置由第一个参数的路径 %~dp1 决定。 - user6811411
2
你是不是在将一堆文件拖放到批处理文件上? - undefined
2
命令的长度是有限制的,大约为8191字节。如果你将一堆文件拖放到批处理文件上,它会将整个文件路径作为参数,并在带有空格的文件路径上加上引号。根据你拖放的文件数量,可能会超过最大命令长度限制。 - undefined
2
如果你读过PDFTK的帮助文件,你就会看到这个例子:pdftk *.pdf cat output combined.pdf。换句话说,如果你需要合并的所有文件都在工作目录中,你可以使用通配符来引用它们。 - undefined
2
完全没有必要使用FOR命令来循环遍历所有的参数并将它们赋值给环境变量。正如你的代码已经展示的那样,你可以使用通配符访问所有的命令行参数,那么为什么你不首先尝试这样做呢:pdftk.exe %* cat output "%~dp1binder.pdf" - undefined
显示剩余12条评论
4个回答

1

编辑新方法。

  • 如果您将文件或文件夹拖放到批处理中,或至少传递一个文件/文件夹
  • 以下批处理将更改为引用的文件夹并
  • 处理该文件夹中的所有pdf文件,并将它们组合成binder.pdf
  • 如有必要,现有的binder.pdf将重命名为binder.bak.pdf

:: Q:\Test\2018\06\06\SO_50728273.cmd
@echo off
setlocal enabledelayedexpansion
if "%~1" neq "" (
  Echo %~a1|findstr "d" 2>&1>Nul && Pushd "%~f1" || Pushd "%~dp1"
) else (
  Echo No arguments, need a path& pause & goto :Eof
)
Del /f binder.bak.pdf 2>&1>Nul
if exist binder.pdf Ren binder.pdf binder.bak.pdf
pdftk.exe *.pdf cat output binder.pdf
PopD

如果不知道你传递给批处理的参数,就无法进行诊断。%*将被替换为您传递的所有参数,输出位置由第一个参数的路径 %~dp1 确定。

我在我的 ramdisk a: 上运行了你的批处理。

之前的目录:

> dir A:\
 Verzeichnis von A:\

2018-06-06  21:57            65.381 SO_5072812.pdf
2018-06-06  21:56               163 SO_50728273.cmd
2018-06-06  21:55            60.649 SO_50728273.pdf
               3 Datei(en),        126.193 Bytes
               0 Verzeichnis(se),  1.049.452.544 Bytes frei

在我命名了批处理文件为SO_50728273.cmd之后:

> SO_50728273.cmd a:\*.pdf

> dir
 Verzeichnis von A:\

2018-06-06  21:58           125.756 binder.pdf
2018-06-06  21:57            65.381 SO_5072812.pdf
2018-06-06  21:56               163 SO_50728273.cmd
2018-06-06  21:55            60.649 SO_50728273.pdf
               4 Datei(en),        251.949 Bytes
               0 Verzeichnis(se),  1.049.260.032 Bytes frei

这个 .bat 文件需要在目录中找到所有的 .pdf 文件并自动合并它们。 - user9886488
使用同一文件夹中的所有pdf文件的问题在于,每次运行时都会包含binder.pdf文件。 - user6811411
2
@LotPings,我没有PDFTK来进行测试,但在他们的网站上,他们确实展示了这个例子:pdftk *.pdf cat output combined.pdf。所以我想知道这个程序是否知道它正在创建的PDF,并且不包括它? - undefined
1
@LotPings,所以如果输出文件已经存在于文件夹中,它会给你报错,但是如果你确保先删除它,一切都会正常吗? - undefined
@Squashman 没错,将批处理文件更改为将之前的版本保存为binder.bak.pdf。 - user6811411
显示剩余5条评论

1

我有同样的问题,并且在这里。我认为我有一个更好的想法来解决它。它可能会帮助你或者未来来到这里的人。

对于我的情况,

ls *.pdf > list    
for i in `seq 1 340`;do grep "\-$i\-\-" list >> tmp; done
awk '{printf("%s ", $0)}' tmp > oneline
pdftk `cat oneline` cat output test.pdf

针对您的情况

步骤1:将所有文件名放入一个文件中,例如 namelist。

ls *.pdf > namelist

第二步,对名单进行排序,假设有400个文件。

for i in `seq 1 400`;do grep $i namelist >> sortedNameList;done

步骤三:重新组织已排序的名称列表。

awk '{printf("%s ", $0)}' sortedNameList > namesInOneline

第四步:将所有文件合并为单个PDF文件

pdftk `cat namesInOneline` cat output final.pdf

1
我认为最好的解决方案是:

pdftk $(ls -v *.pdf) cat output merged.pdf

这个解决方案解决了问题,比其他提出的解决方案更加简洁。


0
原帖的问题源于期望保留文件1至28或其他字母数字顺序,但在Windows上无法保证这一点。
在某些情况下,文件顺序可能是不可取的,但也是意料之中的1、10、11、......、2、20、21......、28、3、4、5、6、7、8、9。
因此,我们经常使用01、02、03、04等编号来保持顺序,这里只有8个文件在一个连续循环foo-0(1,1,8)中被重命名。我们可能期望奇怪的目录列表是foo-01 foo-02 foo-03,但通过使用传统的DiskOS dir命令,我们可以看到它们是奇怪的,因此当没有其他指示时,*.pdf可能会使用这个顺序。
dir /odd foo-??.pdf

enter image description here

为了使*.pdf文件按顺序工作并确保顺序正确,我们需要将其复制到一个新的名称,并在使用PDFtk之前生成一个适当的有序磁盘目录。
而且,你猜怎么着?在Windows中使用本机磁盘命令(我尝试了很多种)没有办法确保顺序不会变得奇怪,它在这种情况下仍然令人困惑地组织着。

enter image description here

对于这种类型的应用程序,Angus Johnston的增强型Windows GUI 是最容易确保顺序的。

enter image description here

Windows命令行界面序列

在控制台上无需批处理文件

pdftk foo-01.pdf foo-02.pdf cat output tmp-02.pdf
cmd /V:on /c "for /l %c in (2,1,27) do @set /a d=%c + 1 >nul&&pdftk tmp-0%c.pdf foo-0!d!.pdf cat output tmp-0!d!.pdf"
ren tmp-28.pdf foo-01-28.pdf

作为一个cmd文件(根据需要进行修改)
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
pdftk foo-01.pdf foo-02.pdf cat output tmp-02.pdf
for /l %%c in (2,1,27) do (
 set /a d=%%c + 1 >nul
 pdftk tmp-0%%c.pdf foo-0!d!.pdf cat output tmp-0!d!.pdf"
)
ren tmp-28.pdf foo-01-28.pdf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接