Para usar:
Instale o pacote...
dotnet add package Html2Pdf.Lib
E converta seu HTML para PDF.
using Html2Pdf.Lib;
var arguments = new Arguments().
.SetPageOrientation(PageOrientation.Landscape)
.SetPageSize(PageSize.A4);
var html = "<h1>Html to PDF</h1><p>Html to PDF converter</p>";
var pdf = Converter.FromHtml(html, arguments);
File.WriteAllBytes($"html2pdf.pdf", pdf);
É isso...
Quem nunca precisou gerar PDF a partir de um HTML?
Aliás, a gente só faz dessa forma porque é um .
Até hoje eu me questiono por que ainda usamos o PDF para compartilhamento de documentos. Já passou da hora de termos um formato aberto, e mais simples. Nada contra a Adobe, mas só quem precisa lidar com esse tipo de coisa, sabe o quanto o pâncreas dói.
Conversando com o onde ele mantém uma biblioteca que converte HTML para PDF.
Fui olhar com calma e vi que esse pacote utiliza uma outra lib chamada
Logo de cara eu pensei em migrar o projeto do HtmlToPDFCore para netstandard2.1, porém esbarrei em um grande problema: a lib Wkhtmltopdf.NetCore não suportava essa migração!
da lib Wkhtmltopdf.NetCore e logo de cara vi que o projeto foi descontinuado. Mesmo assim, naveguei entre o código para entender mais como as coisas funcionavam.
Percebi um grande uso de reflection, não que isso seja um grande problema, mas eu penso que é bom a gente evitar ao máximo isso, justamente para não termos problemas ao compilar nossas aplicações em AOT. Fiz um post que fala um pouco sobre isso e recomendo muito a leitura: passando inúmeros argumentos para efetuar a conversão.
Esse executável foi criado pelo time do QT e você pode ler mais sobre ele .
Não era pedir muito... sendo assim, resolvi criar uma nova biblioteca, atendendo esses três cenários. (Ok, são quatro, na e e sua sintaxe garbosa.
Usando o método
FromRazorTemplate<T>, é possível gerarmos um PDF a partir de um template como esse:
CODEpublic record Product(string Name, decimal Price);
public record Order(string CustomerName, string CustomerAddress, string CustomerPhoneNumber, List<Product> Products);
var razorTemplate =
"""
<!DOCTYPE html>
<html>
<head>
<title>Customer Details</title>
</head>
<body>
<h1>Customer Details</h1>
<p><strong>Name:</strong> @Model.CustomerName</p>
<p><strong>Address:</strong> @Model.CustomerAddress</p>
<p><strong>Phone Number:</strong> @Model.CustomerPhoneNumber</p>
<h2>Products (@Model.Products.Count)</h2>
@if(Model.Products.Any())
{
<table>
<thead>
<tr>
<th>Product Name</th>
<th>Price</th>
</tr>
</thead>
<tbody>
@foreach (var product in Model.Products)
{
<tr>
<td>@product.Name</td>
<td>@product.Price.ToString("C")</td>
</tr>
}
</tbody>
</table>
}
else
{
<p>No products found.</p>
}
</body>
</html>
""";
var order = new Order("Roberto Rivellino", "Rua São Jorge, 777", "+55 11 912345678", [
new("Product 1", 9.99m),
new("Product 2", 19.99m),
new("Product 3", 29.99m)
]);
var byteArrayRazorTemplate = Converter.FromRazorTemplate(razorTemplate, order, arguments);
Basicamente podemos utilizar o poder do csharp juntamente com o HTML, remetendo aos bons e velhos tempos do ASP 3 para gerarmos um PDF com valores dinâmicos. Não é incrível? Tirando a parte do ASP 3 é incrível sim!!!
Mas não é só isso! Muitas vezes precisamos gerar um lote de PDFs, dada uma lista de itens, por exemplo. Algo como, gerar informe de imposto de renda para um conjunto de pessoas.
E é pra isso que temos o método
FromRazorTemplateBatch:
CODEvar byteArrayRazorTemplateList = Converter.FromRazorTemplateBatch(razorTemplate, [ order1, order2, order3, order4 ], arguments);
for (int i = 0; i < byteArrayRazorTemplateList.Count; i++)
{
var pdf = byteArrayRazorTemplateList.ElementAt(i);
...
}
E você deve estar se perguntando, como que o template com sintaxe razor é "compilado". Para tal feito, utilizo a lib Open Source e MIT .
Quero manter esse pacote sempre atualizado e espero que mais e mais pessoas nos ajude nessa tarefa.
É isso!
Até a próxima!!!
↗ Original-Artikel auf dev.to lesenVollständiger Original-BerichtAusführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
SOCIAL SHARE CARD GENERATOR