Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Webservice regresa PDF como string en base64 (https://www.clubdelphi.com/foros/showthread.php?t=68717)

beemot 02-07-2010 05:00:09

Webservice regresa PDF como string en base64
 
Hola amigos, buenas noches

Estoy diseñando una aplicación que se comunica con un Webservice, el cual en un Responsedata me regresa un string codificado en Base64 que en realidad es un PDF que lógicamente para factibilidad del weservice así me lo manda; si logro almacenar la información en el string, pero hasta ahí llego, de ahí ya no se cómo decodificar y guardar el string como pdf, según por lo que he visto, se usan stream y streammemory pero para este caso no tengo ni idea y según yo primero hay que decodificar el string. Si alguien me pusiera apoyar con esto. Gracias

Neftali [Germán.Estévez] 02-07-2010 10:18:24

¿Una pregunta? Si miras el fichero desde un editor de texto, tiene unas marcas/tags similares a estos:

<FACB64>
</FACB64>
<FIRB64>
</FIRB64>

¿Aunque no ponga el fichero, puedes poner un ejemplo de la estructura que tiene?

beemot 04-07-2010 06:39:31

Cita:

Empezado por Neftali (Mensaje 368939)
¿Una pregunta? Si miras el fichero desde un editor de texto, tiene unas marcas/tags similares a estos:

<FACB64>
</FACB64>
<FIRB64>
</FIRB64>

¿Aunque no ponga el fichero, puedes poner un ejemplo de la estructura que tiene?


Que paso amigo, mira, he bajado el string que me regresa el webservice y no tiene estructura alguna, pongo un pedaso mas abajo, pero como te decia, no tiene una estructura; en la documentacion de la pagina solo me dice que siempre me regresa todo codificado en base64. saludos

Es el inicio del codigo
Código:

JVBERi0xLjQNCiWxsrO0DQolQ3JlYXRlZCBieSBXbnYvRVAgUERGIFRvb2xzIHY2LjANCjEgMCBvYmoNCjw8DQovUGFnZU1vZGUgL1VzZU5vbmUNCi9WaWV3ZXJQcmVmZXJlbmNlcyAyIDAgUg0KL1R5cGUgL0NhdGFsb2cNCi9QYWdlTGF5b3V0IC9PbmVDb2x1bW4NCi9QYWdlcyAzIDAgUg0KPj4NCg0KZW5kb2JqDQozIDAgb2JqDQo8PA0KL1R5cGUgL1BhZ2VzDQovS2lkcyBbNCAwIFJdDQovQ291bnQgMQ0KPj4NCg0KZW5kb2JqDQo0IDAgb2JqDQo8PA0KL1Jlc291cmNlcyA8PA0KL1Byb2NTZXQgWy9QREYgL1RleHQgL0ltYWdlQ10NCi9YT2JqZWN0IDw8DQovTkFNRV9waGdibGdnZm9jZmtrbmpicG9iZmNubXBnYmxrZ29qaCA1IDAgUg0KL05BTUVfaXBjZmZjcGRubWRma2puamFqYmZuZG1saG9paWtoZWggNiAwIFINCj4+DQoNCi9Gb250IDw8DQovVVBST0NIK0FyaWFsTVQgNyAwIFINCj4+DQoNCj4+DQoNCi9QYXJlbnQgMyAwIFINCi9UeXBlIC9QYWdlDQovQ29udGVudHMgWzggMCBSIDkgMCBSXQ0KL01lZGlhQm94IFswLjAwMDAwIDAuMDAwMDAgNjEyLjAwMDAwIDc5Mi4wMDAwMF0NCj4+DQoNCmVuZG9iag0KOCAwIG9iag0KPDwNCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlDQovTGVuZ3RoIDEyNA0KPj4NCnN0cmVhbQ0KeF4z0DMAAQUYbWZoBGWZW8JYRakK4Qp5vFwKhbxcMHWGxsZ6phB1ZhYwvaYWULGiVF4uiBYDPXNTZAtQGOhScEMNFBSSc4G6FfT9HH1d4zMLktPSkgtS8nJT0rKz8rISs5LS8lJyczLyMzOzM1IzFFzyebkCebkAUZ8t4g0KZW5kc3RyZWFtDQoNCmVuZG9iag0KOSAwIG9iag0KPDwNCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlDQovTGVuZ3RoIDE4Nw0KPj4NCnN0cmVhbQ0KeF59T00LgkAQHei2sLd+wByLwNxMPVtJEn0ZGx0jrV2/Nf//odU0gqBhHu/xZgbePCnRNb0p7Nlis07NzU7UD0ouWFCC7O18tr/EnxGGubrF6d7ZudcqkkEmpShDkaZFElRlIMIir5SbyjKJcFVS4lPybHvBKZmej6fD0ps4dXzLdhz7WFxQYtpMY5aJTNfmtmEZ

Neftali [Germán.Estévez] 05-07-2010 12:11:58

Ok. En tu caso veo que no hay etiquetas, porque eso es todo el fichero.
A veces al contener más cosas se "dividen" las partes utilizando etquetas.

Lo primero es comprobar que esos datos es algo "con sentido". Para hacer la prueba fácil puedes probar alguna de las múltiples Webs online que te permiten "decodificar" ese churro de caracteres. Para ello busca en Google "Decode Base64" y encontrarás muchas.
Por ejemplo, si pruebas aquí, con el texto que has colocado, verás que la decodificación devuelve el siguiente texto:

Código:

%PDF-1.4
%����
%Created by Wnv/EP PDF Tools v6.0
1 0 obj
<<
/PageMode /UseNone
/ViewerPreferences 2 0 R
/Type /Catalog
/PageLayout /OneColumn
/Pages 3 0 R
>>
...

Que tiene pinta de ser cláramente un PDF. Prueba con algunos textos y deberías poder grabar el resultado en un PDF y abrirlo sin problemas.

Una vez que hayas comprobado que se traduce correctamente, hay que conseguir hacerlo desde Delphi. Al igual que hay muchas páginas de Decede Base64, también hay bastantes "códigos" en Delphi para hacerlo.

Si colocas un formulario con 2 memos y un botón, puedes probar un código como este:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
const
  CRYPT_STRING_BASE64 = 1;  {Irene. prueba de desencriptado}  

procedure StrToStream(Str: String; Stream: TStream);

implementation

{$R *.dfm}

// Irene. Prueba de desencriptado...
function CryptBinaryToString(pbBinary: PByte; cbBinary: DWORD; dwFlags: DWORD;
  pszString: PChar; var pcchString: DWORD): BOOL; stdcall;
  external 'Crypt32.dll' name 'CryptBinaryToStringA';

function CryptStringToBinary(pszString: PChar; cchString: DWORD; dwFlags: DWORD;
  pbBinary: PByte; var pcbBinary: DWORD; pdwSkip: PDWORD;
  pdwFlags: PDWORD): BOOL; stdcall;
  external 'Crypt32.dll' name 'CryptStringToBinaryA';

procedure StrToStream(Str: String; Stream: TStream);
var
  Buffer: PByte;
  Count: DWORD;
begin
  Count:= 0;
  if CryptStringToBinary(PChar(Str),Length(Str),CRYPT_STRING_BASE64,nil,Count,
    nil,nil) then
  begin
    GetMem(Buffer,Count);
    try
      if CryptStringToBinary(PChar(Str),Length(Str),CRYPT_STRING_BASE64,Buffer,
        Count,nil,nil) then
        Stream.WriteBuffer(Buffer^,Count);
    finally
      FreeMem(Buffer);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TFileStream;
  NUevoFich:string;
begin
  // decode
  NuevoFich := 'r:\test.pdf';
  Stream:= TFileStream.Create(NuevoFich, fmCreate);
  try
    StrToStream(Memo1.Lines.Text, Stream);

  finally
    Stream.Free;
  end;

  // Sin embargo la firma no...
  Memo2.Lines.LoadFromFile(NuevoFich);
end;

end.

El memo1 con el trexto original, el que has puesto más arriba, por ejemplo, y en el botón la llamada a la decodificación.


La franja horaria es GMT +2. Ahora son las 12:30:14.

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