PDF 페이지를 여러 페이지로 자르기 [닫기]


16

하나의 PDF 페이지에 대한 두 개의 "실제"페이지를 포함하는 많은 PDF 파일이 있습니다. 나는 이것을 반으로 자르고 각 반을 별도의 페이지에 넣고 싶습니다. 본질적으로, 나는 pdfnup(또는 psnup) 과 정확히 반대되는 것을 필요로합니다 . 이 업적을 어떻게 달성 할 수 있습니까?

플랫폼은 Linux이며 오픈 소스 선호. (GUI가 아닌) 스크립팅 할 수있는 작업을 수행 할 수있는 많은 것들이있어서 목록을 제공하고 씹을 수 있습니다.

기존 스크립트 만이 유일한 옵션은 아닙니다. 타사 라이브러리를 사용하여 비슷한 방식으로 PDF를 조작하는 샘플 코드가 있다면 원하는 작업을 수행하기 위해 해킹 할 수 있습니다.


답변:


22

Ghostscript의 도움으로이 문제를 해결할 수 있습니다. pdftk혼자서는 (내가 아는 한) 그렇게 할 수 없습니다. 이 작업을 수동으로 수행하는 명령 줄 단계를 알려 드리겠습니다. 페이지 크기 및 페이지 번호에 대한 다른 매개 변수를 사용하여이를 절차로 쉽게 스크립팅 할 수 있습니다. 그러나 당신은 당신이 직접 할 수 있다고 말했다 ;-)

Ghostscript의 도움으로 이것을 해결하는 방법 ...

... 그리고 그것의 재미를 위해, 나는 최근에 그것을 한 적이 없는 입력 파일이 특징 "더블 업"페이지 만 "고음 업"을 하나. 이 사례에 대한 답변은 여기를 참조하십시오 .

당신의 경우는 더 간단합니다. 당신은 이것과 비슷한 것을 가지고 있습니다 :

+------------+------------+   ^
|            |            |   |
|      1     |      2     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
             ^
            fold
             v
+------------+------------+   ^
|            |            |   |
|      3     |      4     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
<---------- 842 pt -------->

크기가 각각 421pt x 595pt 인 4 페이지로 1 개의 PDF를 만들려고합니다.

첫 번째 단계

먼저 각 입력 페이지에서 왼쪽 섹션을 추출해 보겠습니다.

gs \
    -o left-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [0 0]>> setpagedevice" \
    -f double-page-input.pdf

이 매개 변수는 무엇을 했습니까?

먼저 PDF에서 1 inch == 72 points 입니다. 나머지는 다음과 같습니다.

  • -o ...............:출력 파일 이름을 지정합니다. 암시 적으로도 사용합니다 -dBATCH -dNOPAUSE -dSAFER.
  • -sDEVICE=pdfwrite : 우리는 PDF를 출력 형식으로 원합니다.
  • -g................:출력 미디어 크기를 픽셀 단위로 설정합니다. pdfwrite의 기본 해상도는 720dpi입니다. 따라서 PageOffset과 일치하도록 10을 곱하십시오.
  • -c "..............:기본 입력 파일 바로 앞에있는 Postscript 코드 스 니펫을 처리하도록 Ghostscript에 요청합니다 (다음에 와야 함 -f).
  • <</PageOffset ....:매체에서 페이지 이미지의 이동을 설정합니다. (물론, 왼쪽 페이지의 시프트 [0 0]는 실제 효과가 없습니다.)
  • -f ...............: 이 입력 파일을 처리하십시오.

마지막 명령으로 얻은 결과는 무엇입니까?

이 하나:

Output file: left-sections.pdf, page 1
+------------+  ^
|            |  |
|     1      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: left-sections.pdf, page 2
+------------+  ^
|            |  |
|     3      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

두번째 단계

다음으로 올바른 섹션 :

gs \
    -o right-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [-421 0]>> setpagedevice" \
    -f double-page-input.pdf

보기 영역을 고정 상태로 유지하면서 페이지를 왼쪽으로 이동하므로 음수 오프셋에 유의하십시오.

결과:

Output file: right-sections.pdf, page 1
+------------+  ^
|            |  |
|     2      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: right-sections.pdf, page 2
+------------+  ^
|            |  |
|     4      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

마지막 단계

이제 페이지를 하나의 파일로 결합합니다. 우리는 고스트 스크립트로도 그렇게 할 수 있지만 pdftk,이 작업이 더 빠르기 때문에 대신 사용할 것입니다.

pdftk \
  A=right-sections.pdf \
  B=left-sections.pdf \
  shuffle \
  output single-pages-output.pdf
  verbose

끝난. 원하는 결과는 다음과 같습니다. 크기가 421x595pt 인 4 개의 다른 페이지

결과:

+------------+ +------------+ +------------+ +------------+   ^
|            | |            | |            | |            |   |
|     1      | |     2      | |     3      | |     4      |   |
|            | |            | |            | |            |5595 pt
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
+------------+ +------------+ +------------+ +------------+   v
<-- 421 pt --> <-- 421 pt --> <-- 421 pt --> <-- 421 pt -->

@ 알 수 없음 : downvoting 주셔서 감사합니다! 이에 대한 몇 가지 이유를 나타내는 의견을 작성해 주시겠습니까?
커트 파이 플

ASCII 아트를 굉장히 사용하고 명확한 지침을 보려면 +1하십시오. 그냥 CLI n00b이기 때문에 \ s는 줄을 이스케이프하므로 쉽게 읽을 수 있습니까?
Journeyman Geek

@mullhausen : 오타를 수정 해 주셔서 감사합니다 ( 421-> -421). ;-)
커트 파이 플

6

하나의 입력 페이지 (페이지 기울이기 또는 자르기)에 대해 여러 페이지로 PDF를 작성하는 데 사용할 수있는 pdfposter 도구 가 있습니다. posterPostScript 파일에 대해서도 동일한 도구와 유사 합니다.


pdfposter는 가장자리에 겹치는 내용 인쇄를 처리하지 않으므로 포스터를보다 쉽게 ​​조립할 수 있습니다. 그러나 Perl 스크립트이므로 추가하기가 쉽습니다.
Matthias Urlichs 12

3

그래서, 더 많은 검색 한 후 (이 그 "PDF 컷 페이지를"것입니다 훨씬 더 나은 검색), 내가 찾은라는 작은 스크립트 unpnup하는 용도 poster, PDF / PS 변환하고,pdftk 정확히 내가 무엇을해야합니다. 약간 먼 길이지만, 이미지를 뱉어 내기 전에 페이지를 래스터 화하지 않기 때문에 내가 찾은 다른 방법 (예 : imagemagick 사용)보다 훨씬 우수합니다.

어떤 이유로 mobileread가 사라질 경우를 대비하여 스크립트의 핵심 (GPLv2 이상에서 Harald Hackenberg에 의해 사용 허가 됨 <hackenberggmx.at>)은 다음과 같습니다.

pdftk "$1" burst
for file in pg*.pdf;
do
    pdftops -eps $file
    poster -v -pA4 -mA5 -c0% `basename $file .pdf`.eps > `basename $file .pdf`.tps
    epstopdf `basename $file .pdf`.tps
done
pdftk pg*.pdf cat output ../`basename $1 .pdf`_unpnuped.pdf

1
사람들이 자신의 질문에 대답 할 때 좋아합니다. 그러나 GUI로해야 할 경우, 특히 페이지 크기가 고르지 않거나 각면
frabjous

모든 변환없이 PDFTK만으로 원하는 작업을 수행 할 수 있어야합니다.
CarlF

@CarlF : 가능하다고 생각했지만 PDFTK 매뉴얼 페이지에서 페이지의 내용을 조작하는 것을 볼 수 없습니다. 나에게 어떤 조언이 있습니까?
울림

@frabjous : 자신의 질문에 대답하는 데 무엇이 문제입니까?
Kurt Pfeifle

1
@womble : 전환은 PS / EPS를 통해 이루어집니다. 이로 인해 품질이 저하 될 수 있습니다 (내장 글꼴, 투명 필름 등). 내 제안은 위험한 PDF => EPS => PDF경로를 피하고 더 안전한 PDF => PDF => PDF길을 간다 .
커트 파이 플

2

Kurt Pfeifle의 답변이 비슷한 상황에 매우 도움이된다는 것을 알았습니다. 솔루션 수정 사항을 다른 사람들과 공유 할 수 있다고 생각했습니다 ...

나도 각 시트에 2 페이지가있는 스캔 된 PDF를 가지고있었습니다. 처음 스캔 할 때 스테이플이 남아있는 중철 소책자의 11 x 8.5 (인치) 스캔입니다. PDF 페이지 1 = 뒷면 및 앞 표지; PDF 2 페이지 = 2 페이지 및 3 페이지 등. 화면에 잘 표시되지만 인쇄 할 수없고 스테이플 링하여 더 많은 소책자를 복사하십시오.

양면 복사기에 이것을 인쇄 할 수 있어야했습니다. 즉, 인쇄 할 준비가 된 "인 포지션"PDF로 다시 되돌립니다. 따라서 Kurt의 솔루션을 사용 하여이 (ahem) "한 줄짜리"를 만들어 올바른 페이지 순서로 다시 반 페이지로 다시 변환했습니다. 그것은 모든 높이와 너비뿐만 아니라 여러 페이지에서도 작동합니다. 제 경우에는 40 페이지짜리 소책자 (PDF로 20 페이지를 스캔했습니다)가있었습니다.

HEIGHT=8.5 WIDTH=11 ORIG_FILE_PATH="original.pdf" \
count=$(set -xe; \
gs -o left.pdf -sDEVICE=pdfwrite \
-g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \
-c "<</PageOffset [0  0]>> setpagedevice" \
-f "$ORIG_FILE_PATH" >/dev/null; \
gs -o right.pdf -sDEVICE=pdfwrite \
-g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \
-c "<</PageOffset [-$(perl -e "print(($WIDTH / 2) * 72)")  0]>> setpagedevice" \
-f "$ORIG_FILE_PATH" | grep Page | wc -l ); \
echo '>>>>>' Re-ordering $count pages...; \
(set -xe; pdftk A=right.pdf B=left.pdf cat \
A1 `set +xe; for x in $(seq 2 $count); do echo B$x A$x; done` B1 \
output ordered.pdf); \
echo "Done. See ordered.pdf"

HEIGHT 및 WIDTH 및 ORIG_FILE_PATH를 지정하려면이 명령에서 처음 몇 개의 매개 변수 만 변경하면됩니다. 명령의 나머지 부분은 다양한 크기를 계산하고 gs를 두 번 호출 한 다음 pdftk를 호출합니다. 스캔 한 페이지를 계산 한 다음 올바른 정렬 사양을 생성합니다 (내가 시나리오에 따라).

수행중인 작업에 대한 진행 상황을 출력합니다.

+++ perl -e 'print((11 / 2) * 720)'
+++ perl -e 'print(8.5 * 720)'
++ gs -o left.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [0  0]>> setpagedevice' -f original.pdf
++ wc -l
++ grep Page
+++ perl -e 'print((11 / 2) * 720)'
+++ perl -e 'print(8.5 * 720)'
+++ perl -e 'print((11 / 2) * 72)'
++ gs -o right.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [-396  0]>> setpagedevice' -f original.pdf
>>>>> Re-ordering 20 pages...
++ set +xe
+ pdftk A=right.pdf B=left.pdf cat A1 B2 A2 B3 A3 B4 A4 B5 A5 B6 A6 B7 A7 B8 A8 B9 A9 B10 A10 B11 A11 B12 A12 B13 A13 B14 A14 B15 A15 B16 A16 B17 A17 B18 A18 B19 A19 B20 A20 B1 output ordered.pdf
Done. See ordered.pdf

다음으로, 인쇄 된 소책자에 필요한 페이지 임 포지션을 얻으려면 정확히 필요한 크기 (예 : 5.5 x 8.5)의 사용자 정의 페이지 크기로 ordered.pdf를 "print"하여 "소책자 제작" "도구 (저의 경우 http://download.cnet.com/Create-Booklet/3000-2088_4-86349.html 에서 Christoph Vogelbusch의 Mac 용 소책자 만들기를 사용했습니다. )를 사용했습니다.

결과 PDF는 이제 한 장에 2 페이지 씩 11 x 8.5의 원래 페이지 크기로 다시 돌아가지만 양면, 짧은 가장자리 제본 및 출력으로 인쇄 할 수 있습니다. 원본을 분해하거나 반드시 보지 않아도 원본 소책자를 재생성 할 수있는 인쇄물을 복사하여 접고 안장을 꿰맬 수 있습니다.

이것이 누군가를 돕기를 바랍니다!

-씨


1

위의 piptas의 답변을 기반으로합니다 .

Windows에서 시작시 단일 표지 이미지로 레터 크기 PDF를 분할하는 경우 다음이 저에게 효과적이었습니다. 두 번째 단계에서 [-612 0]을 사용하면 양의 값이 잘못된 방향으로 밀려서 빈 페이지가 생성됩니다. .)

gswin32c -o left-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

-dFirstPage=2gs가 2 페이지에서 처리를 시작하도록 지시 하는 사용법에 유의하십시오 .

gswin32c -o right-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [-612 0]>> setpagedevice" -f input.pdf

이것은 같은 방식으로 right-sections.pdf를 만듭니다. 그리고 이제 표지 이미지 :

gswin32c -o cover.pdf -sDEVICE=pdfwrite -dLastPage=1 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

다음으로, 수동 페이지 입력을 사용하여 pdftk와 병합하고 싶지 않기 때문에 왼쪽 및 오른쪽 섹션을 새 디렉토리에서 별도의 PDF로 분할했습니다.

mkdir input_file
copy cover.pdf input_file\0000.pdf
pdftk left-sections.pdf burst output input_file\%04d_A.pdf
pdftk right-sections.pdf burst output input_file\%04d_B.pdf

그런 다음 알파벳순으로 해당 디렉토리의 PDF에 가입하고 운 좋게도 올바른 순서로 정렬되어 있음을 의미합니다. 고스트 스크립트를 통해 결과를 다시 실행하여 "경고 : 0..65535 범위에서 생성 번호를 벗어난 것으로 가정합니다. 0. " ghostscript "itext-paulo-155 (itextpdf.sf.net-lawagie.com)"이라는 pdftk에서 생성 된 오류-또한 사용 중에 파일 크기가 절반으로 줄었습니다. 4.5MB 원본의 경우 pdftk의 결과는 6.7MB이고 gswin32c의 재 처리는 3.2MB로 줄었습니다.

pdftk input_file\*.pdf cat output input_temp.pdf
gswin32c -o final_output.pdf -sDEVICE=pdfwrite -f input_temp.pdf

그리고 우리는 끝났습니다! input_file 폴더, cover.pdf, input_temp.pdf, right_sections.pdf 및 left_sections.pdf를 자유롭게 삭제하십시오. ;-)


1

왼쪽 PDF를 모두 하나의 문서로 출력하고 오른쪽 PDF를 모두 하나의 문서로 출력 해야하는 경우 Kurt Pfeifle의 답변을 기반으로 한 다음 스크립트가 트릭을 수행합니다 (모든 높이에서 작동합니다. 폭):

$ cat split.sh
#!/bin/bash                                                                     

dims=$(pdfinfo "$1" | grep -i "page size:" | cut -d ":" -f2)                    
width=$(echo "$dims" | cut -d " " -f7)                                          
height=$(echo "$dims" | cut -d " " -f9)                                         
half_width=$(echo "$width * 0.5" | bc -l | cut -d "." -f1)                      
half_widthtt=$(echo "$width * 5" | bc -l | cut -d "." -f1)                      
heighttt=$(echo "$height * 10" | bc -l | cut -d "." -f1)                        

echo "pdf $1 has height $height and width $width"                               

gs -o "left-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [0 0]>> setpagedevice" -f "$1"
gs -o "right-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [-$half_width 0]>> setpagedevice" -f "$1"

다음과 같이 실행하십시오.

$ ./split.sh thepdftosplit.pdf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.