Ich versuche, eine Powerpoint-Animation, die ich in PDF konvertiert habe, für den Import in Beamer zuzuschneiden (mit ppsplit), aber wenn ich sie ausführe pdfcrop
(von Texlive), um die Leerzeichen zu reduzieren, schneidet sie die Seiten einzeln zu, sodass jede Seite eine andere Größe hat. Gibt es eine Möglichkeit, alle Seiten so zu gestalten, dass sie die gleiche Größe wie die größte Seite haben?
Antwort1
Ich habe festgestellt, dass die --verbose
Flagge den bei jedem Schritt verwendeten Begrenzungsrahmen ausgibt. Da es sich um eine „wachsende“ Animation handelte, ist die letzte Seite die größte.
Um sie alle auf die gleiche Größe zu bringen, habe ich pdfcrop mit --verbose ausgeführt und diese Ausgabe extrahiert:
%%HiResBoundingBox: 48.000022 299.872046 624.124950 420.127932
und habe dies dann einem zweiten Durchlauf von pdfcrop zugeführt und dabei den Begrenzungsrahmen angegeben:
pdfcrop --bbox "48.000022 299.872046 624.124950 420.127932" ~/animation.pdf
Antwort2
Hier ist eine sh
Shell-Funktion, um alle PDF-Seiten auf die gleiche Größe zuzuschneiden. Die Funktion hängt von pdfcrop
und GNU ab datamash
, stellen Sie also sicher, dass Sie sie installieren.
pdfconstcrop() {
pdfcrop --bbox "$(
pdfcrop --verbose "$@" |
grep '^%%HiResBoundingBox: ' |
cut -d' ' -f2- |
LC_ALL=C datamash -t' ' min 1 min 2 max 3 max 4
)" "$@"
}
Kopieren Sie den obigen Codeblock, fügen Sie ihn in Ihr Terminal ein und verwenden Sie dann einfach pdfconstcrop
anstelle von pdfcrop
. Die üblichen pdfcrop
Optionen funktionieren weiterhin. Einige Beispiele:
pdfconstcrop in.pdf
schreibt das Ergebnis nachin-crop.pdf
.pdfconstcrop in.pdf out.pdf
schreibt das Ergebnis inout.pdf
pdfconstcrop --margins 50 in.pdf
lässt (mindestens) 50pt Ränder auf jeder Seite.
Antwort3
Wenn die letzte Seite nicht die größte ist, müssen wir die maximale Breite und Höhe aller Seiten berechnen und diese Werte dann verwenden, um die richtigen Begrenzungsrahmen zu bestimmen. Beachten Sie, dass die vier Koordinaten in einem Begrenzungsrahmen sind:
- x-Koordinate (Abstand vom linken Seitenrand) der oberen linken Ecke,
- y-Koordinate (Abstand vom oberen Seitenrand) der oberen linken Ecke,
- x-Koordinate (Abstand vom linken Seitenrand) der unteren rechten Ecke,
- Y-Koordinate (Abstand vom oberen Seitenrand) der unteren rechten Ecke.
Das Berechnen und Verwenden der richtigen Begrenzungsrahmen für jede Seite könnte mit einem entsprechenden Patch für das pdfcrop
Skript erfolgen (es ist in Perl geschrieben), aber da ich mit Perl nicht sehr vertraut bin, habe ich es stattdessen in Python gemacht; hier ist das Skript, falls es jemandem nützlich ist.
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)
Verwendung:
Führen Sie den regulären
pdfcrop
Befehl mit aus--debug
, zB:pdfcrop --debug foo.pdf
Aufgrund von
--debug
wird dietmp-pdfcrop-*.tex
erstellte Datei nicht gelöscht. Notieren Sie sich außerdem denpdftex
(oder welchen) Befehl es am Ende ausgeführt hat, falls Sie spezielle Optionen an übergeben habenpdfcrop
und es daher nicht trivial ist.Führen Sie die
tmp-pdfcrop-*
Datei durch das obige Skript, zum Beispiel:python find-common.py < tmp-pdfcrop-34423.tex > tmp-pdfcrop-common.tex
tmp-pdfcrop-common.tex
Dies wird mit unterschiedlichen Begrenzungsrahmen ausgegeben .Führen Sie den
pdftex
(oder einen beliebigen anderen) Befehl, derpdfcrop
aufgerufen wurde, mit dieser Datei aus:pdftex -no-shell-escape -interaction=nonstopmode tmp-pdfcrop-common.tex
Überprüfen Sie die resultierende PDF-Datei und benennen Sie sie nach Belieben:
mv tmp-pdfcrop-common.pdf foo-crop.pdf
Antwort4
Es gibt ein Python-Paket, das meiner Meinung nach ideal zur gestellten Frage passt:https://github.com/abarker/pdfCropMargins
Beispielsweise der Befehl:
$ pdf-crop-margins -u -s in.pdf
schneidet in.pdf
so zu, dass alle Seiten auf die gleiche Größe eingestellt sind und der Zuschneidegrad auf allen Seiten einheitlich ist, wobei standardmäßig 10 % der vorhandenen Ränder beibehalten werden. Die Ausgabedatei hat ungefähr die gleiche Größe wie die Eingabedatei und Links und Anmerkungen bleiben ebenfalls erhalten.