Wie erreiche ich, dass alle Seiten von pdfcrop gleich groß ausgegeben werden?

Wie erreiche ich, dass alle Seiten von pdfcrop gleich groß ausgegeben werden?

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 --verboseFlagge 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 shShell-Funktion, um alle PDF-Seiten auf die gleiche Größe zuzuschneiden. Die Funktion hängt von pdfcropund 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 pdfconstcropanstelle von pdfcrop. Die üblichen pdfcropOptionen funktionieren weiterhin. Einige Beispiele:

  • pdfconstcrop in.pdfschreibt das Ergebnis nach in-crop.pdf.
  • pdfconstcrop in.pdf out.pdfschreibt das Ergebnis inout.pdf
  • pdfconstcrop --margins 50 in.pdflä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 pdfcropSkript 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:

  1. Führen Sie den regulären pdfcropBefehl mit aus --debug, zB:

    pdfcrop --debug foo.pdf
    

    Aufgrund von --debugwird die tmp-pdfcrop-*.texerstellte Datei nicht gelöscht. Notieren Sie sich außerdem den pdftex(oder welchen) Befehl es am Ende ausgeführt hat, falls Sie spezielle Optionen an übergeben haben pdfcropund es daher nicht trivial ist.

  2. 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.texDies wird mit unterschiedlichen Begrenzungsrahmen ausgegeben .

  3. Führen Sie den pdftex(oder einen beliebigen anderen) Befehl, der pdfcropaufgerufen wurde, mit dieser Datei aus:

    pdftex -no-shell-escape -interaction=nonstopmode tmp-pdfcrop-common.tex
    
  4. Ü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.pdfso 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.

verwandte Informationen