2013-12-22 66 views
3

我試圖將一堆坐在樹結構中的.jpg文件轉換爲.pdf,每pdf一頁。我用Adobe Acrobat的批處理(自定義動作)轉換(順便說一句,作爲一個側面問題,這是一個好主意嗎?必須有更好的方法!)這是一個非常緩慢和痛苦的過程,在這個過程中,Acrobat凍結在我身上。在它凍結之前,它的行爲也不正常,拒絕一些文件。如何獲得沒有匹配.pdf的.jpg文件列表?

所以,爲了找到我需要創建缺少.pdf文件,我去了Cygwin和嘗試類似

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

我希望這會像對待{}作爲變量,更換.jpg與.pdf,但替代沒有發生。我該怎麼做呢?

回答

5

在這裏你去:

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

的竅門是通過{}到一個子shell作爲命令行參數,這樣就可以在$1在shell變量使用模式替代,在這種情況下(在第一個命令行參數)。

Btw,"${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

謝謝,這個作品完美。問題:在重複使用同一個子shell的同時,有沒有辦法做到這一點,而不是爲每個文件啓動一個新進程? – Ruby

+0

好問題,我添加了一個更有效的解決方案。 – janos

+0

謝謝。 $''做什麼?對於這個問題, - – Ruby

3

順便說一句,作爲一個側面的問題,是一個好主意?

號PDF的DCTDecode濾料JPG文件爲是,而這可能是你想要的東西 - JPEG的PDF容器,放置沒有任何重新壓縮和沒有你或觸摸JPEG內容的任何軟件。因此,不僅Acrobat,而且例如ImageMagick在你的樹上的使用不是一個好主意。我想不出將現成的工具包裝成PDF格式的JPEG,但小程序將有所幫助。

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 definedness? PDF ::重用允許日誌記錄,可能會有所幫助。

p.p.s.請注意,這個模塊假定RGB,但如果你的JPG文件可以灰度或CMYK - 檢查它在image_info哈希和做小修改PDF::Reuse源。它還假定72 dpi的 - 否則,此外,檢查image_info哈希分辨率和調整上述 參數prMboxprAdd電話。

另一個更新:上述

代碼是Perl的。在Windows上,您安裝ActiveState的版本(然後你加上其PPM工具模塊),或草莓的Perl(與CPAN客戶端安裝模塊)。File::Find是核心模塊。 PDF::ReuseImage::Info - 您安裝。

這樣做,然後將源保存爲例如jpegs_2_pdfs.pl,地方几個RGB JPEG樣品到某個文件夾(樹結構裏面,或者只是簡單的列表 - 無所謂了),然後從命令提示符下運行:

perl jpegs_2_pdfs.pl path_to_my_folder 

應該爲每個JPG創建PDF文件。這只是爲了給你一個口味。如果你覺得你需要所有這些,而且你願意並且可以花費時間和精力,這是值得的 - 那麼我將詳細說明「如果文件不是RGB文件怎麼辦」以及「如果文件不是RGB, dpi「 - 雖然我不會爲你寫一個現成的解決方案,但你需要編碼自己:-)

請注意,雖然我說」避免重新壓縮「,但質量損失,如果你保留像素尺寸甚至與JPEG

重新壓縮
convert file.jpg -compress JPEG file.pdf 

完全可以忽略不計Convert是ImageMagick的工具,如果你不進入編程(只需爲你的樹創建一個批處理文件),也許這就是你的方式。

請注意,當您說「jpgs是混合顏色/灰度/ b & w」時,它不可能如此,因爲您無法將雙級圖像保存爲jpeg。

+0

謝謝@VadimR, – Ruby

+0

這是什麼,@VadimR,Javascript? Adobe插件?我如何運行?它在哪裏假設72 dpi?我的jpgs都是混合分辨率和混合彩色/灰度/黑白,多年來我一直使用不同的掃描儀掃描我的文檔,不知道掃描儀是否會執行CMYK或什麼。我現在將它們轉換爲PDF以便進行OCR,所以你是對的,我真的不希望質量損失。但我需要更多信息! – Ruby

+0

我更新了我的答案 – user2846289

相關問題