Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Conversión / formato MIME a pdf (https://www.clubdelphi.com/foros/showthread.php?t=96619)

Galahad 27-02-2024 19:14:03

Conversión / formato MIME a pdf
 
Hola, un saludo a tod@s.
Estoy utilizando un servicio web para acceder a unas etiquetas de una agencia de transporte.
Se Descarga un xml con un código binario base64 que si lo 'decodifico' en paginas web que hay para esto me presenta un pdf sin problemas.
Necesito a partir de ese código binario crear un pdf .
No lo consigo, me genera un fichero que no es legible .
El código de dicha función es:
Código Delphi [-]
Procedure DescargarEtiquetas( crutafichero:string );
var FStream : TFileStream;
    bytes: Tbytes;
begin

    bytes   := TNetEncoding.Base64.Decode( TEtiquetaEnvioRespuesta.GetEtiquetaEnvioResult.EtiquetaFile);
    if bytes <> nil then
    begin
       FStream := TfileStream.Create( crutafichero, fmcreate );
       try
          Fstream.write( bytes,length(bytes) );
       finally
          Fstream.free;
       end;
    end;
end;

Este dato 'TEtiquetaEnvioRespuesta.GetEtiquetaEnvioResult.EtiquetaFile' es de tipo TByteSoapArray
Entiendo que no estoy decodificando correctamente esos datos binarios..
en la agencia me comentan:

El método GetEtiquetaEnvio te ha devuelto la etiqueta PDF… lo que ves es código binario base64, que se debe convertir para para ver el contenido PDF – fichero o en este caso la etiqueta.
Con el ContentType o formato MIME (application/pdf) lo logras casi de forma directa..


¿ alguna idea ?
Gracias

Casimiro Notevi 28-02-2024 11:09:22

Así "a ojo" sin ver lo que recibes, prueba esto:

Código Delphi [-]
procedure DescargarEtiquetas(crutafichero: string);
var
  FStream: TFileStream;
  bytes: TBytes;
begin
  bytes := TNetEncoding.Base64.DecodeStringToBytes(TEtiquetaEnvioRespuesta.GetEtiquetaEnvioResult.EtiquetaFile)  ;
  if Length(bytes) > 0 then
  begin
    FStream := TFileStream.Create(crutafichero, fmCreate);
    try
      FStream.WriteBuffer(bytes[0], Length(bytes));
    finally
      FStream.Free;
    end;
  end;
end;

Galahad 28-02-2024 12:28:30

Problema conversión a Pdf
 
4 Archivos Adjunto(s)
Gracias Casimiro,, pero no, no ha funcionado...:(

Mando unos ficheros zip adjuntos para ver si podéis ver algo más que yo..
Estos adjuntos son:
- el pdf resultante de la prueba (ilegible) (miprueba2.pdf)
- el fichero xml que me devuelve el servicio donde figuran los datos codificados. (zip dec_eti_etiquetaenvio....zip)
- un fichero txt con esa clave o datos codificados (codigobinariobase64.zip)
- una imagen con una prueba de decodificación de esos mismos datos desde una página web (aparecen las etiquetas correctas sin problemas) (imagen_2024-02).

Un saludo...

Casimiro Notevi 28-02-2024 14:12:33

1 Archivos Adjunto(s)
He probado con este código y funciona perfectamente (te adjunto el pdf resultante):
Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  System.NetEncoding;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure DecodeBase64File(const inputFileName, outputFileName: string);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  DecodeBase64File('C:\Proyectos\CodigoBinarioBase64.txt', 'c:\Proyectos\archivo_decodificado.pdf');
end;

procedure TForm1.DecodeBase64File(const inputFileName, outputFileName: string);
var
  inputFileStream, outputFileStream: TFileStream;
  base64Decoder: TBase64Encoding;
begin
  try
    // Abrir el archivo de entrada en modo de solo lectura
    inputFileStream := TFileStream.Create(inputFileName, fmOpenRead);
    try
      // Crear un decodificador Base64
      base64Decoder := TBase64Encoding.Create;
      try
        // Crear un flujo de salida para el archivo decodificado
        outputFileStream := TFileStream.Create(outputFileName, fmCreate);
        try
          // Decodificar el contenido del archivo Base64 y escribirlo en el archivo de salida
          base64Decoder.Decode(inputFileStream, outputFileStream);
        finally
          outputFileStream.Free;
        end;
      finally
        base64Decoder.Free;
      end;
    finally
      inputFileStream.Free;
    end;
    ShowMessage('Decodificación completa.');
  except
    on E: Exception do
      ShowMessage('Error: ' + E.Message);
  end;
end;

end.

Galahad 28-02-2024 17:58:41

Hola a Todos.
Ha funcionado Casimiro, ¡ Muchas Grácias !.
No he conseguido pasar la variable de tipo PBytessopArray a String para luego para esa string a un fichero de texto plano origen y utilizar tú función, pero al final he optado por ser práctico y leer el nodo 'EtiquetaFile' del xml generado que tiene ese valor .
Después Grabo en dicho fichero de texto dicha cadena , utilizo esa función y ya está.

Muchísimas Gracias..., que tengáis una buena semana


La franja horaria es GMT +2. Ahora son las 08:59:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi