Pregunta ¿Qué formato es este archivo (comenzando con "! R! SEM 9; EXIT;") y cómo mostrarlo en pantalla


Tengo el siguiente archivo encontrado en un sistema de cliente y necesito averiguar qué formato es y (si es posible) cómo abrirlo en Windows (Win7 o superior sería perfectamente correcto).

Debería ser algún tipo de formato de gráficos / impresoras. El nombre de archivo no tiene extensión y se generó con Windows 95.

Encabezado del archivo:

!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

Tiene más "%%" - Secciones, aquí sin contenido, ya que podrían ser datos confidenciales:

%% 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 {userdict /UICollateDetails 10 # put} 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

Luego sigue ~ 2500 líneas de contenido y el siguiente pie de página:

%%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

EDITAR:

Aquí está el código para una aplicación de consola C # que intenta convertir todos los archivos de un directorio determinado a archivos PDF. Tenga en cuenta que no hice ninguna validación en los datos de entrada dados.

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


origen




Respuestas:


!R!SEM6;EXIT; es un comando utilizado por las impresoras y copiadoras kyocera (que probablemente fue el controlador de impresora utilizado para generar este archivo).

  • !R! significa el código de recogimiento para prescribir comandos.
  • SEM significa Establecer modo de emulación. este comando cambia temporalmente el modo de emulación.
  • los 6 significa emulación HPIII
  • EXIT termina la ejecución

Las siguientes líneas con @PJL indica un encabezado de "Idioma del trabajo de impresión".

los M%!PS-Adobe-3.0 indica que todo lo demás es código Postscript.

Puede imprimir este archivo RAW en una impresora, pero si desea verlo en la pantalla puede tomar todo el código Postscript y convertirlo en una imagen visible.

Por ejemplo, puede usar Ghostscript para crear un PDF. Guarde todo el código Postscript (así que todo desde %% Title en adelante) en un archivo y ejecute gs.exe.

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

Editar: si tiene más de 1500 archivos, puede usar un archivo por lotes para convertirlos. Suponiendo que están todos en un directorio, puede hacer algo como esto:

Crea este convert.cmd en alguna parte:
Asume que sus archivos están en C: \ YOUR_RAW_FILES
Asume que están todos en un directorio
Asume que gs está instalado en C: \ Archivos de programa (x86) \ gs \ gs9.05 \ bin \ (cambiar si hay otra versión)

@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

No estoy seguro si esto se mantendrá si los archivos contienen información binaria real, pero puede intentarlo.


2



Funcionó perfectamente, sin el "gs" en frente de los parámetros. ¿Alguna idea de hacer todo esto en más de 1500 archivos, sin tener que abrirlos y guardarlos todos a mano? - user450387
@ user450387 Ok, en ese caso lo ingresaste en el programa interactivo Ghostscript. El gs (o gs.exe) sería necesario si ejecutó esto desde un símbolo del sistema o desde un archivo de proceso por lotes. En su caso, necesitaría quitar la parte frontal del archivo y alimentar el resto a gs.exe en un archivo por lotes. ¿Estás familiarizado con los archivos por lotes? - Rik
@ user450387 También agregué un archivo por lotes para convertir varios archivos (contiene comentarios para que pueda entender lo que se hace). - Rik
Oh seguro, gracias. Me puse un poco atascado en el camino ... El lote no funciona, por lo tanto, hay algunos errores en el eco. Pero no quiero molestarlo haciendo mi trabajo, así que decidí escribir una pequeña aplicación de consola C # que maneje todo eso. (Y como no sé lo suficiente sobre la programación por lotes, entonces será más fácil para mí entender y depurar). Actualizaré mi pregunta con el código uno. - user450387
¿Tiene alguna idea de cómo podría configurar una impresora "Virtual" para crear esos archivos PostScript-Printer para mí? He intentado hacer esto con el Driver que se entregó allí "Kyocera Mita FS-1020D KX" y muchos otros, pero siempre termino con un archivo formateado "PCLXL". - user450387