Voglio generare un PDF passando i contenuti HTML a una funzione. Ho fatto uso di iTextSharp per questo, ma non funziona bene quando incontra le tabelle e il layout diventa appena disordinato.
Esiste un modo migliore?
Voglio generare un PDF passando i contenuti HTML a una funzione. Ho fatto uso di iTextSharp per questo, ma non funziona bene quando incontra le tabelle e il layout diventa appena disordinato.
Esiste un modo migliore?
Risposte:
EDIT: nuovo suggerimento HTML Renderer per PDF usando PdfSharp
(Dopo aver provato wkhtmltopdf e aver suggerito di evitarlo)
HtmlRenderer.PdfSharp è un codice gestito al 100% in C # , facile da usare, thread-safe e soprattutto GRATUITO ( Nuova Licenza BSD ) .
uso
Usa il metodo di esempio.
public static Byte[] PdfSharpConvert(String html)
{
Byte[] res = null;
using (MemoryStream ms = new MemoryStream())
{
var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4);
pdf.Save(ms);
res = ms.ToArray();
}
return res;
}
Un'ottima alternativa è una versione gratuita di iTextSharp
Fino alla versione 4.1.6 iTextSharp era concesso in licenza con la licenza LGPL e le versioni fino alla 4.16 (o potrebbero esserci anche le forcelle) sono disponibili come pacchetti e possono essere utilizzate liberamente. Ovviamente qualcuno può usare la versione continua a pagamento 5+ .
Ho cercato di integrare le soluzioni wkhtmltopdf nel mio progetto e ho avuto un sacco di ostacoli.
Personalmente eviterei di utilizzare soluzioni basate su wkhtmltopdf su applicazioni Hosted Enterprise per i seguenti motivi.
--- PRE Modifica sezione ---
Per chiunque voglia generare pdf da HTML in applicazioni / ambienti più semplici, lascio il mio vecchio post come suggerimento.
https://www.nuget.org/packages/TuesPechkin/
o in particolare per le applicazioni Web MVC (ma penso che tu possa usarlo in qualsiasi applicazione .net)
https://www.nuget.org/packages/Rotativa/
Entrambi utilizzano il binario wkhtmtopdf per convertire html in pdf. Che utilizza il motore webkit per il rendering delle pagine in modo che possa anche analizzare i fogli di stile CSS .
Forniscono una facile integrazione senza soluzione di continuità con C #.
Rotativa può anche generare direttamente PDF da qualsiasi vista Razor .
Inoltre, per le applicazioni web del mondo reale gestiscono anche la sicurezza dei thread, ecc ...
Aggiornamento: ora consiglierei PupeteerSharp su wkhtmltopdf.
Prova wkhtmtopdf . È lo strumento migliore che ho trovato finora.
Per .NET, è possibile utilizzare questa piccola libreria per richiamare facilmente l'utilità della riga di comando wkhtmtopdf.
Di recente ho eseguito un PoC per la conversione da HTML a PDF e volevo condividere i miei risultati.
Il mio preferito è di gran lunga OpenHtmlToPdf
Vantaggi di questo strumento:
Altri strumenti testati:
using IronPdf; IronPdf.HtmlToPdf Renderer = new IronPdf.HtmlToPdf(); // Render an HTML document or snippet as a string Renderer.RenderHtmlAsPdf("<h1>Hello World</h1>").SaveAs("html-string.pdf");
background-color
. OpenHtmlToPdf funziona perfettamente gratuitamente.
Ultimo aggiornamento: marzo 2020
Questo è l'elenco di opzioni per la conversione da HTML a PDF in .NET che ho messo insieme (alcuni gratuiti, alcuni a pagamento)
GemBox.Document
PDF Metamorphosis .Net
HtmlRenderer.PdfSharp
PuppeteerSharp
EO.Pdf
WnvHtmlToPdf_x64
IronPdf
Spire.PDF
Spire.PDF gratuito per .NET (versione comunitaria)
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
Zetpdf
PDFtron
WkHtmlToXSharp
SelectPDF
Se nessuna delle opzioni di cui sopra ti aiuta, puoi sempre cercare nei pacchetti NuGet https://www.nuget.org/packages?q=html+pdf
La maggior parte del convertitore da HTML a PDF si affida a IE per eseguire l'analisi e il rendering HTML. Ciò può interrompersi quando l'utente aggiorna il proprio IE. Eccone uno che non si basa su IE.
Il codice è qualcosa del genere:
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
Come molti altri convertitori, è possibile passare testo, nome file o URL. Il risultato può essere salvato in un file o in uno stream.
Consiglio vivamente NReco , sul serio. Ha la versione gratuita e a pagamento, e ne vale davvero la pena. Usa wkhtmtopdf in background, ma hai solo bisogno di un assembly. Fantastico.
Esempio di utilizzo:
Installa tramite NuGet .
var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
Disclaimer: non sono lo sviluppatore, solo un fan del progetto :)
Winnovative offre una libreria PDF .Net che supporta input HTML. Offrono una prova gratuita illimitata . A seconda di come desideri distribuire il tuo progetto, questo potrebbe essere sufficiente.
PDF essenziale può essere utilizzato per convertire HTML in PDF : esempio C # . L'esempio collegato qui è basato su ASP.NET, ma la libreria può essere utilizzata da Windows Form, WPF, ASP.NET Webform e ASP.NET MVC. La libreria offre la possibilità di utilizzare diversi motori di rendering HTML: Internet Explorer (impostazione predefinita) e WebKit (output ottimale).
L'intera suite di controlli è disponibile gratuitamente (anche per applicazioni commerciali) tramite il programma di licenza della community , se si qualificano. La licenza della comunità è il prodotto completo senza limiti o filigrane.
Nota: lavoro per Syncfusion.
Se non hai davvero bisogno di una vera libreria .Net PDF, ci sono numerosi strumenti gratuiti da HTML a PDF , molti dei quali possono essere eseguiti da una riga di comando.
Una soluzione sarebbe quella di scegliere uno di quelli e quindi scrivere un involucro sottile attorno a quello in C #. Ad esempio, come fatto in questo tutorial .
Ho usato ExpertPDF Convertitore HTML a PDF . Fa un lavoro decente. Sfortunatamente, non è gratuito.
C'è anche una nuova app per la generazione di documenti basata sul web - DocRaptor.com . Sembra facile da usare e c'è un'opzione gratuita.
Ci sono buone notizie per le richieste da HTML a PDF. Come ha mostrato questa risposta , lo standard W3C css-break-3 risolverà il problema ... È una raccomandazione del candidato con il piano di trasformarsi in una raccomandazione definitiva nel 2017 o 2018, dopo i test.
Come non così standard ci sono soluzioni, con plugin per C #, come mostrato da print-css.rocks .
Puoi utilizzare la funzione di stampa su pdf di Google Chrome dalla sua modalità senza testa. Ho trovato che questo è il metodo più semplice ma più robusto.
var url = "/programming/564650/convert-html-to-pdf-in-net";
var chromePath = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe";
var output = Path.Combine(Environment.CurrentDirectory, "printout.pdf");
using (var p = new Process())
{
p.StartInfo.FileName = chromePath;
p.StartInfo.Arguments = $"--headless --disable-gpu --print-to-pdf={output} {url}";
p.Start();
p.WaitForExit();
}
ABCpdf.NET (http://www.websupergoo.com/abcpdf-5.htm)
Usiamo e raccomandiamo.
Ottimo componente, non solo converte una pagina Web in PDF come un'immagine, ma converte davvero testo, immagine, formattazione, ecc ...
Non è gratuito ma è economico.
Sono l'autore del pacchetto Rotativa. Permette di creare file PDF direttamente dalle viste del rasoio:
https://www.nuget.org/packages/Rotativa/
Triviale da usare e hai il pieno controllo del layout poiché puoi utilizzare le viste del rasoio con i dati dal tuo contenitore Model e ViewBag.
Ho sviluppato una versione SaaS su Azure. Lo rende ancora più facile da usare da WebApi o da qualsiasi app .Net, servizio, sito Web di Azure, webjob di Azure, qualunque cosa esegua .Net.
Account gratuiti disponibili.
Di seguito è riportato un esempio di conversione di html + css in PDF utilizzando iTextSharp (iTextSharp + itextsharp.xmlworker)
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
byte[] pdf; // result will be here
var cssText = File.ReadAllText(MapPath("~/css/test.css"));
var html = File.ReadAllText(MapPath("~/css/test.html"));
using (var memoryStream = new MemoryStream())
{
var document = new Document(PageSize.A4, 50, 50, 60, 60);
var writer = PdfWriter.GetInstance(document, memoryStream);
document.Open();
using (var cssMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssText)))
{
using (var htmlMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)))
{
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, htmlMemoryStream, cssMemoryStream);
}
}
document.Close();
pdf = memoryStream.ToArray();
}
Dipende da tutti gli altri requisiti che hai.
Una soluzione davvero semplice ma non facilmente implementabile è quella di utilizzare un controllo WebBrowser per caricare l'Html e quindi utilizzare il metodo di stampa stampando su una stampante PDF installata localmente. Sono disponibili diverse stampanti PDF gratuite e il controllo WebBrowser fa parte del framework .Net.
MODIFICA: Se HTML è XHtml è possibile utilizzare PDFizer per fare il lavoro.
PDF Vision è buono. Tuttavia, devi avere Full Trust per usarlo. Ho già inviato un'e-mail e chiesto perché il mio HTML non è stato convertito sul server ma ha funzionato bene su localhost.
Ho trovato la seguente libreria più efficace nel convertire HTML in pdf.
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/
Lo stavo anche cercando un po 'di tempo fa. Mi sono imbattuto in HTMLDOC http://www.easysw.com/htmldoc/ che è un'app gratuita da riga di comando open source che accetta un file HTML come argomento e ne ricava un PDF. Ha funzionato abbastanza bene per il mio progetto secondario, ma tutto dipende da ciò di cui hai effettivamente bisogno.
La società che lo produce vende i binari compilati, ma sei libero di scaricare e compilare dal sorgente e usarlo gratuitamente. Sono riuscito a compilare una revisione piuttosto recente (per la versione 1.9) e intendo rilasciare un programma di installazione binario per esso in pochi giorni, quindi se sei interessato posso fornire un link non appena lo pubblico.
Modifica (25/02/2014): sembra che i documenti e il sito siano stati spostati su http://www.msweet.org/projects.php?Z1
Devi usare una libreria commerciale se hai bisogno di un perfetto rendering html in pdf.
ExpertPdf Convertitore HTML a PDF è molto facile da usare e supporta l'ultimo html5 / css3. Puoi convertire un intero URL in pdf:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);
o una stringa html:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);
Hai anche l'alternativa per salvare direttamente il documento pdf generato in un flusso di file sul disco.
Questa è una libreria gratuita e funziona molto facilmente: OpenHtmlToPdf
string timeStampForPdfName = DateTime.Now.ToString("yyMMddHHmmssff");
string serverPath = System.Web.Hosting.HostingEnvironment.MapPath("~/FolderName");
string pdfSavePath = Path.Combine(@serverPath, "FileName" + timeStampForPdfName + ".FileExtension");
//OpenHtmlToPdf Library used for Performing PDF Conversion
var pdf = Pdf.From(HTML_String).Content();
//FOr writing to file from a ByteArray
File.WriteAllBytes(pdfSavePath, pdf.ToArray()); // Requires System.Linq
Sembra che finora la migliore soluzione .NET gratuita sia la libreria MartPechkin che è un wrapper per la libreria nativa wkhtmltopdf .
Ora ho usato la versione a thread singolo per convertire alcune migliaia di stringhe HTML in file PDF e sembra funzionare alla grande. Dovrebbe funzionare anche in ambienti multi-thread (IIS, per esempio) ma non l'ho provato.
Inoltre, dal momento che volevo usare l'ultima versione di wkhtmltopdf (0.12.5 al momento della stesura), ho scaricato la DLL dal sito Web ufficiale, l'ho copiata nella radice del mio progetto, ho impostato copia su output su true e ho inizializzato la libreria come così:
var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));
Il codice sopra cercherà esattamente "wkhtmltox.dll", quindi non rinominare il file. Ho usato la versione a 64 bit della DLL.
Assicurati di leggere le istruzioni per ambienti multi-thread, poiché dovrai inizializzarlo solo una volta per ciclo di vita dell'app, quindi dovrai inserirlo in un singleton o qualcosa del genere.
Ecco un wrapper per wkhtmltopdf.dll di pruiz
E un wrapper per wkhtmltopdf.exe di Codaxy
- anche su nuget .
No tests are run because no tests are loaded or the selected tests are disabled
googling non aiuta neanche
Il miglior strumento che ho trovato e usato per generare PDF di javascript e stili di viste renderizzate o pagine html è phantomJS .
Scarica il file .exe con la funzione rasterize.js che si trova nella radice della cartella exe di esempio e inserisci la soluzione all'interno.
Permette anche di scaricare il file in qualsiasi codice senza aprire quel file e permette anche di scaricare il file quando vengono applicati gli stili e specialmente jquery.
Il codice seguente genera un file PDF:
public ActionResult DownloadHighChartHtml()
{
string serverPath = Server.MapPath("~/phantomjs/");
string filename = DateTime.Now.ToString("ddMMyyyy_hhmmss") + ".pdf";
string Url = "http://wwwabc.com";
new Thread(new ParameterizedThreadStart(x =>
{
ExecuteCommand(string.Format("cd {0} & E: & phantomjs rasterize.js {1} {2} \"A4\"", serverPath, Url, filename));
//E: is the drive for server.mappath
})).Start();
var filePath = Path.Combine(Server.MapPath("~/phantomjs/"), filename);
var stream = new MemoryStream();
byte[] bytes = DoWhile(filePath);
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=Image.pdf");
Response.OutputStream.Write(bytes, 0, bytes.Length);
Response.End();
return RedirectToAction("HighChart");
}
private void ExecuteCommand(string Command)
{
try
{
ProcessStartInfo ProcessInfo;
Process Process;
ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + Command);
ProcessInfo.CreateNoWindow = true;
ProcessInfo.UseShellExecute = false;
Process = Process.Start(ProcessInfo);
}
catch { }
}
private byte[] DoWhile(string filePath)
{
byte[] bytes = new byte[0];
bool fail = true;
while (fail)
{
try
{
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
}
fail = false;
}
catch
{
Thread.Sleep(1000);
}
}
System.IO.File.Delete(filePath);
return bytes;
}
Puoi anche controllare Spire , ti permette di creare HTML to PDF
con questo semplice pezzo di codice
string htmlCode = "<p>This is a p tag</p>";
//use single thread to generate the pdf from above html code
Thread thread = new Thread(() =>
{ pdf.LoadFromHTML(htmlCode, false, setting, htmlLayoutFormat); });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
// Save the file to PDF and preview it.
pdf.SaveToFile("output.pdf");
System.Diagnostics.Process.Start("output.pdf");
Articolo dettagliato: Come convertire HTML in PDF in asp.net C #
Come rappresentante del software HiQPdf credo che la soluzione migliore sia il convertitore da HTML a PDF HiQPdf per .NET . Contiene il motore di rendering HTML5, CSS3, SVG e JavaScript più avanzato sul mercato. Esiste anche una versione gratuita della libreria da HTML a PDF che è possibile utilizzare per produrre gratuitamente fino a 3 pagine PDF. Il codice C # minimo per produrre un PDF come byte [] da una pagina HTML è:
HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
// set PDF page size, orientation and margins
htmlToPdfConverter.Document.PageSize = PdfPageSize.A4;
htmlToPdfConverter.Document.PageOrientation = PdfPageOrientation.Portrait;
htmlToPdfConverter.Document.Margins = new PdfMargins(0);
// convert HTML to PDF
byte[] pdfBuffer = htmlToPdfConverter.ConvertUrlToMemory(url);
Puoi trovare esempi più dettagliati sia per ASP.NET che per MVC nel repository degli esempi di convertitore HTML / PDF HiQPdf .
Molto probabilmente la maggior parte dei progetti includerà un motore C / C ++ anziché implementare una soluzione C # da zero. Prova il progetto Gotenberg .
Per testarlo
docker run --rm -p 3000:3000 thecodingmachine/gotenberg:6
Esempio di arricciatura
curl --request POST \
--url http://localhost:3000/convert/url \
--header 'Content-Type: multipart/form-data' \
--form remoteURL=https://brave.com \
--form marginTop=0 \
--form marginBottom=0 \
--form marginLeft=0 \
--form marginRight=0 \
-o result.pdf
C # sample.cs
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
using static System.Console;
namespace HelloWorld
{
class Program
{
public static async Task Main(string[] args)
{
try
{
var client = new HttpClient();
var formContent = new MultipartFormDataContent
{
{new StringContent("https://duckduckgo.com/"), "remoteURL"},
{new StringContent("0"), "marginTop" }
};
var result = await client.PostAsync(new Uri("http://localhost:3000/convert/url"), formContent);
await File.WriteAllBytesAsync("duckduck.com.pdf", await result.Content.ReadAsByteArrayAsync());
}
catch (Exception ex)
{
WriteLine(ex);
}
}
}
}
Compilare
csc sample.cs -langversion:latest -reference:System.Net.Http.dll && mono ./sample.exe
Prova questo componente di conversione PDF Duo .Net per convertire HTML in PDF dall'applicazione ASP.NET senza usare dll aggiuntive.
È possibile passare la stringa o il file HTML o lo stream per generare il PDF. Usa il codice qui sotto (Esempio C #):
string file_html = @"K:\hdoc.html";
string file_pdf = @"K:\new.pdf";
try
{
DuoDimension.HtmlToPdf conv = new DuoDimension.HtmlToPdf();
conv.OpenHTML(file_html);
conv.SavePDF(file_pdf);
textBox4.Text = "C# Example: Converting succeeded";
}
Info + C # / VB esempi che puoi trovare su: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx
Per convertire HTML in PDF in C # usa ABCpdf .
ABCpdf può utilizzare i motori di rendering Gecko o Trident, quindi la tua tabella HTML avrà lo stesso aspetto di FireFox e Internet Explorer.
C'è una demo online di ABCpdf su www.abcpdfeditor.com. Puoi usarlo per verificare come verranno visualizzati per primi i tuoi tavoli, senza la necessità di scaricare e installare software.
Per il rendering di intere pagine Web sono necessarie le funzioni AddImageUrl o AddImageHtml. Ma se tutto ciò che vuoi fare è semplicemente aggiungere un testo in stile HTML, puoi provare la funzione AddHtml, come di seguito:
Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();
ABCpdf è un titolo di software commerciale, tuttavia l'edizione standard può spesso essere ottenuta gratuitamente in offerta speciale.
However, you must disclose your affiliation with the product in your answers. Also, if a huge percentage of your posts include a mention of your product, you're clearly here for the wrong reasons.
Tutte le risposte sono state su ABCpdf