Wie wird die Auflösung (DPI) von Bildern ermittelt, die in ein PDF-Dokument eingebettet sind?

8

Ich habe ein PDF-Dokument Das enthält auch Bilder.

Jetzt möchte ich die Auflösung dieser Bilder wissen.

Ein erster Schritt wäre, die Bilder irgendwie aus dem PDF-Dokument zu holen. Aber wie?

Ist das überhaupt möglich mit etwas, das in Cocoa zur Verfügung steht?

    
Daniel 24.07.2012, 18:22
quelle

5 Antworten

8

Sehen Sie sich diese Antwort für Ihre andere Frage an:

Im Grunde können Sie jetzt den (neuen) Parameter -list für Popplers pdfimages Kommandozeilenprogramm verwenden (es funktioniert NICHT für die XPDF-Version von pdfimages !).

Es werden die Dimensionen jedes Bildes auf den abgefragten Seiten angezeigt.

(Sie können damit auch Bilder aus einem PDF extrahieren: pdfimages -png -f 3 -l 5 some.pdf prefix--- extrahiert alle Bilder als PNGs aus der PDF-Datei, beginnend mit f erste Seite 3 und endend mit l auf Seite 5, mit einem Dateinamen-Präfix von prefix--- für jedes Bild, aber dieses Problem scheint nicht der Hauptfokus Ihrer Frage zu sein ...)

Beispiel:

%Vor%

Es wird nicht direkt die DPI-Auflösung gemeldet, aber aus den Dimensionen "Breite" und "Höhe" können Sie es leicht berechnen: Sie messen die Breite des Bildes auf Ihrem Bildschirm mit einem Zolllineal und teilen dann die Breite Pixel 'durch die gemessene Linealzahl ...

Sie finden das seltsam, weil das Ergebnis von Ihrer aktuellen Zoomstufe abhängt? Ja, ist es!

Das Konzept der "Auflösung" ist immer abhängig von der Umgebung. Ein sogenanntes "Hi-Res" -Bild hat grundsätzlich immer viele Pixel in Breite und Höhe. Dies ermöglicht eine bessere Qualität (oder "Auflösung"), wenn das Bild mit höheren Zoomstufen angezeigt oder gedruckt werden muss.

Aktualisieren

Inzwischen gibt es eine neue Version von (Poppler's) pdfimages :

%Vor%

Hier wird die Auflösung von eingebetteten Bildern in PPI (Pixel pro Zoll) in horizontaler ( x-ppi ) und vertikaler ( y-ppi ) Richtung angezeigt:

%Vor%

Diese neue Funktion erschien zuerst in Poppler Version 0.25 (veröffentlicht am 11. Dezember 2013). Es meldet zusätzlich ...

  • ... (Datei-) Größen und
  • ... (Komprimierungsverhältnisse)

... von eingebetteten Bildern.

Einschränkungen von pdfimages -list

Vielleicht sollte ich Sie auch auf die Einschränkungen des Dienstprogramms pdfimages aufmerksam machen und ein Beispiel geben, bei dem der Ausgabebericht nicht vollständig korrekt ist.

Ein Beispiel ist dieses handcodierte PDF von meinem (kürzlich erstellten) GitHub-Repository von PDFs, um Anfängern zu helfen, die Syntax von PDF zu studieren Quellcode .

Ich habe dieses PDF ursprünglich erstellt, um einen Fehler mit Mozillas PDF.js Renderer . Hier ist ein Screenshot, wie es in PDF.js aussieht (links) und wie es aussehen sollte wenn es richtig gerendert wird (rechts, gerendert von Ghostscript ) und Adobe Reader ):

(Klicken Sie mit der rechten Maustaste auf jedes der obigen Bilder. Wählen Sie "Bild in neuem Tab öffnen", um die genauen Unterschiede zu sehen ... ")

Die PDF-Datei enthält ein 2x2-Pixel-Bild, nur einmal eingebettet (mit Objekt-ID 5 0 ), aber wird auf der Seite mehrfach angezeigt mal mit verschiedenen Einstellungen , wo jedes Mal das Bild platziert wird ...

  • ... an einer anderen Stelle,
  • ... mit einer anderen Skalierung,
  • ... mit einer anderen Rotation,
  • ... sogar mit einem anderen skew .

Unter diesen extremen Umständen fällt pdfimages -list beim Versuch, einige der Auflösungen für Instanzen dieses Bildes zu bestimmen, flach auf die Nase:

%Vor%

pdfimages -list erhält die meisten Werte korrekt, wenn keine Rotation und / oder kein Skewing involviert ist. Es ist nicht verwunderlich, dass es Diskrepanzen gibt, wenn das Bild gedreht oder verzerrt wird: Denn wie würden Sie in solchen Fällen sogar zuverlässig einen x-ppi und y-ppi -Wert definieren ? Das erklärt die (völlig falschen) Werte von 72000 y-ppi für Bild-Nr. 5 und 14401 x-ppi für Bild-Nr. 8.

Wie Sie leicht sehen können, ist pdfimages ziemlich schlau, um andere Bildeigenschaften zu bestimmen:

  1. Es wird die gleiche Objekt-ID 5 0 für alle Instanzen des angezeigten Bilds korrekt angezeigt, um anzuzeigen, dass dieses Bild einmal eingebettet ist , aber Mehrfach angezeigt auf der Seite.
  2. Die Bilddimensionen werden korrekt als 2x2 pixels angezeigt.
Kurt Pfeifle 28.07.2012, 09:30
quelle
6

Es ist nicht einfach, aber es ist möglich. Während du es nicht mit PDFDocument machen kannst, kannst du stattdessen das CGPDF* Zeug in Quartz verwenden. Kurz gesagt: Sie müssen CGPDFPageGetDictionary() verwenden, um das Wörterbuch für die Seite zu erhalten, auf der sich das Bild befindet, und dann die Informationen über sein XObject aus dem Wörterbuch abrufen (vorausgesetzt, es ist nicht in den Stream eingebunden). Auch das ist nicht einfach - Sie müssen sich mit dem PDF-Standard beraten, um zu verstehen, wie das XObject formatiert werden kann, und dann die verschiedenen CG* -Routinen verwenden, um zu den benötigten Drilldowns zu gelangen.

Ich sollte hinzufügen, dass die Standard-DPI ("Benutzereinheit") für ein PDF-Dokument 72 ist. Außerdem werden viele Bilder in PDFs mit Vektorgrafiken erstellt, so dass sie nicht wirklich eine Standard-DPI haben.

    
Turix 24.07.2012 18:40
quelle
1

Sie benötigen die Dimensionen des Rohbild-XObject, auf das Sie mit dem Do-Befehl

zugreifen     
mark stephens 25.07.2012 07:23
quelle
1

Die Antwort ist definitiv nein, weil PDF-Dokumente keine eigentlichen Auflösungen haben. Die Lösung hängt letztlich davon ab, wer das Dokument und seine Elemente zu dem Zeitpunkt handhabt. Es kann sogar um den Zoomfaktor variieren, den Sie in Adobe Acrobat verwenden.

Ich habe zum Beispiel einen 2D-Barcode mit Abmessungen von 16 x 16 Pixeln erstellt und ihn auf einen Zoll und einen Zoll hoch skaliert, bevor er zum Dokument hinzugefügt wurde. Im adobe acrobat reader sieht es vollkommen klar aus (dh viele Pixel pro Quadratelement), aber wenn ich das resultierende PDF an einen Faxdienst sende, ist es letztendlich eine Auflösung von 100x200 (ungefähr). Wenn ich das gleiche Dokument in einem Laserdrucker drucke, wird es mehr wie 400 dpi. Wenn ich auf das Barcode-Bild im Acrobat-Reader klicke und es in Gimp kopiere / einfüge, erscheint es als winzige 16x16-Bitmap.

    
Jim W 23.01.2015 00:40
quelle
-1

Diese Antwort ist als Nachtrag zu @Kurt Pfeifles Antwort gedacht und arbeitet außerhalb von Ziel C.

Alternativ:

Wenn Sie ein Windows-System haben und keinen Compiler eingerichtet haben, ist das Folgende die einfachste Methode. Laden Sie die Windows XPDF-Binärdateien herunter. Verwenden Sie dann pdfimages , um die Bilder zu extrahieren, konvertieren Sie sie in ein BMP-Format, und mspaint sagt Ihnen dann die Auflösung. Die Vorteile dieser Methode sind:

  • Sie können eine genaue Auflösung erhalten, ohne sie durch Messung der Bildgröße schätzen zu müssen;

  • Es WILL funktioniert für die XPDF-Version von pdfimages .

Die Nachteile sind:

  • Es dauert etwas mehr Arbeit, einschließlich der Umwandlung der Datei in ein Format, das Sie öffnen können, ohne die Auflösung zu ändern;

  • Sie müssen dies für jede Datei einzeln tun, anstatt eine Liste zu erhalten.

  • Es gibt Ihnen die Auflösung der Bilder selbst, nicht die Auflösung, mit der sie in der PDF-Datei erschienen sind. (Danke an Kurt Pfeifles Kommentar)

Alex 12.06.2015 14:57
quelle