如何获取没有匹配.pdf的.jpg文件列表?

时间:2013-12-22 08:03:50

标签: bash shell unix pdf adobe

我正在尝试将一堆坐在树形结构中的.jpg文件转换为.pdf,每个pdf一页。我使用了Adobe Acrobat的批量(自定义动作)转换(顺便说一下,作为一个侧面问题,这是一个好主意吗?必须有更好的方法!)这是一个非常缓慢而痛苦的过程,其中Acrobat冻结了我。在它冻结之前,它也表现不正常,拒绝一些文件。

所以,为了找到我需要创建的丢失的.pdf文件,我去了cygwin尝试了类似的东西

$ find -name  *.jpg  -exec ls '{}/.jpg/pdf' \;

我希望这会将{}视为变量,用.pdf替换.jpg,但替换不会发生。我该怎么做呢?

2 个答案:

答案 0 :(得分:5)

你走了:

find . -name '*.jpg' -exec \
    sh -c 'pdf="${1%.jpg}".pdf; test -f "$pdf" || echo missing: $pdf' -- {} \;

诀窍是将{}作为命令行参数传递给子shell,这样就可以在shell变量中使用模式替换,在本例中是$1(第一个命令行arg) )。

顺便说一下,"${1/.jpg/pdf}"也可以,但"${1%.jpg}".pdf更准确。

这种方法相对简单,但效率低下,因为它为每个JPG文件启动一个新的sh进程。一个更有效但更长的解决方案:

find . -name '*.jpg' -print0 | while read -d $'' f; do \
    pdf="${f%.jpg}".pdf; test -f "$pdf" || echo missing: $pdf; done

答案 1 :(得分:3)

  顺便问一下,这是一个好主意吗?

没有。 PDF的DCTDecode过滤器需要JPG文件原样,这可能是您想要的 - PDF容器中的JPEG,没有任何重新压缩,没有您或者任何触摸JPEG内容的软件。因此,不仅是Acrobat,而且例如ImageMagick在树上的使用不是一个好主意。我想不出现成的工具将JPEG打包成PDF,但小程序会有所帮助。

use strict;
use warnings;
use File::Find;
use PDF::Reuse;
use Image::Info qw(image_info dim);

find(sub {
    return unless /\.jpg$/i;
    my ($w, $h) = dim(image_info($_));
    prFile($_.'.pdf');
    prMbox(0, 0, $w, $h);
    prAdd("q $w 0 0 $h 0 0 cm /".prJpeg($_, $w, $h)." Do Q\n");
    prEnd()
}, $ARGV[0]);

它应该非常快,希望树根作为参数并完成我所说的:将JPG包装成PDF。

P.S。建议至少进行一些检查 - $ w和$ h的定义? PDF ::重用允许记录,可能会有帮助。

p.p.s。请注意,此模块假定为RGB,但如果您的JPG可以是灰度或CMYK - 请在image_info哈希中检查它并对PDF::Reuse源进行少量修改。它还假设为72 dpi - 否则,还要检查分辨率的<{1}}哈希并进行调整 上面image_infoprMbox调用的参数。

另一次更新:

上面的代码是Perl。在Windows上,您可以安装ActiveState的构建(然后使用其PPM实用程序添加模块)或Strawberry Perl(并使用cpan客户端安装模块)。 prAdd是核心模块。 File::FindPDF::Reuse - 您安装。

这样做,然后保存上面的源代码,例如Image::Info,将几个 RGB jpeg示例放入某个文件夹(内部的树结构,或只是普通列表 - 现在无关紧要),然后从命令提示符运行:

jpegs_2_pdfs.pl

它应该为每个JPG文件创建PDF。那只是为了给你一个品味。如果你觉得你需要所有这些并且你愿意并且你可以花费时间和精力并且它是值得的 - 那么我将详细说明“如果文件不是RGB则该怎么办”和“当分辨率不是72时该怎么做” dpi“ - 虽然我不会为你写一个现成的解决方案,你需要自己编码:-)

注意,虽然我说“避免重新压缩”,但是如果保留像素尺寸甚至质量损失,甚至用JPEG重新压缩

perl jpegs_2_pdfs.pl path_to_my_folder

绝对可以忽略不计convert file.jpg -compress JPEG file.pdf 是ImageMagick的工具,如果你没有编程(只为你的树创建一个批处理文件),也许这就是你的方式。

请注意,当你说“jpgs是混合颜色/灰度/ b&amp; w”时,它不可能是这样,因为你无法将双层图像保存到jpeg中。