【问题标题】:Merging .pdf files with Pdftk将 .pdf 文件与 Pdftk 合并
【发布时间】:2018-06-06 19:37:34
【问题描述】:

我在一个文件夹中有很多 .pdf 文件。我还有一个.bat 脚本,它与Pdftk 程序一起工作。但是当我执行.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....有办法识别序列吗?

谢谢

【问题讨论】:

  • 在不知道你传递给批处理诊断的参数的情况下是不可能的。%* 被你传递的所有参数替换,输出的位置由第一个参数的路径%~dp1
  • 您是否正在将一堆文件拖放到您的批处理文件中?
  • 命令的长度是有限制的。大约 8191 字节。如果将一堆文件拖放到批处理文件上,它会将文件的整个路径作为参数加上带空格的文件路径的引号。根据您删除的文件数量,您将超过最大命令长度限制。
  • 如果您阅读过PDFTK 的帮助文件,您会看到以下示例:pdftk *.pdf cat output combined.pdf。换句话说,如果您需要合并的所有文件都在工作目录中,则可以使用通配符来引用所有文件。
  • 绝对没有必要使用FOR 命令循环遍历所有参数以将它们分配给环境变量。正如您的代码已经显示的那样,您可以使用通配符访问所有命令行参数,那么您为什么不先尝试一下:pdftk.exe %* cat output "%~dp1binder.pdf"

标签: batch-file pdftk


【解决方案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 文件并自动合并...
  • 在同一个文件夹中使用所有 pdf 的问题是 binder.pdf 将包含在连续运行中。
  • @LotPings,我没有要测试的 PDFTK,但在他们的网站上,他们确实将其作为示例:pdftk *.pdf cat output combined.pdf。所以我想知道程序是否知道它正在创建的 PDF 并且不包含它?
  • @Squashman 好点,刚刚测试过,你是对的,输出文件被自动排除。
  • @LotPings,所以如果输出文件已经是文件夹中的现有文件,它会给你这个错误,但如果你确保先删除它,一切都很好吗?
【解决方案2】:

我有同样的问题,我在这里。我想我有一个更好的主意。它可能对您有所帮助,否则人们将来会来这里。

就我而言,

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

第2步排序列表,建议有400个文件。

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

第 3 步重新组织 sortedNameList。

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

步骤 4 将所有文件合并为一个 pdf 文件

pdftk `cat namesInOneline` cat output final.pdf

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多