저는 하나의 큰 PDF 파일(신용 카드에 대한 월별 청구서를 나타냄)을 분할하는 방법을 연구 중입니다. 인쇄용으로 제작되었지만 나중에 사용하기 위해 파일을 개별 파일로 분할하고 싶습니다. 각 정착지에는 2페이지, 3페이지, 4페이지 등 가변 길이가 있으므로 각 페이지를 "읽고" "X의 1페이지"를 찾은 다음 블록을 다음 "X의 1페이지"로 분할해야 합니다. 추가적으로 각 결과는각기 다른파일에는 고유 ID가 있어야 합니다("X 페이지의 1" 페이지에도 포함되어 있음).
내가 그랬을 때연구개발- 우리에게 필요한 작업을 정확하게 수행하는 "PDF Content Split SA"라는 도구를 찾았습니다. 하지만 Linux에서 이를 수행할 수 있는 방법이 있다고 확신합니다(우리는 OpenSource+Libre로 전환할 예정입니다).
읽어 주셔서 감사합니다. 어떤 도움이라도 매우 도움이 될 것입니다.
편집하다
지금까지 우리가 필요로 하는 기능을 정확하게 수행하는 노틸러스 스크립트를 찾았지만 작동시킬 수는 없습니다.
#!/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
나는 성공했다. 적어도 작동합니다. 하지만 이제는 이 프로세스를 최적화하고 싶습니다. 하나의 큰 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