terça-feira, 25 de agosto de 2009

Adicionando imagens no Crystal Report

Uma das coisas mais comuns a se fazer em software, é a possibilidade de fazer um resumo de vendas para que o usuário possa escolher entre salvar em diversos formatos ou então imprimir.
Para que isso seja feito com facilidade, Visual Studio possui além dos modelos de documentos da Microsoft, uma ferramenta poderosa chamada Crystal Report.
Infelizmente o Crystal Report não possui um campo mapeado para imagem, onde você possa adicionar apenas uma url e ele faça todo o trabalho para você. Você pode estar pensando "mas também o que mais ele quer?", porém isso é comum quando se trabalha com a classe Image do .NET.
Para realizar esse trabalho é necessário adicionar um array de bytes.

Em seu datasource crie um atributo byte[] por exemplo:

    public byte[] Image { get; set; }

Feito isso de um refresh no seu datasource no Crystal Report para que você possa visualizar o novo campo, após visualizado apenas arraste o novo campo para o report.

Adicione o namespace: using System.IO;

Agora para ler a imagem de seu disco adicione o seguinte código:

    FileStream stream = new FileStream(url, FileMode.Open, FileAccess.Read);
    BinaryReader reader = new BinaryReader(stream);
    suaClasse.Image = reader.ReadBytes(Convert.ToInt32(stream.Length));
    reader.Close();
    stream.Close();

Vincule o datasource do Crystal Report para uma lista de sua classe ou o seu dataset e então o Crystal Report poderá realizar o trabalho para você.

9 comentários:

  1. Murilo,

    Valeu, você foi bem objetivo.

    Indemberge

    ResponderExcluir
  2. Murilo,

    Eu estou usando um dataset, e gostaria de visualizar a imagem no Crystal Report, no dataset o DataType coloquei como System.Byte[],
    meus dados eu busco de uma lista, como adptar esse otima sugestão para a minha realidade.

    ReportDocument crReportDocument = new ReportDocument();

    dsSummary dsRelatorio = new dsSummary();

    dsRelatorio.Summary.Merge(B.Occurrence.OccurrenceStudentSummary(int.Parse(Request.QueryString["siteid"]),
    int.Parse(Request.QueryString["classificationid"]),
    Request.QueryString["datainicial"].ToString(),
    Request.QueryString["datafinal"].ToString(),
    Request.QueryString["cod_serie"].ToString(),
    Request.QueryString["cod_turma"].ToString()));

    crReportDocument.Load(Server.MapPath("OccurrenceSummary.rpt"));

    crReportDocument.SetDataSource(dsRelatorio);

    //Utilizando exportação para pdf
    BinaryReader stream = new BinaryReader(crReportDocument.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat));
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.ContentType = "application/pdf";
    HttpContext.Current.Response.BinaryWrite(stream.ReadBytes(Convert.ToInt32(stream.BaseStream.Length)));
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.Close();

    ResponderExcluir
  3. Desculpa pela demora da resposta.
    Bom se essa lista é uma lista de byte (List<byte>) você pode fazer da seguinte maneira, coloque esse código após essa linha:

    dsRelatorio.Summary.Merge(B.Occurrence.OccurrenceStudentSummary(int.Parse(Request.QueryString["siteid"]),
    int.Parse(Request.QueryString["classificationid"]),
    Request.QueryString["datainicial"].ToString(),
    Request.QueryString["datafinal"].ToString(),
    Request.QueryString["cod_serie"].ToString(),
    Request.QueryString["cod_turma"].ToString()));

    dsRelatorio.TabelaDoCampo[0].Campo = lista.ToArray();

    Nesse código estou supondo que você ja possua uma linha nessa tabela do dataset.

    Não sei se era essa sua dúvida, qualquer outra dúvida por favor a coloque aqui.

    Até mais.

    ResponderExcluir
  4. Também estou com problema a impressão de imagem dinamica em um relatório cristal com C#.

    Para impressão eu utilizei um campo Byte[] do um datasource o problema e que não sei como acertar para que o logo não fique distorcido, ou seja, quando o logo e menor ou maior que o campo que inclui no relatório na impressão a imagem fica distorcida.

    ResponderExcluir
  5. Quando eu trabalhei com a imagem nós descobrimos o tamanho dela em centímetros e fizemos assim no Crystal.
    Tem um propriedade que você pode mudar (não me lembro o nome no momento, talvez seja Fill) que normalmente é straight, vc pode mudar para static e isso não acontecerá.

    ResponderExcluir
  6. Bom dia Murilo

    Eu não encotrei essa propriedade nem na coluna tipo BYTE[] incluida no datasource e nem no objeto para exibir a imagem no cristal

    ResponderExcluir
  7. Boa Noite Murilo,

    Não sou muito de comentar em blogs, mas nesse não tive deixar de comentar.
    Estou 3 dias atrás dessa solução..

    Solução simples e direta.

    Valeu

    ResponderExcluir