Usuário com melhor resposta
Gerar PDF a partir do html usando ITextSharp ASP.NET C#

Pergunta
-
Bom dia,
Estou precisando gerar um pdf a partir do html ele funciona normal mas quando há alguma imagem html ele não exibe quando é gerado o pdf, já perdi alguns dias batendo a cabeça para resolver esse problema mas não consegui chegar em nenhuma resolução.
Se alguem poder me ajudar agradeço, deixarei o código abaixo.
protected void btn_Command(object sender, CommandEventArgs e)
{
HttpWebRequest request;
HttpWebResponse response;
Stream stream;
StreamReader streamReader;
string strSiteUrl = "localhost:52192/Default.aspx";
request = (HttpWebRequest)WebRequest.Create(strSiteUrl);
response = (HttpWebResponse)request.GetResponse();
stream = response.GetResponseStream();
streamReader = new StreamReader(stream);
string html = streamReader.ReadToEnd();
criarPDF(html, "Arquivo", "~/Css/StyleMateria.css");
}
private void criarPDF(string html, string nomeArquivo, string linkCss)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + nomeArquivo);
using (var document = new Document(PageSize.A4, 40, 40, 40, 40))
{
html = FormatImageLinks(html);
//define o output do HTML
var memStream = new MemoryStream();
TextReader xmlString = new StringReader(html);
PdfWriter writer = PdfWriter.GetInstance(document, memStream);
document.Open();
//Registra todas as fontes no computador cliente.
FontFactory.RegisterDirectories();
// Set factories
var htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
// Set css
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
cssResolver.AddCssFile(HttpContext.Current.Server.MapPath(linkCss), true);
// Exporta
IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
var worker = new XMLWorker(pipeline, true);
var xmlParse = new XMLParser(true, worker);
xmlParse.Parse(xmlString);
xmlParse.Flush();
document.Close();
document.Dispose();
HttpContext.Current.Response.BinaryWrite(memStream.ToArray());
}
HttpContext.Current.Response.End();
HttpContext.Current.Response.Flush();
}
public static string FormatImageLinks(string input)
{
if (input == null)
{
return string.Empty;
}
string tempInput = input;
const string pattern = @"";
HttpContext context = HttpContext.Current;
foreach (Match m in Regex.Matches(input, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.RightToLeft))
{
if (!m.Success) continue;
string tempM = m.Value;
const string pattern1 = "src=[\'|\"](.+?)[\'|\"]";
var reImg = new Regex(pattern1, RegexOptions.IgnoreCase | RegexOptions.Multiline);
Match mImg = reImg.Match(m.Value);
if (!mImg.Success) continue;
string src = mImg.Value.ToLower().Replace("src=", "").Replace("\"", "").Replace("\'", "");
if (src.StartsWith("http://") || src.StartsWith("https://")) continue;
//Inserimos a nova URL na tag img
src = "src=\"" + context.Request.Url.Scheme + "://" +
context.Request.Url.Authority + src + "\"";
try
{
tempM = tempM.Remove(mImg.Index, mImg.Length);
tempM = tempM.Insert(mImg.Index, src);
// inserimos a nova url img para todo o código html
tempInput = tempInput.Remove(m.Index, m.Length);
tempInput = tempInput.Insert(m.Index, tempM);
}
catch (Exception)
{
}
}
return tempInput;
}
Respostas
-
André,
Respondi esse thread já faz um tempo, mas talvez te ajude:
https://social.msdn.microsoft.com/Forums/pt-BR/049133ce-2ce0-4b6e-9194-53b62e12ddbe/como-gerar-um-arquivo-pdf-a-partir-de-uma-pagina-aspx?forum=aspnetpt
Carlos Eduardo Ferreira
- Marcado como Resposta Robson William SilvaModerator quarta-feira, 14 de setembro de 2016 13:16
Todas as Respostas
-
Olá,
Dá uma olhada nessa thread, talvez lhe ajude de alguma forma: http://stackoverflow.com/questions/29281040/itextsharp-xmlworkerhelper-and-images-for-html-to-pdf
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco- Sugerido como Resposta Robson William SilvaModerator quinta-feira, 8 de setembro de 2016 17:05
-
André,
Respondi esse thread já faz um tempo, mas talvez te ajude:
https://social.msdn.microsoft.com/Forums/pt-BR/049133ce-2ce0-4b6e-9194-53b62e12ddbe/como-gerar-um-arquivo-pdf-a-partir-de-uma-pagina-aspx?forum=aspnetpt
Carlos Eduardo Ferreira
- Marcado como Resposta Robson William SilvaModerator quarta-feira, 14 de setembro de 2016 13:16
-
-
Boa tarde AndreGomesA,
Neste link há um código de uma ferramenta que faz essa conversão. Talvez possa ajudar.
Atenciosamente,
Robson William Silva
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
-
-
Bom dia,
Devido a falta de resposta do usuário
essa thread está sendo fechada.
Se o problema ainda estiver ocorrendo,
favor abrir uma nova thread.Atenciosamente,
Robson William Silva
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.