pdfcrop에서 동일한 크기의 모든 페이지를 출력하려면 어떻게 해야 합니까?

pdfcrop에서 동일한 크기의 모든 페이지를 출력하려면 어떻게 해야 합니까?

비머(ppsplit 사용)로 가져오기 위해 pdf로 변환한 파워포인트 애니메이션을 자르려고 하는데 pdfcrop공백을 줄이기 위해 (texlive에서) 실행하면 각 페이지가 다른 크기가 되도록 페이지가 개별적으로 잘립니다. 모든 페이지가 가장 큰 페이지와 같은 크기가 되도록 만드는 방법이 있나요?

답변1

나는 --verbose플래그가 각 단계에서 사용되는 경계 상자를 출력한다는 것을 발견했습니다. 이것은 "성장" 애니메이션이므로 마지막 페이지가 가장 큽니다.

따라서 모두 동일한 크기를 얻으려면 --verbose를 사용하여 pdfcrop을 실행하고 다음 출력을 추출했습니다.

%%HiResBoundingBox: 48.000022 299.872046 624.124950 420.127932

그런 다음 경계 상자를 지정하여 두 번째 pdfcrop 실행에 적용했습니다.

pdfcrop --bbox "48.000022 299.872046 624.124950 420.127932" ~/animation.pdf

답변2

sh다음은 모든 PDF 페이지를 동일한 크기로 자르는 쉘 기능 입니다 . 기능은 pdfcrop및 GNU 에 의존하므로 datamash반드시 설치하세요.

pdfconstcrop() {
    pdfcrop --bbox "$(
        pdfcrop --verbose "$@" |
        grep '^%%HiResBoundingBox: ' |
        cut -d' ' -f2- |
        LC_ALL=C datamash -t' ' min 1 min 2 max 3 max 4
    )" "$@"
}

위의 코드 블록을 터미널에 복사하여 붙여넣은 pdfconstcrop다음 pdfcrop. 일반적인 pdfcrop옵션은 여전히 ​​작동합니다. 몇 가지 예:

  • pdfconstcrop in.pdf에 결과를 씁니다 in-crop.pdf.
  • pdfconstcrop in.pdf out.pdf결과를 에 씁니다.out.pdf
  • pdfconstcrop --margins 50 in.pdf각 측면에 (적어도) 50pt 여백을 둡니다.

답변3

마지막 페이지가 가장 크지 않으면 모든 페이지의 최대 너비와 높이를 계산한 다음 이 값을 사용하여 올바른 경계 상자를 결정해야 합니다. 경계 상자의 네 좌표는 다음과 같습니다.

  • 왼쪽 위 모서리의 x 좌표(페이지 왼쪽 가장자리로부터의 거리),
  • 왼쪽 상단 모서리의 y 좌표(페이지 상단 가장자리로부터의 거리),
  • 오른쪽 하단 모서리의 x 좌표(페이지 왼쪽 가장자리로부터의 거리),
  • 오른쪽 하단 모서리의 y 좌표(페이지 상단 가장자리로부터의 거리).

각 페이지에 대한 올바른 경계 상자를 계산하고 사용하는 것은 스크립트에 대한 적절한 패치 pdfcrop(Perl로 작성됨)를 사용하여 수행할 수 있지만 저는 Perl에 익숙하지 않기 때문에 대신 Python에서 수행했습니다. 누군가에게 유용할 경우를 대비한 스크립트는 다음과 같습니다.

import re, sys
lines = sys.stdin.readlines()
width = height = 0
# First pass: compute |width| and |height|.
for line in lines:
  m = re.match(r'\\page (\d*) \[([0-9.]*) ([0-9.]*) ([0-9.]*) ([0-9.]*)\](.*)', line, re.DOTALL)
  if m:
    page, xmin, ymin, xmax, ymax, rest = m.groups()
    width = max(width, float(xmax) - float(xmin))
    height = max(height, float(ymax) - float(ymin))
# Second pass: change bounding boxes to have width |width| and height |height|.
for line in lines:
  m = re.match(r'\\page (\d*) \[([0-9.]*) ([0-9.]*) ([0-9.]*) ([0-9.]*)\](.*)', line, re.DOTALL)
  if m:
    page, xmin, ymin, xmax, ymax, rest = m.groups()
    xmin = float(xmin)
    ymin = float(ymin)
    xmax = float(xmax)
    ymax = float(ymax)
    # We want |xmin| and |xmax| such that their difference is |width|
    addx = (width - (xmax - xmin)) / 2.0
    xmin -= addx
    xmax += addx
    # We want |ymin| and |ymax| such that their difference is |height|
    addy = (height - (ymax - ymin)) / 2.0
    ymin -= addy
    ymax += addy
    sys.stdout.write(r'\page %s [%s %s %s %s]%s' % (page, xmin, ymin, xmax, ymax, rest))
  else:
    sys.stdout.write(line)

용법:

  1. 다음과 같이 일반 pdfcrop명령을 실행합니다 --debug.

    pdfcrop --debug foo.pdf
    

    때문에 생성된 파일은 --debug삭제되지 않습니다 . 또한 특별한 옵션을 전달한 경우 마지막에 실행된 명령(또는 무엇이든)을 tmp-pdfcrop-*.tex기록해 두십시오 .pdftexpdfcrop

  2. tmp-pdfcrop-*위의 스크립트를 통해 파일을 전달합니다 . 예:

    python find-common.py < tmp-pdfcrop-34423.tex > tmp-pdfcrop-common.tex
    

    tmp-pdfcrop-common.tex이것은 다른 경계 상자로 작성됩니다 .

  3. 이 파일을 사용하여 호출된 pdftex명령(또는 무엇이든)을 실행하십시오 .pdfcrop

    pdftex -no-shell-escape -interaction=nonstopmode tmp-pdfcrop-common.tex
    
  4. 결과 PDF 파일을 확인하고 원하는 대로 이름을 바꿉니다.

    mv tmp-pdfcrop-common.pdf foo-crop.pdf
    

답변4

질문에 이상적으로 맞는 Python 패키지가 있습니다.https://github.com/abarker/pdfCropMargins

예를 들어 다음 명령을 사용하세요.

$ pdf-crop-margins -u -s in.pdf

in.pdf기본적으로 기존 여백의 10%를 유지하면서 모든 페이지가 동일한 크기로 설정되고 자르기 양이 모든 페이지에서 균일하도록 자릅니다 . 출력 파일은 입력 파일 및 링크와 거의 동일한 크기이며 주석도 유지됩니다.

관련 정보