私は単一の大きなPDFファイル(クレジットカードの毎月の請求書を表す)を分割する方法を研究しています。印刷用に作成されていますが、後で使用するためにファイルを個々のファイルに分割したいと思います。各居住地には2ページ、3ページ、4ページなどの可変長があるため、各ページを「読み取り」「Xの1ページ」を見つけて、ブロックを次の「Xの1ページ」に分割する必要があります。さらに、各結果はそれぞれ違うファイルには一意のIDが必要です(「Xページの1」ページにも含まれています)。
私がそうしたとき研究開発- 必要な作業を正確に行う「PDF Content Split SA」というツールを見つけました。しかし、Linuxでこれを行う方法があると確信しています(私たちはOpenSource + Libreに切り替える予定です)。
読んでくれてありがとう。どんな助けでもとても役に立ちます。
編集する
これまで、私たちが必要とする機能を正確に実行するためのNautilusスクリプトを見つけましたが、それを機能させることはできません。
#!/bin/bash
# NAUTILUS SCRIPT
# automatically splits pdf file to multiple pages based on search criteria while renaming the output files using the search criteria and some of the pdf text.
# read files
IFS=$'\n' read -d '' -r -a filelist < <(printf '%s\n' "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"); unset $IFS
# process files
for file in "${filelist[@]}"; do
pagecount=`pdfinfo $file | grep "Pages" | awk '{ print $2 }'`
# MY SEARCH CRITERIA is a 10 digit long ID number that begins with number 8:
storedid=`pdftotext -f 1 -l 1 $file - | egrep '8?[0-9]{9}'`
pattern=''
pagetitle=''
datestamp=''
for (( pageindex=1; pageindex<=$pagecount; pageindex+=1 )); do
header=`pdftotext -f $pageindex -l $pageindex $file - | head -n 1`
pageid=`pdftotext -f $pageindex -l $pageindex $file - | egrep '8?[0-9]{9}'`
let "datestamp =`date +%s%N`" # to avoid overwriting with same new name
# match ID found on the page to the stored ID
if [[ $pageid == $storedid ]]; then
pattern+="$pageindex " # adds number as text to variable separated by spaces
pagetitle+="$header+"
if [[ $pageindex == $pagecount ]]; then #process last output of the file
pdftk $file cat $pattern output "$storedid $pagetitle $datestamp.pdf"
storedid=0
pattern=''
pagetitle=''
fi
else
#process previous set of pages to output
pdftk $file cat $pattern output "$storedid $pagetitle $datestamp.pdf"
storedid=$pageid
pattern="$pageindex "
pagetitle="$header+"
fi
done
done
検索条件を編集し、スクリプトがNautilusスクリプトフォルダにうまく配置されましたが、機能しません。コンソールのアクティビティログを使用してデバッグを試み、コードにマーカーを追加しました。明らかにpdfinfoの結果値と矛盾していますが、修正方法がわかりません。
答え1
クイックPythonはオプションですか? PyPDF2パッケージを使用すると、必要なものを正確に実行できます。
答え2
私は成功した。少なくとも動作します。しかし、今はこのプロセスを最適化したいと思います。 1つの大きなPDFで1000個のアイテムを処理するのに最大40分かかることがあります。
#!/bin/bash
# NAUTILUS SCRIPT
# automatically splits pdf file to multiple pages based on search criteria while renaming the output files using the search criteria and some of the pdf text.
# read files
IFS=$'\n' read -d '' -r -a filelist < <(printf '%s\n' "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"); unset $IFS
# process files
for file in "${filelist[@]}"; do
pagecount=$(pdfinfo $file | grep "Pages" | awk '{ print $2 }')
# MY SEARCH CRITERIA is a 10 digit long ID number that begins with number 8:
#storedid=`pdftotext -f 1 -l 1 $file - | egrep '8?[0-9]{9}'`
storedid=$(pdftotext -f 1 -l 1 $file - | egrep 'RESUMEN DE CUENTA Nº ?[0-9]{8}')
pattern=''
pagetitle=''
datestamp=''
#for (( pageindex=1; pageindex <= $pagecount; pageindex+=1 )); do
for (( pageindex=1; pageindex <= $pagecount+1; pageindex+=1 )); do
header=$(pdftotext -f $pageindex -l $pageindex $file - | head -n 1)
pageid=$(pdftotext -f $pageindex -l $pageindex $file - | egrep 'RESUMEN DE CUENTA Nº ?[0-9]{8}')
echo $pageid
let "datestamp = $(date +%s%N)" # to avoid overwriting with same new name
# match ID found on the page to the stored ID
if [[ $pageid == $storedid ]]; then
pattern+="$pageindex " # adds number as text to variable separated by spaces
pagetitle+="$header+"
if [[ $pageindex == $pagecount ]]; then #process last output of the file
# pdftk $file cat $pattern output "$storedid $pagetitle $datestamp.pdf"
pdftk $file cat $pattern output "$storedid.pdf"
storedid=0
pattern=''
pagetitle=''
fi
else
#process previous set of pages to output
# pdftk $file cat $pattern output "$storedid $pagetitle $datestamp.pdf"
pdftk $file cat $pattern output "$storedid.pdf"
storedid=$pageid
pattern="$pageindex "
pagetitle="$header+"
fi
done
done