비머(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)
용법:
다음과 같이 일반
pdfcrop
명령을 실행합니다--debug
.pdfcrop --debug foo.pdf
때문에 생성된 파일은
--debug
삭제되지 않습니다 . 또한 특별한 옵션을 전달한 경우 마지막에 실행된 명령(또는 무엇이든)을tmp-pdfcrop-*.tex
기록해 두십시오 .pdftex
pdfcrop
tmp-pdfcrop-*
위의 스크립트를 통해 파일을 전달합니다 . 예:python find-common.py < tmp-pdfcrop-34423.tex > tmp-pdfcrop-common.tex
tmp-pdfcrop-common.tex
이것은 다른 경계 상자로 작성됩니다 .이 파일을 사용하여 호출된
pdftex
명령(또는 무엇이든)을 실행하십시오 .pdfcrop
pdftex -no-shell-escape -interaction=nonstopmode tmp-pdfcrop-common.tex
결과 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%를 유지하면서 모든 페이지가 동일한 크기로 설정되고 자르기 양이 모든 페이지에서 균일하도록 자릅니다 . 출력 파일은 입력 파일 및 링크와 거의 동일한 크기이며 주석도 유지됩니다.