2016-10-15 33 views
1

我有以下情況,我對編碼器沒有太多瞭解(我也不太瞭解bash)。我甚至沒有一個基礎工作bash腳本分享,所以任何幫助將不勝感激。ImageMagick將tiffs轉換爲帶有順序文件後綴的pdf

我有一個文件共享,其中包含文檔管理系統的tiffs(數千個)。目標是將多個文件tiff轉換爲單個文件pdf(最好是PDF/A 1a格式)。

目錄格式:

/Document Management Root  # This is root directory 
./2009/      # each subdirectory represents a year 
./2010/ 
./2011/ 
.... 
./2016/ 
./2016/000009.001    
./2016/000010.001 
       # files are stored flat - just thousands of files per year directory 

文檔管理系統存儲與順序編號的文件名的TIFF格式與順序文件後綴一起:

000009.001 
000010.001 
000011.002 
000012.003 
000013.001 

當一個文檔的每一頁由後綴代表。當創建新的非相關文檔時,後綴將重新啓動。在上面的例子中,000009.001是一個單頁面tiff。文件000010.001,000011.002000012.003屬於同一文件(即,頁面全部相關)。文件000013.001代表一個新的文件。

我需要保留多頁文檔的第一個文件的文件名,以便文件名可以與文檔管理系統數據庫交叉引用以獲取元數據。

的僞代碼,我想出是:

for each file in {tiff directory} 
    while file extension is "001" 
     convert file to pdf and place new pdf file in {pdf directory} 
    else 
     convert multiple files to pdf and place new pd file in {pdf directory} 

但這似乎將有不管下一個文件就是將所有001文件的副作用。

任何幫助,非常感謝。

編輯 - 兩個答案都在下面的工作。第二個答案奏效,但是我沒有意識到我測試的數據集與上面的情況不同。

回答

1

所以,在你登錄($ HOME)目錄中保存下面的腳本爲TIFF2PDF

#!/bin/bash 
ls *[0-9] | awk -F'.' ' 
    /001$/ { if(NR>1)print cmd,outfile; outfile=$1 ".pdf"; cmd="convert " $0;next} 
      { cmd=cmd " " $0} 
    END { print cmd,outfile}' 

,並通過在終端去和運行使其可執行(必要只是一次):

chmod +x TIFF2PDF  

然後將任何給定年份的幾個文檔複製到一個臨時目錄中,以嘗試...然後進入目錄,然後運行:

~/TIFF2PDF 

樣本輸出

convert 000009.001 000009.pdf 
convert 000010.001 000011.002 000012.003 000010.pdf 
convert 000013.001 000013.pdf 

如果這看起來是正確的,你其實可以執行那些像這樣的命令:

~/TIFF2PDF | bash 

,或最好如果您有GNU並行安裝:

~/TIFF2PDF | parallel 

該腳本說... 「生成名稱以數字結尾並將該列表發送到awk的所有文件的列表。在awk中,使用點作爲字段之間的分隔符,因此如果文件名爲00011.0002,則$0將爲00011.0002,$1將爲00011,並且$2將爲0002。現在,如果文件名以0001結尾,請輸出累計命令並追加輸出文件名。然後將文件名前綴PDF擴展名保存爲下一PDF的輸出文件名,並開始構建下一個ImageMagickconvert命令。在後續行中(不以0001結尾),將文件名添加到要包含在PDF中的文件名列表中。最後,輸出中積累的所有命令和追加輸出文件名。」


截至圖片的底部認爲醜黑塊,這是因爲裏面還有一些白色的小斑點防止ImageMagick的從去除黑色區域我在紅色圓圈他們:

enter image description here

如果你模糊的圖片一點點(擴散的斑點),然後獲得裝飾框的大小,您可以應用到像這樣的原始的,非模糊的圖像:

trimbox=$(convert original.tif -blur x2 -bordercolor black -border 1 -fuzz 50% -format %@ info:) 
convert original.tif -crop $trimbox result.tif 

enter image description here

我建議你這樣做,首先您的所有圖片的副本,然後運行PDF轉換之後。正如你將要保存爲TIFF文件,但擴展00010002,你需要告訴ImageMagick的修剪並強制輸出文件類型爲TIF:

original=XYZ.001 
trimbox=$(convert $original -blur x2 -bordercolor black -border 1 -fuzz 50% -format %@ info:) 
convert $original -crop $trimbox TIF:$original 

爲@AlexP。提到,如果存在大量文件,可能會出現globbing問題。在OSX上,ARG_MAX非常高(262144),並且您的文件名大約爲10個字符,因此如果一個目錄中的文件數超過26,000個,則可能會遇到問題。如果是這樣的話,只需更改:

ls *[0-9] | awk ... 

ls | grep "\d$" | awk ... 
+0

這成功地產生了您的樣本輸出相匹配的輸出。 –

+0

這似乎已經做到了,但底部有一個黑色邊框,我無法擺脫。我修改了cmd ='convert'部分,如下所示:'cmd =「convert」$ 0「-fuzz 1%-trim + repage」; next}'。這似乎沒有什麼區別。我清理了其中一個創建的文檔(綠色邊框代表編輯疊加層):https://www.dropbox.com/s/bxhnrfro69zwzez/00000023.pdf?dl=0 –

+1

這是一個不同的問題 - 這個問題是關於順序組合編號爲單一的PDF文件。我可以建議你問一個新問題,提供你的一個偏斜掃描(大概是?) - 最好至少有一些樣本文本,並問如何擺脫黑色? –

1

以下命令將轉換整個/Document Management Root樹(假設它是實際的絕對路徑)妥善處理所有子文件夾,即使名稱包括空格字符妥善跳過不匹配000000.000命名模式的所有其他文件:

find '/Document Management Root' -type f -regextype sed -regex '.*/[0-9]\{6\}.001$' -exec bash -c 'p="{}"; d="${p:0: -10}"; n=${p: -10:6}; m=10#$n; c[1]="$d$n.001"; for i in {2..999}; do k=$((m+i-1)); l=$(printf "%s%06d.%03d" "$d" $k $i); [[ -f "$l" ]] || break; c[$i]="$l"; done; echo -n "convert"; printf " %q" "${c[@]}" "$d$n.pdf"; echo' \; | bash 

做一個預演只是重新最後移動| bash

更新以匹配00000000.000圖案(和分割爲多行,爲了清楚起見):

find '/Document Management Root' -type f -regextype sed -regex '.*/[0-9]\{8\}.001$' -exec bash -c ' 
    pages[1]="{}" 
    p1num="10#${pages[1]: -12:8}" 
    for i in {2..999}; do 
    nextpage=$(printf "%s%08d.%03d" "${pages[1]:0: -12}" $((p1num+i-1)) $i) 
    [[ -f "$nextpage" ]] || break 
    pages[i]="$nextpage" 
    done 
    echo -n "convert" 
    printf " %q" "${pages[@]}" "${pages[1]:0: -3}pdf" 
    echo 
' \; | bash 
+0

這隻會返回一個提示,並且不會對文檔管理根目錄中的文件進行任何更改。 –

+0

您是否使用'echo'而不是'convert'來嘗試?也''echo $ BASH_VERSION' –

+0

嘗試'echo'而不是'convert',它返回一個提示。 –

相關問題