Inquiridor
Criar PDF

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
Todas as Respostas
-
Existem outras 2 Threads aqui no fórum que vão te ajudar MUITO...
http://social.msdn.microsoft.com/Forums/pt-BR/e34cc65e-49e2-41fb-9f3d-ae307bcbe78d/criar-pdf-dinamicamente
-
-
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.
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.
Parameter name: index
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.1008Ocorre 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
-
qualquer coisa ve se isso te ajuda!!!
-
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
-