Ghostscrip은 PDF에서 n페이지마다 추출합니다.

Ghostscrip은 PDF에서 n페이지마다 추출합니다.

이것이 가능한지 모르겠습니다. 저는 고스트스크립트를 배우고 있습니다. 각각 약 500페이지 길이의 PDF 파일이 여러 개 있다고 가정해 보겠습니다. 각 문서에서 100페이지마다 추출하고 각 페이지를 별도의 PDF 파일로 저장하도록 Ghostscript를 설정할 수 있습니까?

그래서 길이가 500페이지인 FileA.pdf가 있습니다. 그래서 지금 내가 원해파일 A_0001.pdf 파일 A_0002.pdf 파일 A_0003.pdf 파일 A_0004.pdf 파일 A_0005.pdf

내 시간 간격에 따라 파일을 분할하고 병합하는 스크립트를 작성했지만 파일 이름을 올바르게 바꾸는 데 문제가 있습니다. 내가 겪고 있는 문제는 첫 번째 파일의 분할 및 병합이 완료된 후 이름이 다음으로 변경된다는 것입니다.파일 A_0001.pdf 파일 A_0002.pdf 파일 A_0003.pdf 파일 A_0004.pdf 파일 A_0005.pdf

그러나 문제는 일단 FileB 프로세스를 시작하면파일 B_0006.pdf 파일 B_0007.pdf몇 가지 다른 방법을 시도했지만 모두 실패했습니다. 제안 사항이 있습니까? 누구든지 도와줄 수 있나요?

    for file in /mnt/bridge/pdfsplit/staging/*.[pP][dD][fF]
do
  echo $file
  #Splits All the Files
  gs -q -dNOPAUSE -sDEVICE=pdfwrite -o tmp_%04d.pdf $file

  #Removes Last File in List; Ghostscript creates a blank file everytime it splits
  find /mnt/bridge/pdfsplit/ -name "tmp*"  | tail -1 | while read filename ; do rm $filename; done

    pageCount=$(find . -name "tmp*" | wc -l)
    documents=$(((pageCount / 998) + (pageCount % 998 > 0)))
    pages=$(((pageCount/documents) + (pageCount % documents > 0 )))

    for ((i=1; i<$pageCount; i++)); do
      list=$(ls -1 tmp* 2>/dev/null | head -$pages)
      count=$(ls -1 tmp* 2>/dev/null| wc -l)
      gs -q -dNOPAUSE -sDEVICE=pdfwrite -o $(basename $file .pdf )_Part_$(printf %04d $i).pdf -dBATCH $list
      rm -f $list
      if [[ $count -eq 0 ]]; then
         echo "Done"
         break
         fi
    done


   #Removes Last File in List; Ghostscript is creating a blank file
   mv *.pdf /mnt/bridge/pdfsplit/splitFiles/
   find /mnt/bridge/pdfsplit/splitFiles/ -name "*.pdf"  | tail -1 | while read filename ; do rm $filename; done

done

답변1

이것이 도움이 됩니까?

#!/bin/bash

function getChunk {
    #extract a page range
    gs -q -dNOPAUSE -sDEVICE=pdfwrite -sPageList=$1-$2 -o ${3%%.*}_$(printf %04d $4).pdf $3
}

for file in *.pdf; do

    #Use gs to get the page count
    pgs=$(gs -q -dNODISPLAY -c "($file) (r) file runpdfbegin pdfpagecount = quit")

    #specify the number of pages in each chunk as step
    step=10

    #calculate the number of whole chunks 
    chunks=$(( pgs / step))

    #reset all counters between pdfs
    f=0    #first page to extract in chunk
    l=0    #last page to extract in chunk
    i=0    #chunk counter

    #Extract the whole chunks 
    for ((i=0; i<$chunks; i+=1)); do

        #calculate the first and last pages 
        f=$((i*step+1))
        l=$((f+step-1))
        getChunk $f $l $file $i
    done

    #Pick up any part chunk at the end of the file
    f=$((l+1))
    if [ $f -le $pgs ]; then
        getChunk $f $pgs $file $i
    fi
done

이름 정리 좀 할게요...

답변2

GS 없이

FileA_0001.pdf, FileA_0002.pdf, ..., FileA_0100.pdf 생성

for i in $(seq 1 100); do pdftocairo -pdf -f $i -l $i FileA.pdf $(printf 'FileA_%04d.pdf' $i); done

FileA_1.pdf, FileA_2.pdf, ..., FileA_100.pdf 생성

pdfseparate -l 100 FileA.pdf FileA_%d.pdf

내가 가장 좋아하는 것은 pdftocairo입니다. 제 경험상 gs보다 빠르고 안정적입니다. 시도 해봐.

관련 정보