Chcę wygenerować plik PDF, przekazując treść HTML do funkcji. Użyłem do tego iTextSharp, ale nie działa on dobrze, gdy napotyka tabele, a układ jest po prostu nieuporządkowany.
Czy jest lepszy sposób?
Chcę wygenerować plik PDF, przekazując treść HTML do funkcji. Użyłem do tego iTextSharp, ale nie działa on dobrze, gdy napotyka tabele, a układ jest po prostu nieuporządkowany.
Czy jest lepszy sposób?
Odpowiedzi:
EDYCJA: Nowa sugestia Renderer HTML dla PDF za pomocą PdfSharp
(Po wypróbowaniu wkhtmltopdf i zasugerowaniu, aby tego uniknąć)
HtmlRenderer.PdfSharp to w 100% w pełni zarządzany kod C # , łatwy w użyciu, bezpieczny w wątkach i co najważniejsze BEZPŁATNE ( nowa licencja BSD ) .
Stosowanie
Użyj przykładowej metody.
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;
}
Bardzo dobry Alternatywny Czy Free Version of iTextSharp
Do wersji 4.1.6 iTextSharp był licencjonowany na licencji LGPL, a wersje do 4.16 (lub mogą być również widelce) są dostępne jako pakiety i mogą być swobodnie używane. Oczywiście ktoś może korzystać z kontynuowanej płatnej wersji 5+ .
Próbowałem zintegrować rozwiązania wkhtmltopdf z moim projektem i miałem sporo przeszkód.
Osobiście unikałbym używania rozwiązań opartych na wkhtmltopdf w aplikacjach Hosted Enterprise z następujących powodów.
--- PRE Edytuj sekcję ---
Dla każdego, kto chce generować pdf z HTML w prostszych aplikacjach / środowiskach, pozostawiam mój stary post jako sugestię.
https://www.nuget.org/packages/TuesPechkin/
lub Specjalnie dla aplikacji internetowych MVC (ale myślę, że możesz go użyć w dowolnej aplikacji .net)
https://www.nuget.org/packages/Rotativa/
Oba wykorzystują plik binarny wkhtmtopdf do konwersji html na pdf. Który używa silnika Webkit do renderowania stron, aby mógł także analizować arkusze stylów css .
Zapewniają łatwą w użyciu płynną integrację z C #.
Rotativa może również generować bezpośrednio pliki PDF z dowolnego widoku Razor .
Dodatkowo dla aplikacji internetowych w świecie rzeczywistym zarządzają także bezpieczeństwem wątków itp.
Aktualizacja: Polecam teraz PupeteerSharp zamiast wkhtmltopdf.
Spróbuj wkhtmtopdf . To najlepsze narzędzie, jakie do tej pory znalazłem.
W przypadku platformy .NET można użyć tej małej biblioteki, aby łatwo wywołać narzędzie wiersza polecenia wkhtmtopdf.
Niedawno przeprowadziłem PoC w zakresie konwersji HTML na PDF i chciałem udostępnić swoje wyniki.
Jak dotąd moim ulubionym jest OpenHtmlToPdf
Zalety tego narzędzia:
Inne przetestowane narzędzia:
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 działa idealnie za darmo.
Ostatnia aktualizacja: marzec 2020 r
Oto lista opcji konwersji HTML na PDF w .NET, które przygotowałem (niektóre darmowe, niektóre płatne)
GemBox.Document
PDF Metamorfoza .Net
HtmlRenderer.PdfSharp
PuppeteerSharp
EO.Pdf
WnvHtmlToPdf_x64
IronPdf
Spire.PDF
Darmowy Spire.PDF dla .NET (wersja społecznościowa)
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
Zetpdf
PDFtron
WkHtmlToXSharp
Wybierz PDF
Jeśli żadna z powyższych opcji nie pomoże, zawsze możesz przeszukać pakiety NuGet https://www.nuget.org/packages?q=html+pdf
Większość konwerterów HTML na PDF polega na IE do analizowania i renderowania HTML. Może się to zepsuć, gdy użytkownik zaktualizuje swój IE. Oto taki, który nie opiera się na IE.
Kod jest mniej więcej taki:
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
Podobnie jak wiele innych konwerterów, możesz przekazywać tekst, nazwę pliku lub adres URL. Wynik można zapisać w pliku lub strumieniu.
Szczerze polecam NReco . Ma darmową i płatną wersję i naprawdę warto. Używa wkhtmtopdf w tle, ale potrzebujesz tylko jednego zestawu. Fantastyczny.
Przykład zastosowania:
Zainstaluj przez NuGet .
var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
Oświadczenie: Nie jestem programistą, tylko fanem projektu :)
Winnovative oferuje bibliotekę PDF .Net, która obsługuje wprowadzanie HTML. Oferują nieograniczony bezpłatny okres próbny . W zależności od sposobu wdrożenia projektu może to być wystarczające.
Niezbędny plik PDF może służyć do konwersji HTML na PDF : próbka C # . Przykład, do którego prowadzi link tutaj, oparty jest na ASP.NET, ale biblioteki można używać z Windows Forms, WPF, ASP.NET Webforms i ASP.NET MVC. Biblioteka oferuje opcję korzystania z różnych mechanizmów renderowania HTML: Internet Explorer (domyślnie) i WebKit (najlepsze wyjście).
Cały zestaw elementów sterujących jest dostępny bezpłatnie (również aplikacje komercyjne) za pośrednictwem programu licencji społecznościowej , jeśli się kwalifikujesz. Licencja społecznościowa jest pełnym produktem bez ograniczeń i znaków wodnych.
Uwaga: Pracuję dla Syncfusion.
Jeśli tak naprawdę nie potrzebujesz prawdziwej biblioteki PDF .Net, istnieje wiele bezpłatnych narzędzi HTML do PDF , z których wiele można uruchomić z wiersza polecenia.
Jednym z rozwiązań byłoby wybranie jednego z nich, a następnie napisanie cienkiego opakowania wokół tego w języku C #. Np. Tak jak w tym samouczku .
Użyłem ExpertPDF Html To Pdf Converter . Wykonuje przyzwoitą pracę. Niestety nie jest za darmo.
Pojawiła się także nowa internetowa aplikacja do generowania dokumentów - DocRaptor.com . Wydaje się, że jest łatwy w użyciu i jest darmowa opcja.
Są dobre wiadomości dotyczące wymagań HTML-to-PDF. Jak pokazała ta odpowiedź , norma W3C css-break-3 rozwiąże problem ... Jest to Rekomendacja Kandydacka z planem przekształcenia w ostateczną Rekomendację w 2017 lub 2018 roku, po testach.
Jako nietypowe są rozwiązania z wtyczkami do C #, co pokazuje print-css.rocks .
Możesz używać funkcji Google Chrome drukuj na pdf z trybu bezgłowego. Uznałem, że jest to najprostsza, a jednocześnie najbardziej niezawodna metoda.
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)
Używamy i polecamy.
Bardzo dobry komponent, nie tylko konwertuje stronę internetową do formatu PDF jak obraz, ale tak naprawdę konwertuje tekst, obraz, formatowanie itp.
To nie jest darmowe, ale tanie.
Jestem autorem pakietu Rotativa. Pozwala tworzyć pliki PDF bezpośrednio z widoków maszynki:
https://www.nuget.org/packages/Rotativa/
Prosty w użyciu i masz pełną kontrolę nad układem, ponieważ możesz używać widoków brzytwy z danymi z modelu i kontenera ViewBag.
Opracowałem wersję SaaS na platformie Azure. Ułatwia to korzystanie z niego z poziomu WebApi lub dowolnej aplikacji .Net, usługi, witryny Azure, webjob Azure, niezależnie od tego, co działa .Net.
Darmowe konta dostępne.
Poniżej znajduje się przykład konwersji html + css do PDF za pomocą 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();
}
To zależy od wszelkich innych wymagań.
Naprawdę proste, ale niełatwe do wdrożenia rozwiązanie to użycie formantu WebBrowser do załadowania pliku HTML, a następnie użycie metody drukowania na drukarce PDF zainstalowanej lokalnie. Dostępnych jest kilka bezpłatnych drukarek PDF, a kontrola WebBrowser jest częścią frameworka .Net.
EDYCJA: Jeśli twój HTML to XHtml, możesz użyć PDFizera do wykonania zadania.
PDF Vision jest dobry. Musisz jednak mieć pełne zaufanie, aby z niego korzystać. Wysłałem już wiadomość e-mail i zapytałem, dlaczego mój kod HTML nie został przekonwertowany na serwerze, ale działał dobrze na localhost.
Znalazłem następującą bibliotekę bardziej skuteczną w konwersji HTML do PDF.
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/
Szukałem tego też jakiś czas temu. Natknąłem się na HTMLDOC http://www.easysw.com/htmldoc/, która jest bezpłatną aplikacją wiersza poleceń o otwartym kodzie źródłowym, która bierze plik HTML jako argument i wyrzuca z niego plik PDF. W moim projekcie pobocznym zadziałało całkiem nieźle, ale wszystko zależy od tego, czego naprawdę potrzebujesz.
Firma, która sprawia, że sprzedaje skompilowane pliki binarne, ale możesz pobrać i skompilować ze źródła i używać go za darmo. Udało mi się skompilować całkiem nową wersję (dla wersji 1.9) i zamierzam wypuścić dla niej binarny instalator za kilka dni, więc jeśli jesteś zainteresowany, mogę podać link do niego, jak tylko go opublikuję.
Edytuj (25.02.2014): Wygląda na to, że dokumenty i witryna zostały przeniesione na http://www.msweet.org/projects.php?Z1
Jeśli potrzebujesz doskonałego renderowania HTML w formacie pdf, musisz użyć biblioteki komercyjnej.
ExpertPdf Html To Pdf Converter jest bardzo łatwy w użyciu i obsługuje najnowszy HTML5 / CSS3. Możesz przekonwertować cały adres URL na pdf:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);
lub ciąg HTML:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);
Możesz także zapisać bezpośrednio wygenerowany dokument pdf w strumieniu pliku na dysku.
Jest to darmowa biblioteka i działa bardzo łatwo: 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
Wygląda na to, że jak dotąd najlepszym darmowym rozwiązaniem .NET jest biblioteka TuesPechkin, która jest otoczką natywnej biblioteki wkhtmltopdf .
Użyłem teraz wersji jednowątkowej do konwersji kilku tysięcy ciągów HTML na pliki PDF i wydaje się, że działa świetnie. Ma także działać w środowiskach wielowątkowych (na przykład IIS), ale tego nie testowałem.
Ponieważ chciałem użyć najnowszej wersji wkhtmltopdf (0.12.5 w momencie pisania), pobrałem bibliotekę DLL z oficjalnej strony internetowej, skopiowałem ją do katalogu głównego projektu, ustawiłem wartość kopiowania na true i zainicjowałem bibliotekę jak więc:
var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));
Powyższy kod będzie szukał dokładnie „wkhtmltox.dll”, więc nie zmieniaj nazwy pliku. Użyłem 64-bitowej wersji biblioteki DLL.
Przeczytaj instrukcje dla środowisk wielowątkowych, ponieważ będziesz musiał zainicjować je tylko raz na cykl życia aplikacji, więc będziesz musiał umieścić je w singletonie lub coś takiego.
Oto opakowanie dla wkhtmltopdf.dll firmy pruiz
I opakowanie dla wkhtmltopdf.exe firmy Codaxy
- również w nuget .
No tests are run because no tests are loaded or the selected tests are disabled
googling nie pomaga
Najlepszym narzędziem, jakie znalazłem i którego używałem do generowania plików PDF javascript i stylów renderowanych widoków lub stron HTML jest phantomJS .
Pobierz plik .exe z funkcją rasterize.js znalezioną w katalogu głównym exe przykładowego folderu i umieść w nim rozwiązanie.
Pozwala nawet pobrać plik w dowolnym kodzie bez otwierania tego pliku, a także pozwala pobrać plik po zastosowaniu stylów i specjalnej jquery.
Poniższy kod wygeneruje plik 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;
}
Możesz także sprawdzić Spire , dzięki czemu możesz tworzyć za HTML to PDF
pomocą tego prostego fragmentu kodu
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");
Szczegółowy artykuł: Jak przekonwertować HTML na PDF w asp.net C #
Jako przedstawiciel oprogramowania HiQPdf uważam, że najlepszym rozwiązaniem jest konwerter HTML na PDF HiQPdf dla platformy .NET . Zawiera najbardziej zaawansowany silnik renderujący HTML5, CSS3, SVG i JavaScript na rynku. Istnieje również bezpłatna wersja biblioteki HTML na PDF, którą można wykorzystać do tworzenia za darmo do 3 stron PDF. Minimalny kod C # do wygenerowania pliku PDF jako bajtu [] ze strony HTML to:
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);
Bardziej szczegółowe przykłady zarówno dla ASP.NET, jak i MVC można znaleźć w repozytorium przykładów konwertera HTML na PDF .
Całkiem prawdopodobne, że większość projektów opakowuje silnik C / C ++ zamiast wdrażać od podstaw rozwiązanie C #. Wypróbuj Project Gotenberg .
Aby to przetestować
docker run --rm -p 3000:3000 thecodingmachine/gotenberg:6
Przykład zwijania
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);
}
}
}
}
Kompilować
csc sample.cs -langversion:latest -reference:System.Net.Http.dll && mono ./sample.exe
Wypróbuj ten komponent konwertujący PDF Duo .Net do konwersji HTML na PDF z aplikacji ASP.NET bez użycia dodatkowych bibliotek dll.
Możesz przekazać ciąg lub plik HTML lub strumień, aby wygenerować plik PDF. Użyj poniższego kodu (Przykład 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";
}
Informacje + przykłady C # / VB można znaleźć na stronie : http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx
Aby przekonwertować HTML na PDF w C # użyj ABCpdf .
ABCpdf może korzystać z silników renderujących Gecko lub Trident, więc twoja tabela HTML będzie wyglądać tak samo jak w FireFox i Internet Explorer.
Na stronie www.abcpdfeditor.com dostępna jest wersja demonstracyjna ABCpdf. Możesz to wykorzystać, aby sprawdzić, jak najpierw będą renderowane tabele, bez konieczności pobierania i instalowania oprogramowania.
Do renderowania całych stron internetowych potrzebujesz funkcji AddImageUrl lub AddImageHtml. Ale jeśli wszystko, co chcesz zrobić, to po prostu dodać tekst w stylu HTML, możesz wypróbować funkcję AddHtml, jak poniżej:
Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();
ABCpdf to komercyjny tytuł oprogramowania, jednak wydanie standardowe można często uzyskać bezpłatnie w ramach oferty specjalnej.
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.
najczęściej