Converti HTML in PDF in .NET


425

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?


È possibile utilizzare GemBox.Document per questo. Anche qui puoi trovare un codice di esempio per convertire un file HTML in un file PDF.
Mario Z,

Quale versione di iTextSharp usi e potresti condividere il tuo HTML?
Amedee Van Gasse,

Ancora nessuna risposta alla mia richiesta di ulteriori informazioni. Aggiungi anche se stai utilizzando HTMLWorker o XMLWorker.
Amedee Van Gasse,

Che dire di .net core?
Piero Alberto,

SETTEMBRE 2019: ho aggiunto una nuova risposta, alcune delle opzioni elencate sono gratuite, altre pagate e alcune sono disponibili come .net core stackoverflow.com/questions/564650/…
Mauricio Gracia Gutierrez,

Risposte:


198

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

  1. Scarica il pacchetto nuget HtmlRenderer.PdfSharp.
  2. 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.

  1. Innanzitutto wkhtmltopdf è implementato in C ++ e non in C #, e si verificheranno vari problemi che lo incorporano nel codice C #, in particolare passando da build a 32 bit a 64 bit del progetto. Ho dovuto provare diverse soluzioni alternative, incluso lo sviluppo di progetti condizionati, ecc., Solo per evitare "eccezioni di formato non valide" su macchine diverse.
  2. Se gestisci la tua macchina virtuale, va bene. Ma se il tuo progetto è in esecuzione in un ambiente limitato come ( Azure (in realtà è impossibile con l'azzurro come menzionato dall'autore di MartPenchin ), Elastic Beanstalk ecc.) È un incubo configurare quell'ambiente solo per far funzionare wkhtmltopdf.
  3. wkhtmltopdf sta creando file all'interno del tuo server, quindi devi gestire i permessi degli utenti e concedere l'accesso "in scrittura" a dove è in esecuzione wkhtmltopdf.
  4. Wkhtmltopdf è in esecuzione come applicazione autonoma, quindi non è gestita dal pool di applicazioni IIS . Quindi devi ospitarlo come servizio su un'altra macchina o sperimenterai picchi di elaborazione e consumo di memoria all'interno del tuo server di produzione.
  5. Utilizza i file temporanei per generare il pdf e in casi come AWS EC2 che ha un I / o del disco molto lento è un grosso problema di prestazioni.
  6. L'errore "Impossibile caricare" wkhtmltox.dll "DLL segnalato da molti utenti.

--- PRE Modifica sezione ---

Per chiunque voglia generare pdf da HTML in applicazioni / ambienti più semplici, lascio il mio vecchio post come suggerimento.

TuesPechkin

https://www.nuget.org/packages/TuesPechkin/

o in particolare per le applicazioni Web MVC (ma penso che tu possa usarlo in qualsiasi applicazione .net)

rotativa

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 ...


2
Grazie per aver aggiornato il tuo post. Proverò PdfSharp. Mi hai risparmiato un sacco di tempo.
John Henckel,

1
PdfSharp è buono in termini di prestazioni, ma non ha reso i float correttamente per me. Fortunatamente, ho potuto cambiare il markup per usare buoni vecchi tavoli, PdfSharp li gestisce bene.
Gebb,

3
Abbiamo provato HtmlRenderer. È stato davvero veloce quando non si caricava alcun CSS. Ma quando abbiamo provato ad applicare CSS (Bootstrap più alcuni su misura), l'analisi CSS ha richiesto un po 'di tempo (che probabilmente potremmo mitigare) e il rendering era completamente diverso dalla pagina web.
Eccezionale:

1
@ user2347528 - guardando l'origine di HtmlRenderer.PdfSharp, non c'è modo di risolverlo - ci vuole solo l'altezza totale della pagina e le clip in ogni pagina PDF, il che è davvero sfortunato - significa che i PDF multipagina con questa libreria possono davvero ' essere fatto.
Mr. Bungle,

3
BS. Questo crea un'immagine dell'HTML e aggiunge l'immagine nel file pdf. Questo non è affatto un vero PDF. Inoltre, il PDF è un formato di grafica vettoriale - puoi scorrere quasi all'infinito - ovviamente tranne se il PDF è costituito da una grafica raster, che è ciò che questa libreria produce.
Stefan Steiger,

191

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.


17
supporta .NET ??
Kiquenet,

6
è un eseguibile autonomo. Puoi avviarlo come processo, passando un URL del documento HTML come argomento.
Marek,

46
@bamccaig Ce l'ho già =) github.com/gmanny/Pechkin Espone tutte le funzioni utilizzabili della libreria e ha anche un wrapper per l'uso in più thread. Ed è su NuGet.
Gman,


7
@ AdamMoszczyński: da Wikipedia : LGPL consente agli sviluppatori e alle aziende di utilizzare e integrare il software LGPL nel proprio software (anche proprietario) senza che sia richiesto (ai termini di un forte copyleft) di rilasciare il codice sorgente delle proprie parti software.
Oliver,

34

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:

  • Ottima compatibilità HTML (ad es. Era l'unico strumento nel mio esempio che ripeteva correttamente le intestazioni delle tabelle quando una tabella si estendeva su più pagine)
  • API fluente
  • Gratuito e OpenSource ( licenza Creative Commons Attribution 3.0 )
  • Disponibile tramite NuGet

Altri strumenti testati:


+1 per questo, ho testato HtmlRenderer per PdfSharp ma ho riscontrato troppi problemi con le interruzioni di pagina. Posso vivere con la dipendenza da wkHtmlToPdf in questo progetto, quindi questa soluzione è stata fantastica - rende l'HTML in modo bello.
jmdon,

Sembrava bellissimo, ma wow ci è voluto molto tempo. 30 secondi, con un tema bootstrap e così via, una pagina piuttosto semplice, ma comunque.
Nicholas Petersen,

Stephanie di IronPDF qui. Ecco un esempio di codice su come utilizzare IronPDF per convertire HTML in PDF in C #. Maggiori informazioni sono disponibili nel nostro tutorial html in pdf sul nostro sito Web. 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");
Stephanie,

Ho usato iText pdfHtml ma non supporta background-color. OpenHtmlToPdf funziona perfettamente gratuitamente.
Hp93,

Concordo con la superiorità di OpenHtmlToPdf. Inoltre, supporta la fusione di .exe e .dll con ILMerge.
Saygley,

30

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)

Se nessuna delle opzioni di cui sopra ti aiuta, puoi sempre cercare nei pacchetti NuGet https://www.nuget.org/packages?q=html+pdf


1
ne hai provato qualcuno per le prestazioni? stiamo cercando di migliorare i tempi di conversione in corso e stiamo esplorando altre librerie per questi vantaggi prestazionali
frno

Non ho fatto alcun confronto delle prestazioni soprattutto perché è un elenco così lungo - forse là fuori qualcuno ha già fatto una "revisione delle prestazioni delle librerie .net di generazione PDF" o simile
Mauricio Gracia Gutierrez

28

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.


35
non è utile perché è necessario acquistare la libreria
d1jhoni1b

47
d1jhoni1b, in che modo questo non lo rende utile? Se si tratta di uno strumento a pagamento, si potrebbe dire che è costoso, ma non inutile solo su tali criteri.
Don Rolling,

3
È vero EO.Pdf non usa IE. Ma sembra generare in background istanze a 32 bit di un browser webkit. Controlla l'elenco dei processi e li vedrai come istanze di rundll32.exe che puntano alla dll EO.PDF. Quindi secondo me è ancora un po 'confuso.
Matt,

1
Non supporta media = "print" che è davvero doloroso.
Marat Faskhiev il

15
Licenza per sviluppatore singolo per $ 650. È costoso.
Abhijeet Nagre,

25

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 :)


3
Sembra davvero molto utile. Vale la pena notare che ad oggi (05/10/15), è il wrapper .Net più scaricato per wkhtmtopdf (come pacchetto Nuget).
ken2k,

3
Provato, sfortunatamente non sono riuscito a farlo funzionare sulle pagine web di azzurro.
gabriel14,

Questa libreria funziona perfettamente quando la eseguo localmente sul mio computer, ma sul server di hosting vedo il seguente errore in modo casuale. Il pdf viene generato a volte ma a volte genera il seguente errore. "Errore. Si è verificato un errore durante l'elaborazione della tua richiesta. Impossibile generare PDF: (codice di uscita: 1)"
user2347528

wkhtmtopdf dipende da GDI + o x-server se si esegue su Mono / Linux. Quindi questo non è utile per gli ambienti server ...
nuzzolilo,

È buono e funziona come previsto, ma un po 'di problema di qualità che vedo nel mio pdf, possiamo migliorare questo?
Bharat,

13

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.


4
Ricordare che l'ultima volta che abbiamo verificato winnovative era incompatibile con IE9 (in quanto utilizzavano il motore di rendering GDI di IE che è stato rimosso in IE9). Quindi se hai IE9 installato sul computer che stai utilizzando, la conversione non funzionerebbe. Potrebbero averlo risolto al momento della lettura, ma molti dei componenti commerciali utilizzavano il motore di rendering IE e si sono sbloccati con IE9, quindi vale la pena verificarlo.
Fubaar

Winnovative è stato il più semplice da installare e ha funzionato immediatamente. Ma: 1. NON FUNZIONA sui siti Web di Azure, solo CloudApp. 2. è lento, ci vogliono ben 8 secondi per generare un semplice PDF in una macchina virtuale Azure D1
jsgoupil,

Confermare. È veramente lento. Ho confrontato con wkhtmltopdf.
Marat Faskhiev il

Winnovative Library è molto costosa. Circa $ 650 per la licenza sviluppatore e $ 1200 per l'altra licenza.
Abhijeet Nagre,

Winnovative HTML to PDF Converter funziona nei siti Web di Azure e non dipende da IE, come suggerito in un commento. Controllare la soluzione da Winnovative HTML a PDF per Azure sul sito Web: winnovative-software.com/html-to-pdf-converter-azure.aspx . Per migliorare il tempo di conversione, impostare HtmlToPdf.ConversionDelay = 0. Il convertitore utilizza un ritardo predefinito per gestire le pagine HTML che aggiornano il loro contenuto dopo il caricamento della pagina.
EvoPdf,

9

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.


8

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 .


Il tutorial utilizza un componente di un sito Web che non esiste più.
Tom Winter,

7

Ho usato ExpertPDF Convertitore HTML a PDF . Fa un lavoro decente. Sfortunatamente, non è gratuito.


ExpertPDf ha un'opzione per la marcatura dell'acqua dei documenti?
user1799214,

@ user1799214 - Sì, ExpertPDF supporta filigrane. Vedi qui per il codice di esempio. L'ho usato con successo con filigrane su uno dei miei siti Web.
Teofilo,

Funziona abbastanza bene, ma non rispondono alle domande di supporto.
Michael Freidgeim,

7

C'è anche una nuova app per la generazione di documenti basata sul web - DocRaptor.com . Sembra facile da usare e c'è un'opzione gratuita.


7

Aggiornamento del 2018 e usiamo HTML + CSS standard = equazione PDF!

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 .


1
Le soluzioni collegate da print-css.rocks costano $ 2.950,00 per PDFreactor, $ 3800 per Prince e $ 5.000,00 per Antenna House Formatter V7. E Weasyprint sembra essere per Python.
MDave il

6

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();
    }

Ehi, questo è davvero fantastico per server di proprietà e vps. Grazie per la condivisione.
mjb

Per consentire ad ASP.NET in IIS di eseguire un programma esterno con autorizzazione di accesso in scrittura, il pool di applicazioni> impostazioni avanzate> identità> impostato su "LocalSystem"
mjb

4

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.


10
Lo abbiamo usato per un paio d'anni e lo abbiamo trovato piuttosto doloroso da usare. Scarso supporto, molto schizzinoso a causa del suo involucro attorno al motore di rendering di IE, scarsa qualità dell'immagine e compressione, limitata capacità di personalizzare la richiesta fatta per gestire alcuni scenari di utilizzo più avanzati (come fornire cookie e intestazioni di richiesta). Suppongo che il suo funzionamento sia soggetto a ciò di cui hai bisogno.
Moribvndvs,

3
+1 per ABCPdf. Il commentatore precedente non deve aver parlato con le stesse persone di supporto che ho fatto - mi hanno sempre scritto subito e hanno sempre avuto una soluzione per tutti i problemi che abbiamo avuto. Ora supportano l'utilizzo di Gecko come motore di rendering anziché IE. Puoi scegliere quello che desideri in fase di esecuzione. ABC ti consente di fare letteralmente tutto ciò che PDF ti consente di fare.
Steve,

12
supporto troppo costoso e scarso. Non consiglio affatto abcPDF.
Vivek,

L'ho usato anche negli ultimi 6 anni e, ad essere onesti, ci è servito bene.
toepoke.co.uk,

Questa risposta non è ancora un'altra ripetizione di stackoverflow.com/a/2182212/471213 ? Voglio dire, l'altro ragazzo che è affiliato al programma almeno ha fornito alcune righe di codice di esempio
usr-local-ΕΨΗΕΛΩΝ

4

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.

http://www.rotativahq.com/

Account gratuiti disponibili.


Questo si basa su Itextsharp e quindi è necessario disporre di una licenza per itextsharp per usarlo?
Micah Armantrout,

2
@MicahArmantrout No, non lo è. Utilizza wkhtmltopdf.exe per creare il file PDF. Nessuna licenza necessaria.
Giorgio Bozio,

@MicahArmantrout, iTextSharp non è anche GNU GPL? gnu.org/licenses/agpl.html
Pranav Singh,

Non è consigliabile l'utilizzo di versioni precedenti a iText (Sharp) 5 per motivi sia tecnici sia legali. stackoverflow.com/questions/8517776/itexsharp-license
Micah Armantrout

4

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();
}

Nota che iTextSharp funziona con XHtml ed è abbastanza sensibile alla qualità del tuo html. Si spezzerebbe, dove non sarebbero SelectPdf e HiqPdf.
Savage

3

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.


3

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.



2

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


ciao, puoi fornire un link e anche una guida su come usarlo con c # asp.net grazie
user287745

static.persistedthoughts.com/htmldoc_1.9.1586-setup.exe Tenere presente che si tratta di un programma da riga di comando. Devi eseguirlo dall'applicazione per farlo funzionare. Puoi trovare la documentazione per i suoi argomenti e avvertenze nel capitolo 4 su: easysw.com/htmldoc/documentation.php
enriquein

Non sono sicuro di quanto sia utile al giorno d'oggi, ma se ti aiuta: dropbox.com/s/9kfn3ttoxs0fiar/htmldoc_1.9.1586-setup.exe
enriquein

Il sito Web non è più operativo.
Tom Winter,

2

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.


Non è necessario utilizzare una libreria commerciale se è necessario il perfetto rendering html in pdf
obayhan,

Sto cominciando a crederci. Ho provato 5 dei freebies e tutti hanno una cosa che lo rovina per me. Da soffocare a una pagina che va oltre un semplice mondo di ciao, a sembrare orribile - Penso che dovrò tossire un po 'di soldi per un vero convertitore. I campioni di ciascuno dei prodotti commerciali funzionano esattamente come ci si aspetterebbe che il PDF uscisse.
Herb Meehan,

@obayhan - Vorrei crederti. Forse potresti condividere con noi un link a qualunque strumento tu stia trovando così bene.
Peter, finito il

@PeterWone in alto ci sono molte alternative open source come puoi vedere facilmente. Chiedere a qualcuno di condividere le stesse cose è solo rubare tempo. Ma se hai provato tutti loro e non sei soddisfatto, spero che condividerai i tuoi commenti sotto di loro su ciò che non ti soddisfa e forse potrebbe aiutare a far crescere la conoscenza.
obayhan,

@obayhan - Perché ripetere ciò che altri hanno già fatto? Si dividono in tre categorie: dipendenze non veramente gratuite e inaccettabili come wkhtmltopdf o IE9 e HTML Renderer per PDFSharp. HR per PDF # è l'unico in C # puro e fa un lavoro orribile di impaginazione: rende una pagina lunga e la taglia, spesso tagliando le righe di testo. Se riesco a trovare il tempo per riscrivere completamente il renderer, HR per PDF # vincerebbe a mani basse: è veloce, gratuito e non ha dipendenze. Ma sarebbe un renderer completamente nuovo, temo.
Peter Wone,

2

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


2

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.


1

Ecco un wrapper per wkhtmltopdf.dll di pruiz

E un wrapper per wkhtmltopdf.exe di Codaxy
- anche su nuget .


Documenti o tutorial su come usarli? c'è solo il codice sorgente lì senza alcuna documentazione
Burjua

1
Scarica il codice e dai un'occhiata ai test unitari. Questo dovrebbe darti alcuni esempi di buon utilizzo.
Garfield,

Non aiuta davvero, in realtà non riesco nemmeno a fare test della soluzione pruiz per funzionare, dice che No tests are run because no tests are loaded or the selected tests are disabledgoogling non aiuta neanche
Burjua,

@ Burjua questo è comunemente correlato alla versione del test runner che si sta utilizzando. Tuttavia, prova ad aprire un problema sul sito del mio progetto github e cercherò di aiutarti ..
Pablo Ruiz García,

Ciao questo wrapper funziona bene, ma non mostra i miei grafici a torta di Google. Quindi, finché non riesco a risolvere questo problema, dovrei trovare un'altra soluzione.
Andre Lombaard,

1

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 condividere il tuo codice sorgente completo? Sono nuovo di C #, quindi mi sto bloccando anche sulle importazioni.
Sibi John,

1

Puoi anche controllare Spire , ti permette di creare HTML to PDFcon 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 #


Spire genera un file PDF che è solo un'immagine. Alcuni dei CSS non sono nemmeno corretti, come ignorare i caratteri in grassetto.
Savage

Vedi la risposta alla mia domanda relativa alla generazione dei PDF come immagine: e-iceblue.com/forum/nuget-pdf-as-non-image-t6710.html
Savage

Spire è il quarto che ho provato da questa pagina e penso che sia il migliore, grazie.
MDave,

1

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 .


1
Produce risultati decenti, ma come SelectPdf, può avere un grande impatto sul tempo di compilazione e distribuire le dimensioni del pacchetto. Stava quasi raddoppiando il tempo di compilazione di Visual Studio. Ho anche avuto difficoltà a riempire la mia pagina - l'html era troppo piccolo nel mezzo - a questo proposito SelectPdf ha fatto un lavoro migliore.
Savage

1
il riempimento della pagina con contenuto HTML dipende dalla proprietà HtmlToPdf.BrowserWidth. È di default 1200 pixel, ma è possibile impostarlo su 800 pixel e il codice HTML dovrebbe riempire molto bene l'intera pagina PDF. Puoi trovare una demo live e un codice di esempio per questo su hiqpdf.com/demo/HtmlFittingAndScalingOptions.aspx
HiQPdf

1
Nessun supporto .NET Core neanche.
Taylor Buchanan,

1

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

0

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


1
BitDefender riporta: "Rilevato malware! L'accesso a questa pagina è stato bloccato.". Non ho alcuna opinione se questa relazione sia autentica o falsa positiva.
GeoffM,

0

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.


91
Dovresti davvero scrivere in tutte le tue risposte che lavori per websupergoo. Dalla domanda: 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
jgauffin,

12
Ahia! Ho suggerito ABCpdf perché è un componente con cui ho familiarità. Se una grande percentuale dei miei post riguarda PDF, è solo perché mi astengo dal contribuire ad argomenti al di fuori delle mie aree di interesse. Scuse.
AffineMesh,

Nella difesa dei manifesti, il sito fa capire che il prodotto è abbastanza buono.
Tom Winter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.