如何使用一个命令将所有pdf文件转换为文本(在文件夹内)?


18

我知道我可以像这样将pdf文件一一转换为文本文件:

$ pdftotext filename.pdf

但是,是否有一个命令可以执行该转换而无需指定单独的文件名来进行全部转换?

在Wikipedia上看到“不能使用用于转换多个文件的通配符(*),例如$ pdftotext * pdf,因为pdftotext只需要一个文件名。”

pdf  text  convert  batch 

Answers:


23

下面将转换当前目录中的所有文件:

for file in *.pdf; do pdftotext "$file" "$file.txt"; done

它只有一个命令,可以在终端中一行输入(它的pdftotext在单行语法的for循环内,这是op所要求的)
Sam

请查看以下链接以获取有关for循环工作原理的更多信息:cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/bash-for-loop-examples
Sam

这会不会导致非PDF文件出现问题?
cprofitt

这样会不会产生“ filename.pdf.txt”之类的文件?
瑞安·汤普森

是的,如果这是一个问题,我们可以使用'sed'或'awk'删除.pdf扩展名,但这会增加命令的复杂性
Sam

8
ls *.pdf | xargs -n1 pdftotext

xargs通常是快速运行解决方案,可以多次运行同一命令,而每次更改都很小。该-n1选项可确保一次仅将一个pdf文件传递给pdftotext。

编辑:如果您担心文件名等中的空格,则可以使用以下替代方法:

find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext

请参阅我的回答:可以对该命令进行调整,以避免出现此处提到的问题吗?这并不意味着您的解决方案不好,相反,它所做的事情非常具体,而此处的其他选择则不然。但我只是很好奇

2
或者:ls *.pdf | xargs -L1 -I% pdftotext % %.txt
kenorb 2014年

2

写一个bash脚本

for f in *.pdf; do
  pdftotext "$f"
done

或在单行命令中键入它,如下所示:

for f in *.pdf; do pdftotext "$f"; done

我希望这有帮助。我没有大量的.pdfs可以对此进行测试,但是我使用此策略将.flac文件转换为.ogg文件。


可以通过打开该文件夹中的终端并运行命令而不是手动插入路径来完成?

您不能将其粘贴到此处并插入答案中吗?那将是一个很好的答案。我无法通过删除您发布的内容中的一部分来达到良好的效果

当我有机会测试它们时,我最初建议的find和xargs无效。
cprofitt 2012年

1

首先,我必须感谢SamRyan Thompson,以及所有其他答复者-我在这里的回答不过是与将其解决方案添加到Thunar的自定义操作的可能性有关的一种变体:

因此,与任何终端命令一样,可以将一个文件夹中所有pdf文件转换为文本的命令放在Thunar文件管理器的自定义操作列表中

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

这里的命令find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext(来自Ryan Thompson)是我更喜欢使用的命令,但是它转弯很麻烦...请参阅下文...

在此处输入图片说明

在此处输入图片说明

...这是一个有趣的命令,请谨慎使用:它被执行为将所有pdf文件在触发位置转换为文本,因此,如果在主文件夹中错误触发了该文件,则会有一些不需要的内容效果:您所有的PDF都将转换为文本!

(我是这样测试的:在桌面上创建了一个名为“ test”的文件夹,并在其中创建了一个pdf文件,并在文件夹(/Desktop/test/a/b/c/e/f/g/h/i)中创建了一系列包含相同pdf 的文件夹。在该命令中运行该命令/Desktop/test会将所有pdf转换为“ i”文件夹。)

(我欢迎您就如何调整此命令以避免这种风险发表评论。)

for file in *.pdf; do pdftotext "$file" "$file.txt"; done来自Sam的另一个() 代替,可以避免此问题。

但是在某些情况下,人们可能会希望Ryan的解决方案真正起作用!


1
您可以使用来避免find命令在子目录中搜索-maxdepth 1。另外,当将其放入Thunar的自定义操作功能中时,您可能应该替换find .find %F以允许Thunar正确传递所选目录的路径。
瑞安·汤普森

0
for file in *.pdf; do pdftotext "$file" "$file.txt"; done

这个输出sample.pdf.txt

我按照user2357111317的建议尝试使用了这一行,并且还包含-layout来保留文本的布局

for file in *.pdf; do pdftotext -layout "$file"; done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.