none
Criar PDF RRS feed

  • Pergunta

  • Pessoal, boa tarde!

    Preciso fazer meu sistema desenvolvido em C# no VS2010 e que usa como base de dados SQLSERVER 2008, gerar um arquivo PDF.

    Esse arquivo PDF deve ser gerado juntando fragmentos de textos que serão inseridos em textbox pelos usuários e arquivos .doc anexados no sistema também pelos usuários.

    O problema aqui é que não sei nem mesmo gerar um arquivo PDF sem ter que utilizar componentes pagos. Gostaria de utilizar os próprios recursos da plataforma .NET para desenvolver tal funcionalidade.

    Peço a ajuda dos colegas de forum.

    Alguem possui algum exemplo ou indica algum link que mostre como fazer tal funcionalidade.

    Grato desde já

    Gustavo


    Analista Programador

    quarta-feira, 18 de setembro de 2013 16:26

Todas as Respostas

  • Existe  o http://pdfjet.com/

    João Antonio Marques

    quarta-feira, 18 de setembro de 2013 17:45
  • Consegui gerar o PDF, mas não estou conseguindo ler o conteúdo do arquivo .docx.

    Consigo inserir no PDF apenas os fragmentos de texto inseridos no sistema (texbox,etc), mas preciso mesclar esse conteúdo com os conteúdos dos arquivos anexados.

    Abaixo segue o trecho de código que eu fiz para tentar ler o arquivo do word e o erro que é gerado.

     protected void btnGeneratePDF_Click(object sender, EventArgs e)
        {
    
            // Cria um objeto PDF
            Root.Reports.Report vPdf = new Root.Reports.Report(new PdfFormatter());
            // Define a fonte que sera usada no relatório PDF
            FontDef vDef = new FontDef(vPdf, FontDef.StandardFont.TimesRoman);
            FontProp vDrop = new FontProp(vDef, 10);
            // Cria uma Nova Pagina
            Root.Reports.Page vPage = new Root.Reports.Page(vPdf);
    
            int intAuxUploadFilesNumber = (int)Session[SystemConstants.SESSION_UPLOADFILESNUMBER];
            int intCountRequestFiles = (int)Session[SystemConstants.SESSION_UPLOADFILESNUMBER];
            SiteFile objSiteFile = new SiteFile();
            for (int i = 0; i < intAuxUploadFilesNumber; i++)
            {
    
    
                objSiteFile.Folder = SiteUtilityBLL.GetUplodaFilesFolder().ToString();
                if (objSiteFile.Folder == string.Empty)
                {
                    throw new Exception("Unable to retrieve the name of the upload's folder");
                }
                DataSet dsFiles;
                dsFiles = SiteFilesBLL.GetRequestFilesWithFilePath(m_objRequest.RequestID, out m_objErro);
    
                objSiteFile.FileName = dsFiles.Tables[0].Rows[0]["FILE_NAME"].ToString();
                objSiteFile.FileName = objSiteFile.FileName + ".pdf";
    
                //Diretório virtual que aponta para onde os arquivos estão
                string strSiteUploadFolder = SiteFilesBLL.GetSiteUploadFolder();
                if (strSiteUploadFolder == string.Empty)
                {
                    throw new Exception("Unable to retrieve the name of the upload's folder");
                }
                // Escreve no Arquivo
    
               //le word
               string conteudoword="", caminhoword;
    
               caminhoword = Server.MapPath("~") + "//" + SiteUtilityBLL.GetUplodaFilesFolder().ToString() + "//" + SiteFilesBLL.GetUploadDirectory().ToString() + "//" + dsFiles.Tables[0].Rows[0]["FILE_NAME"].ToString()+ ".docx";
               FileStream fs = File.Open(@caminhoword, FileMode.Open, FileAccess.Read);
                StreamReader rs = new StreamReader(fs);
    
    
    
                // Enquando na chegar ao final do arquivo
                while (!rs.EndOfStream)
                {
                    conteudoword = rs.ReadLine();
    
                }
    
                //conteudoword = "teste de texto ";
               
                rs.Close();
                fs.Close();
                vPage.AddCB_MM(5,new RepString(vDrop, conteudoword.ToString())); // Centraliza
            }
    
            DataSet dsFile = SiteFilesBLL.GetRequestFilesBLL(m_objRequest.RequestID, out m_objErro);
    
            if (m_objErro.ErrorStatus)
            {
                SiteUtilityBLL.RedirectToErrorPage(m_objErro);
                return;
            }
    
            // Salvar Arquivo no disco            
            vPdf.Save(Server.MapPath("~") + "//" + SiteUtilityBLL.GetUplodaFilesFolder().ToString() + "//" + SiteFilesBLL.GetUploadDirectory().ToString() + "//" + objSiteFile.FileName.ToString());        
            if (m_objErro.ErrorStatus)
            {
                SiteUtilityBLL.RedirectToErrorPage(m_objErro);
                return;
            }
            ScriptManager.RegisterClientScriptBlock(this, GetType(), "Information", "alert('File generated successfully !')", true);        
    
        }

    erro gerado:

    Server Error in '/WEB' Application.

    Index was out of range. Must be non-negative and less than the size of the collection.
    Parameter name: index

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
    Parameter name: index

    Source Error: 
    Line 1334:
    Line 1335:        // Salvar Arquivo no disco            
    Line 1336:        vPdf.Save(Server.MapPath("~") + "//" + SiteUtilityBLL.GetUplodaFilesFolder().ToString() + "//" + SiteFilesBLL.GetUploadDirectory().ToString() + "//" + objSiteFile.FileName.ToString());        
    Line 1337:        if (m_objErro.ErrorStatus)
    Line 1338:        {

    Source File: d:\Visual Studio 2010\Projects\STIF_FINAL\SiteSTIF\WEB\EditRequest_InvoiceIssue.aspx.cs    Line: 1336 

    Stack Trace: 
    [ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
    Parameter name: index]
       System.Collections.BitArray.Set(Int32 index, Boolean value) +9413745
       Root.Reports.PdfFormatter.PrepareObjIdsForContainer(PdfIndirectObject_Page pdfPageData, Container container) +973
       Root.Reports.PdfFormatter.PrepareObjIds() +465
       Root.Reports.PdfFormatter.Create(Report report, Stream stream) +109
       Root.Reports.Report.Save(String sFileName) +100
       EditRequest_InvoiceIssue.btnGeneratePDF_Click(Object sender, EventArgs e) in d:\Visual Studio 2010\Projects\STIF_FINAL\SiteSTIF\WEB\EditRequest_InvoiceIssue.aspx.cs:1336
       System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118
       System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112
       System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563
    


    Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1008

    Ocorre ainda que ao deixar o trecho abaixo assim:

     // Enquando na chegar ao final do arquivo
               // while (!rs.EndOfStream)
               // {
              //      conteudoword = rs.ReadLine();
    
              //  }
    
                conteudoword = "teste de texto ";

    O texto é inserido corretamente no arquivo PDF.

    Por favor, agradeço qualquer ajuda!

    Grato desde já

    Gustavo


    Analista Programador

    quinta-feira, 3 de outubro de 2013 16:41
  • qualquer coisa ve se isso te ajuda!!!

    http://armariodorafa.blogspot.com.br/search/label/PDF

    quinta-feira, 3 de outubro de 2013 17:18
  • Na verdade não! mas agradeço !

    Pessoal, percebi que no trecho 

             // Enquando na chegar ao final do arquivo
                while (!rs.EndOfStream)
                {
                    conteudoword = rs.ReadLine().ToString();

                }

    a variável conteúdo word está recebendo simbolos ao invés do texto do word!

    segue o conteúdo da segunda linha por exemplo:

    �z�^l������|�Ze����`NѬ�$=8u�i��$P^�p���!@�\0���}2$/�@��/���I�g�'m*s��Q��M��O�H�������j�'%�q�F:��x�i�o��E�0��"

    Acho que isso está relacionado ao problema!


    Analista Programador

    quinta-feira, 3 de outubro de 2013 17:36
  • Alguem pode me apoiar?

    Analista Programador

    quinta-feira, 3 de outubro de 2013 17:37