2016-10-17 6 views
1

Ich versuche, einen einzeiligen Linux-Befehl zu erstellen, um zwei PDF-Dateien - die von einer URL heruntergeladen werden - mit Ghostscript zu kombinieren. Wie auch immer, Ich möchte keine temporären Dateien erstellen (alles sollte im Speicher durchgeführt werden).Piping mehrere Eingänge in Ghostscript

Der folgende Befehl scheint nicht zu funktionieren (ich versuchte, dies durch Prozesssubstitution zu erreichen).

gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=combined.pdf <(curl http://example.com/one.pdf) <(curl http://example.com/two.pdf) 

Wenn ich diesen Befehl ausführen, gibt es mir den Fehler unten.

**** Warning: An error occurred while reading an XREF table. 
**** The file has been damaged. This may have been caused 
**** by a problem while converting or transfering the file. 
**** Ghostscript will attempt to recover the data. 
Error: /ioerror in --run-- 
Current allocation mode is local 
Last OS error: Illegal seek 
GPL Ghostscript 9.18: Unrecoverable error, exit code 1 

Ich glaube, was ist passiert, dass der Ghostscript-Befehl ausgeführt wird, bevor die beiden Eingänge PDFs eine Chance gehabt hat, das Herunterladen zu beenden, vielleicht ist es eine Möglichkeit, dies zu warten, um geschehen.

Antwort

0

OK, es gibt hier einige Probleme;

Erstens, Ghostscript und das PDFwrite-Gerät kombinieren keine PDF-Dateien. Die Eingabe (n) werden vollständig interpretiert, in Grafikgrundelemente konvertiert und an das Gerät gesendet. Wiedergabegeräte verwenden die Grafikbibliothek, um die Grundelemente zu einer Bitmap zu rendern, Vektorgeräte erstellen eine Darstellung des Grundelements auf hoher Ebene und schreiben sie in die Ausgabe in der entsprechenden Sprache. Es ist wichtig zu beachten, dass der Inhalt der Ausgabedatei keine Beziehung zum Inhalt der Eingabedatei hat. Nur das visuelle Ergebnis sollte beim Rendern gleich sein.

Zweitens können Sie temporäre Dateien nicht vermeiden. Wenn Sie eine PDF-Datei per stdin nach Ghostscript leiten, erstellt sie einfach eine temporäre Datei und speichert die gesamte Datei darin. Dies ist notwendig, da PDF-Dateien einen zufälligen Zugriff erfordern, um interpretiert zu werden.

Schließlich können Sie von stdin nicht zweimal in der Befehlszeile pipen. Um zwei Dateien zu bearbeiten, müssen Sie entweder Ihre eigene Schnittstelle zu Ghostscript schreiben und die Stream-Schnittstelle zum Senden von Daten verwenden oder sie beide in die Befehlszeile setzen.

So: gs file1.pdf file2.pdf

Was Sie versuchen, einfach zu tun, wird nicht funktionieren, und auf jeden Fall nicht daran hindert, die Erstellung der beiden PDF-Dateien, es ist nur, dass Ghost erstellt sie für dich, wo du sie nicht sehen kannst.