Ich weiß, dass ich eine PDF-Datei "linearisieren" kann, zum Beispiel mit dem Acrobat SDK oder mit kommerziellen Tools. Dies wird auch als "für das Web optimiert" bezeichnet. Das PDF wird neu angeordnet, sodass Seite 1 so schnell wie möglich geladen werden kann. Auf diese Weise bereitgestellte PDFs werden schneller angezeigt, da der PDF-Viewer nicht auf das Herunterladen der gesamten PDF-Datei warten muss.
Update: Ich bin mir nun bewusst, dass ein linearisiertes PDF nicht nur neu angeordnet wird, sondern auch Metadaten über seine eigene Struktur in Form des "Linearisierungswörterbuchs" enthält. p>
Ich habe eine Anwendung, in der ich mehrere PDFs (die Ergebnisse einer Abfrage) vorab abrufen möchte, in Erwartung, dass der Benutzer einen von ihnen sehen möchte. Es wäre toll, wenn mein Kunde Seite 1 und nur Seite 1 für jedes Suchergebnis herunterladen könnte. Wenn der Benutzer einen von ihnen auswählt, kann Seite 1 sofort angezeigt werden, und der Rest kann im Hintergrund heruntergeladen werden.
Ich suche nach einer allgemeinen Lösung, die serverseitig (Windows oder Linux) verwendet werden kann, um meine PDFs vorzuverarbeiten, so dass ich Seite 1 und den Rest separat speichern und bereitstellen kann. Wirklich, alles was ich wissen muss ist, wo in der PDF das letzte Byte ist, das benötigt wird, um Seite 1 richtig anzuzeigen. Wenn ich diese Nummer haben kann, folgt alles andere.
Ich habe die ISO-Spezifikation für PDF , aber das Dateiformat scheint zu komplex für mich, um einfach herauszufinden, wo Seite 1 endet. Auf der anderen Seite müssen die Werkzeuge, die PDFs linearisieren, fast sicher wissen, wo Seite 1 endet.
Ich bin nicht an den Komplikationen interessiert, PDFs in Stücken an die Kunden zu liefern; Dieser Teil ist bereits gelöst, da der Client eine App ist, kein Browser, und ich habe die volle Kontrolle.
Ich glaube auch nicht, dass es mir helfen wird, das PDF mit Tools wie AP Split in eine "Seite" aufzuteilen 1 "PDF und ein komplettes PDF. Wenn ich das tue, kann ich den Client-Viewer nicht glauben, dass es sich um eine einzelne PDF-Datei handelt, und es wird merkliches Flimmern geben, wenn ich die PDF-Datei "Seite 1" durch die vollständige PDF-Datei ersetze.
Jede Hilfe oder Hinweise geschätzt.
Lösung (basierend auf Bobrovsky's Antwort unten):
Eine ordnungsgemäß linearisierte PDF beginnt mit einer Kopfzeile (definiert in Abschnitt 7.5.2 der PDF-Spezifikation) wie "% PDF-1.7", gefolgt von einer Kommentarzeile mit mindestens vier Binärzeichen (definiert als Bytewerte von 128) oder höher). Zum Beispiel:
%Vor%Dieser Überschrift folgt unmittelbar das Linearisierungswörterbuch (definiert in Anhang F in der PDF-Spezifikation). Ein Beispiel:
%Vor%In diesem Beispiel befindet sich das Ende der ersten Seite beim Byte-Offset 5437. Diese Datenstruktur ist einfach genug, um unter Verwendung nahezu jeder Sprache zu parsen. Das Objekt "43 0 obj" gibt eine ID für dieses Wörterbuch (43) und eine Generationsnummer (bei linearisierten Dateien immer Null). Das Wörterbuch selbst ist umgeben von & lt; & lt; und & gt; & gt; zwischen denen Schlüsselwertpaare sind (Schlüssel haben Schrägstriche wie "/ E").
Und hier ist eine C # -Methode, die die relevante Zahl mit einem Regex findet:
%Vor%Beachten Sie Bobrovskys Vorbehalt, dass eine Datei das Linearisierungswörterbuch enthalten kann, aber möglicherweise nicht richtig linearisiert ist (vielleicht aufgrund einer inkrementellen Bearbeitung?). In meinem Fall ist das kein Problem, da ich alle PDFs selbst linearisieren werde.
Das Linearisierungswörterbuch sollte Ihnen dabei helfen.
Das Wörterbuch muss den E
-Parameter enthalten, der
Der Offset des Endes der ersten Seite (das Ende von Teil 6 in Beispiel F.1), relativ zum Anfang der Datei.
Bitte beachten Sie, dass nicht jede Datei mit einem Linearisierungswörterbuch tatsächlich linearisiert ist (defekte Generatoren, Änderungen nach der Linearisierung usw.). Daher können Sie die beschriebene Vorgehensweise möglicherweise nicht verwenden, wenn Ihre Dateien nicht ordnungsgemäß linearisiert sind. p>
Weitere Informationen zum Linearisierungswörterbuch finden Sie in F.2.2 Linearisierungsparameterwörterbuch (Teil 2) in der PDF-Referenz.