Welches Format ist diese Datei (beginnend mit "! R! SEM 9; EXIT;") und wie diese auf dem Bildschirm angezeigt wird

766
user450387

Ich habe die folgende Datei auf einem Kundensystem gefunden, und ich muss herausfinden, welches Format es ist (und wenn möglich), wie ich es in Windows öffnen kann (Win7 oder höher wäre vollkommen in Ordnung).

Es sollte eine Art Grafik- / Druckerformat sein. Der Dateiname enthält keine Erweiterung und wurde mit Windows 95 erstellt.

Dateiheader:

!R! SEM 9;EXIT; %-12345X@PJL JOB @PJL SET ECONOMODE=OFF  @PJL RDYMSG DISPLAY="" @PJL ENTER LANGUAGE=POSTSCRIPT M%!PS-Adobe-3.0 %%Title:  %%Creator: Kyocera Mita FS-1020D KX %%CreationDate: 10/24/2016 08:45 %%DocumentPrinterRequired: Kyocera Mita FS-1020D KX %%For:  %%BoundingBox: (atend) %%Pages: (atend) %%Orientation: (atend) %%PageOrder: Special %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginDefaults %%PageOrientation: Portrait %%PageBoundingBox: 12 10 407 587 %%PageMedia: (Plain) %%EndDefaults %%BeginProlog %%BeginResource: Macro_Basic /KPDLBASE 100 dict dup begin 

Es enthält mehr "%%" - Abschnitte, hier ohne Inhalt, da dies sensible Daten sein könnten:

%% Graphics ... %% Font ... %% Reencode ... %% T42 ... end def %%EndResource %%EndProlog %%BeginSetup KPDLBASE begin %%BeginFeature: *Resolution 600dpi BF{ <</HWResolution [600 600]>> SP <</PreRenderingEnhance t>> SP }EF %%EndFeature %%BeginFeature: *InputSlot (Auto Tray Select) BF{ <</DeferredMediaSelection t>> SP }EF %%EndFeature %%BeginFeature: *PageSize (A5) BF{ <</Policies <</PageSize 7>> /PageSize [422 595] /ImagingBBox n>> SP }EF %%EndFeature %%BeginFeature: *MediaType (Automatische Medienauswahl) BF{ }EF %%EndFeature %%BeginFeature: Copies 1 BF{ <</NumCopies 1>> SP }EF %%EndFeature %%BeginFeature: *Duplex None BF{ & ` f setduplexmode E }EF %%EndFeature %%BeginFeature: *Smoothing ON BF{ 1 & /setdoret g e }EF %%EndFeature %%BeginFeature: *Collate true BF{ userdict /UICollateDetails known not if userdict /UICollateDetails g @ /Mode 0 put /Hold 0 put <</Collate t /CollateDetails UICollateDetails>> SP }EF %%EndFeature /DTM [0.12000 0.0 0.0 -0.12000 10 587] d %%EndSetup KPDLBASE /PageSV save put %%Page: 1 1 %%PageOrientation: Landscape %%PageBoundingBox: (atend) %%BeginPageSetup [0.0 0.12000 0.12000 0.0 12 10] + G %%EndPageSetup 

Dann folgen ~ 2500 Inhaltszeilen und die folgende Fußzeile:

%%PageTrailer %%PageBoundingBox: 0 0 574 396 /PageSV where { pop PageSV restore } if %%Trailer %%Pages: 1 %%Orientation: Portrait Landscape %%BoundingBox: 0 0 574 396 %%EOF %-12345X@PJL EOJ %-12345X 

BEARBEITEN:

Hier ist der Code für eine C # -Konsole-Anwendung, die versucht, alle Dateien in einem bestimmten Verzeichnis in PDF-Dateien zu konvertieren. Bitte beachten Sie, dass ich die angegebenen Eingabedaten nicht validierte.

using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace PrintDataToPDF { class Program { static void Main(string[] args) { Console.WriteLine("Input filepath:"); string inputDir = Console.ReadLine();  DirectoryInfo dir = new DirectoryInfo(inputDir);  Console.WriteLine("Output filepath:");  string outputDir = Console.ReadLine();  List<FileInfo> fileList = new List<FileInfo>();  foreach (FileInfo item in dir.GetFiles()) { fileList.Add(item); }  Console.WriteLine(fileList.Count + " files found! Convertation is starting..");  foreach (FileInfo item in fileList) { string tempname = Path.GetTempFileName(); using (StreamReader reader = new StreamReader(item.FullName)) { string content = reader.ReadToEnd(); using (StreamWriter writer = new StreamWriter(tempname)) { writer.Write(content.Substring(content.IndexOf("%%"))); } Process.Start(@"C:\Program Files\gs\gs9.21\bin\gswin64c.exe", "-o " + outputDir + item.Name + "out.pdf -sDEVICE=pdfwrite "+ tempname); Console.WriteLine(item.Name + " was converted!"); } }  Console.WriteLine("DONE"); Console.ReadLine(); } } } 
1

1 Antwort auf die Frage

2
Rik

!R!SEM6;EXIT; ist ein Befehl, der von Kyocera-Druckern und -Kopierern verwendet wird (wahrscheinlich der Druckertreiber, mit dem diese Datei erstellt wurde).

  • !R! steht für den Erkennungscode für Vorgabebefehle.
  • SEMsteht für Set Emulation Mode. Dieser Befehl ändert den Emulationsmodus vorübergehend.
  • Die 6bedeutet HPIII-Emulation
  • EXIT beendet die Hinrichtung

Die folgenden Zeilen @PJLkennzeichnen eine "Druckauftragssprachenkopfzeile".

Das M%!PS-Adobe-3.0bedeutet, dass alles andere Postscript-Code ist.

Sie können diese Datei im RAW-Format auf einem Drucker ausdrucken. Wenn Sie sie jedoch auf dem Bildschirm anzeigen möchten, können Sie den gesamten Postscript-Code in ein abbildbares Bild konvertieren.

Beispielsweise können Sie Ghostscript verwenden, um eine PDF-Datei zu erstellen. Speichern Sie den gesamten Postscript-Code (also alles ab %% Title) in eine Datei und führen Sie gs.exe aus.

gs.exe -o out.pdf -sDEVICE=pdfwrite input-file 

Bearbeiten: Wenn Sie mehr als 1500 Dateien haben, können Sie sie mit einer Batch-Datei konvertieren. Vorausgesetzt, sie befinden sich alle in einem Verzeichnis, können Sie wie folgt vorgehen:

Erstellen Sie diese Datei convert.cmd irgendwo:
Angenommen, Ihre Dateien befinden sich in C: \ YOUR_RAW_FILES.
Angenommen, sie befinden sich alle in einem Verzeichnis.
Angenommen, gs ist in C: \ Programme (x86) \ gs \ gs9.05 \ bin \ installiert )

@echo off  :: create a convert directory and remove contents if not exist "C:\MYCONVERTS\" mkdir C:\MYCONVERTS del /Q C:\MYCONVERTS\*.*  :: loop through all your files and pass the linenumber for %%Title to convert-procedure for %%X IN (C:\YOUR_RAW_FILES\*.*) do ( for /f "delims=:" %%a in ('findstr /n "%%Title" %%X') do call :convert %%a %%X %%~nX )  :: remove the temp files leaving the pdf files in MYCONVERTS del /Q C:\MYCONVERTS\*.tmp  goto End ::--------------------------------  ::================================ :convert :: we need the lines above %%Title (so - 1) set /a z=%1 - 1 :: export all remaining lines to .tmp (skipping the first x lines) for /f "tokens=* skip=%z%" %%b IN ('type %2') DO @echo %%b >> C:\MYCONVERTS\%3.tmp  :: execute ghostscript with correct parameters "C:\Program Files (x86)\gs\gs9.05\bin\gswin32c.exe" -o C:\MYCONVERTS\%3.pdf -sDEVICE=pdfwrite C:\MYCONVERTS\%3.tmp  goto :eof ::================================  :End 

Ich bin mir nicht sicher, ob dies dauern wird, wenn die Dateien echte binäre Informationen enthalten. Sie können es jedoch versuchen.

Funktionierte perfekt, ohne "gs" vor den Parametern. Haben Sie eine Idee, wie Sie das alles auf über 1500 Dateien erledigen können, ohne sie alle manuell öffnen und speichern zu müssen? user450387 vor 7 Jahren 0
@ user450387 Ok, in diesem Fall haben Sie es in Ghostscript interaktiv selbst eingegeben. Die Datei gs (oder gs.exe) würde benötigt, wenn Sie diese über eine Eingabeaufforderung oder über eine Batchdatei ausführen. In Ihrem Fall müssen Sie die Vorderseite der Datei entfernen und den Rest gs.exe in einer Stapeldatei zuführen. Kennen Sie Batch-Dateien? Rik vor 7 Jahren 0
@ user450387 Ich habe auch eine Batchdatei hinzugefügt, um mehrere Dateien zu konvertieren (sie enthält einen Kommentar, damit Sie verstehen können, was gemacht wird). Rik vor 7 Jahren 0
Oh sicher, danke. Ich bin irgendwie festgefahren auf dem Weg .. Die Charge funktioniert nicht, daher gibt es einige Fehler im Echo. Aber ich möchte Sie nicht bei meiner Arbeit stören, also habe ich beschlossen, eine kleine C # -Konsolenanwendung zu schreiben, die all das erledigt. (Und weil ich nicht genug über Batch-Programmierung weiß, ist es für mich einfacher zu verstehen und zu debuggen.) Ich werde meine Frage mit dem Code aktualisieren, den ich erledigt habe. user450387 vor 7 Jahren 0
Haben Sie eine Idee, wie ich einen "virtuellen" Drucker einrichten könnte, um solche Postscript-Printer-Dateien für mich zu erstellen? Ich habe versucht, dies mit dem Treiber zu tun, der dort "Kyocera Mita FS-1020D KX" und einigen anderen gegeben wurde, aber am Ende bekomme ich immer eine "PCLXL" -formierte Datei. user450387 vor 7 Jahren 0
@ user450387 Im Gostscript-Verzeichnis \ gs \ gs9.05 \ lib befinden sich zwei Dateien ghostpdf.inf und ghostpdf.ppd, die als "reine" Postscript-Treiber für einen Drucker verwendet werden können. Kein PCLXL. Die resultierende Datei kann perfekt mit Ghostscript selbst verwendet werden. Rik vor 7 Jahren 0
@ user450387 Wenn Sie die Erzeugung von PDF-Dateien über ein Programm automatisieren möchten, können Sie den Redmon-Port-Treiber verwenden. In diesem Fall wählen Sie nicht Datei oder USB als Druckerport, sondern den Redmon-Port. In Redmon können Sie konfigurieren, dass Ihr Programm gestartet wird, wenn es eine Postscript-Datei empfängt. So machen es die PDF-Creator-Drucker. http://pages.cs.wisc.edu/~ghost/redmon/index.htm Rik vor 7 Jahren 0