none
String Hexadecimal para PDF RRS feed

  • Pergunta

  • Pessoal, depois de esgotar o que sei, estou pedindo ajuda para a seguinte situação:

    Eu vou receber um xml com um campo CLOB, que representa um , e vou precisar fazer como o código abaixo: 

    private string HexString2Ascii(string hexString)

    { StringBuilder sb = new StringBuilder(); for (int i = 0; i <= hexString.Length - 2; i += 2) { sb.Append(Convert.ToString(Convert.ToChar(Int32.Parse(hexString.Substring(i, 2), System.Globalization.NumberStyles.HexNumber)))); } return sb.ToString(); }

    private void GetPDF() { string result = HexString2Ascii(File.ReadAllText(@"c:\pdf.txt").Replace("\r", "5C5C72")).Replace("\n", "5C5C6E"); byte[] bytes = GetBytes(result); Response.Clear(); Response.Buffer = false; Response.AppendHeader("Content-Type", "PDF"); Response.AppendHeader("Content-Transfer-Encoding", "binary"); Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}", "TESTE.pdf")); Response.BinaryWrite(bytes); Response.End(); bytes = null; }

    Os pontos são:

    1) 'pdf.txt' representa o conteúdo da tag que vou receber. Tal como está. Um conjunto de caracteres hexadecimais;

    2) Ja tentei o ReadAllText com e sem encoding, mas sem sucesso. Dá erro com o '\r' e '\n'. Daí o Replace;

    O grande caso é que o PDF vem com erro. Onde estou errando?

    Desde já agradeço a ajuda.


    • Editado Otto Batista quinta-feira, 18 de junho de 2015 00:03
    quinta-feira, 18 de junho de 2015 00:02

Respostas

  • Pessoal,

    Aos que estiverem com a mesma dificuldade, segue a solução que no meu caso funcionou:

    http://www.codeproject.com/Articles/4086/Converting-Hexadecimal-String-to-from-Byte-Array-i

    Esse artigo tem uma classe que converte de hex para byte array e vice versa. Nesse caso funcionou. Abaixo o exemplo do código:

    private void GetPDF()
            {
                string hexString = File.ReadAllText(@"c:\pdf.txt");
                int discarded;
                byte[] buffer = Utility.HexEncoding.GetBytes(hexString, out discarded);
    
                Response.Clear();
                Response.Buffer = false;
                Response.AppendHeader("Content-Type", "application/octet-stream");
                Response.AppendHeader("Content-Transfer-Encoding", "binary");
                Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}", "TesteTracking.pdf"));
                Response.BinaryWrite(buffer);
                Response.End();
                buffer = null;
            }

    Esse código lê uma string hex e converte em byte[]. No meu caso, ainda faço download desse arquivo.

    Espero ajudar como a moçada que se esforçou em ajudar. Obrigado.

    • Marcado como Resposta Otto Batista sexta-feira, 3 de julho de 2015 01:03
    sexta-feira, 3 de julho de 2015 01:03

Todas as Respostas

  • Bom dia Otto.

    Muito obrigado por sua participação no Fórum.

    Por gentileza, poderia informar qual o erro no arquivo gerado?

    Não está decriptando corretamente? que ocorre exatamente, o que está acontecendo?

    Ótimo dia

    Abraços

    quinta-feira, 18 de junho de 2015 14:39
  • Boa tarde,

    Eu é que agradeço o retorno. Bem, eu consigo gerar um arquivo .pdf, mas está sempre corrompido. Eu edito este no bloco de notas e vem ASCII, mas ao executar tomo erro.

    Este pdf.txt do exemplo tem uma cadeia de caracteres do tipo '255044462D312E330D0A25E2E3CFD30D0A255253', só que muito maior, representando um arquivo pdf salvo em banco em um campo CLOB. 

    Na verdade, eu aceito até uma outra abordagem, pois eu não sei mais como avançar.
    • Editado Otto Batista quinta-feira, 18 de junho de 2015 18:56
    quinta-feira, 18 de junho de 2015 18:49
  • Ola Otto,

    Para converter uma sequencia binaria em uma string, eu prefiro usar a Base64... dessa forma não importa o Encoding ja que so usa caracters simples....

    public string PdfBytesToString(string filename) {
    	var bytes = File.ReadAllBytes(filename);
    	return Convert.ToBase64String(bytes);
    }
    
    public byte[] StringToPdfBytes(string data) {
    	return Convert.FromBase64String(data);
    }



    Microsoft Community Contributor

    • Marcado como Resposta Cristopher C I_ segunda-feira, 22 de junho de 2015 13:47
    • Não Marcado como Resposta Otto Batista terça-feira, 30 de junho de 2015 22:18
    quinta-feira, 18 de junho de 2015 19:26
    Moderador
  • Pessoal, desculpe a demora em responder, mas voltando ao assunto:

    Caros Rui e colegas, não funcionou - ele escreveu o mesmo hexadecimal no arquivo pdf! Meu problema, além de não saber como fazer, claro (sem orgulho disso..rs), está no fato de que preciso converter a string hexa em um valor ASCii, que (pelo menos), é o que aparece quando edito um arquivo pdf qualquer em um bloco de notas. Eu preciso chegar nesse código que é o que acontece quando salvo um clob no PL/SQL, por exemplo.

    Mas agradeço muito a ajuda, galera.


    • Editado Otto Batista quarta-feira, 24 de junho de 2015 19:03
    quarta-feira, 24 de junho de 2015 19:03
  • Pessoal,

    Aos que estiverem com a mesma dificuldade, segue a solução que no meu caso funcionou:

    http://www.codeproject.com/Articles/4086/Converting-Hexadecimal-String-to-from-Byte-Array-i

    Esse artigo tem uma classe que converte de hex para byte array e vice versa. Nesse caso funcionou. Abaixo o exemplo do código:

    private void GetPDF()
            {
                string hexString = File.ReadAllText(@"c:\pdf.txt");
                int discarded;
                byte[] buffer = Utility.HexEncoding.GetBytes(hexString, out discarded);
    
                Response.Clear();
                Response.Buffer = false;
                Response.AppendHeader("Content-Type", "application/octet-stream");
                Response.AppendHeader("Content-Transfer-Encoding", "binary");
                Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}", "TesteTracking.pdf"));
                Response.BinaryWrite(buffer);
                Response.End();
                buffer = null;
            }

    Esse código lê uma string hex e converte em byte[]. No meu caso, ainda faço download desse arquivo.

    Espero ajudar como a moçada que se esforçou em ajudar. Obrigado.

    • Marcado como Resposta Otto Batista sexta-feira, 3 de julho de 2015 01:03
    sexta-feira, 3 de julho de 2015 01:03