Tôi muốn tạo một tệp PDF bằng cách chuyển nội dung HTML đến một hàm. Tôi đã sử dụng iTextSharp cho việc này nhưng nó không hoạt động tốt khi nó gặp các bảng và bố cục chỉ bị lộn xộn.
Có cách nào tốt hơn?
Tôi muốn tạo một tệp PDF bằng cách chuyển nội dung HTML đến một hàm. Tôi đã sử dụng iTextSharp cho việc này nhưng nó không hoạt động tốt khi nó gặp các bảng và bố cục chỉ bị lộn xộn.
Có cách nào tốt hơn?
Câu trả lời:
EDIT: Trình kết xuất HTML đề xuất mới cho PDF bằng PdfSharp
(Sau khi thử wkhtmltopdf và đề nghị tránh nó)
HtmlRenderer.PdfSharp là một mã được quản lý C # đầy đủ 100% , dễ sử dụng, an toàn cho chuỗi và quan trọng nhất là MIỄN PHÍ ( Giấy phép BSD mới ) .
Sử dụng
Sử dụng phương pháp ví dụ.
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;
}
Một thay thế rất tốt là phiên bản miễn phí của iTextSharp
Cho đến khi phiên bản 4.1.6 iTextSharp được cấp phép theo giấy phép LGPL và các phiên bản cho đến 4.16 (hoặc cũng có thể có dĩa) có sẵn dưới dạng gói và có thể được sử dụng miễn phí. Tất nhiên ai đó có thể sử dụng phiên bản trả phí 5+ tiếp tục .
Tôi đã cố gắng tích hợp các giải pháp wkhtmltopdf vào dự án của mình và gặp một loạt trở ngại.
Cá nhân tôi sẽ tránh sử dụng các giải pháp dựa trên wkhtmltopdf trên các ứng dụng Hosted Enterprise vì những lý do sau.
--- Phần chỉnh sửa TRƯỚC ---
Đối với bất kỳ ai muốn tạo pdf từ html trong các ứng dụng / môi trường đơn giản hơn, tôi để lại bài đăng cũ của mình dưới dạng đề xuất.
https://www.nuget.org/packages/TuesPechkin/
hoặc Đặc biệt cho các ứng dụng web MVC (Nhưng tôi nghĩ bạn có thể sử dụng nó trong bất kỳ ứng dụng .net nào)
https://www.nuget.org/packages/Rotativa/
Cả hai đều sử dụng nhị phân wkhtmtopdf để chuyển đổi html sang pdf. Mà sử dụng công cụ webkit để hiển thị các trang để nó cũng có thể phân tích các biểu định kiểu css .
Chúng cung cấp dễ dàng sử dụng tích hợp liền mạch với C #.
Rotativa cũng có thể tạo tệp PDF trực tiếp từ bất kỳ Chế độ xem Dao cạo nào .
Ngoài ra, đối với các ứng dụng web trong thế giới thực, họ cũng quản lý an toàn luồng, v.v ...
Cập nhật: Bây giờ tôi muốn giới thiệu PupeteerSharp trên wkhtmltopdf.
Hãy thử wkhtmtopdf . Nó là công cụ tốt nhất mà tôi đã tìm thấy cho đến nay.
Đối với .NET, bạn có thể sử dụng thư viện nhỏ này để dễ dàng gọi tiện ích dòng lệnh wkhtmtopdf.
Gần đây tôi đã thực hiện một PoC liên quan đến chuyển đổi HTML sang PDF và muốn chia sẻ kết quả của mình.
Yêu thích của tôi cho đến nay là OpenHtmlToPdf
Ưu điểm của công cụ này:
Các công cụ khác được thử nghiệm:
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 hoạt động hoàn hảo miễn phí.
Cập nhật lần cuối: Tháng 3 năm 2020
Đây là danh sách các tùy chọn để chuyển đổi HTML sang PDF trong .NET mà tôi đã kết hợp (một số miễn phí một số phải trả tiền)
GemBox.Document
Biến thái PDF .Net
HtmlRenderer.PdfSharp
Con rốiSharp
EO.Pdf
WnvHtmlToPdf_x64
IronPdf
Spire.PDF
Spire.PDF miễn phí cho .NET (Phiên bản cộng đồng)
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
Zetpdf
PDFtron
WkHtmlToXSharp
ChọnPDF
Nếu không có tùy chọn nào ở trên giúp bạn, bạn luôn có thể tìm kiếm các gói NuGet https://www.nuget.org/packages?q=html+pdf
Hầu hết các trình chuyển đổi HTML sang PDF dựa vào IE để thực hiện phân tích cú pháp và kết xuất HTML. Điều này có thể phá vỡ khi người dùng cập nhật IE của họ. Đây là một cái không dựa vào IE.
Mã này là một cái gì đó như thế này:
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
Giống như nhiều trình chuyển đổi khác, bạn có thể truyền văn bản, tên tệp hoặc Url. Kết quả có thể được lưu vào một tập tin hoặc một luồng.
Tôi đánh giá cao NReco , nghiêm túc. Nó có phiên bản miễn phí và trả phí, và thực sự đáng giá. Nó sử dụng wkhtmtopdf trong nền, nhưng bạn chỉ cần một hội đồng. Tuyệt diệu.
Ví dụ sử dụng:
Cài đặt qua NuGet .
var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
Tuyên bố miễn trừ trách nhiệm: Tôi không phải là nhà phát triển, chỉ là người hâm mộ của dự án :)
Winnovative cung cấp thư viện .Net PDF hỗ trợ đầu vào HTML. Họ cung cấp một thử nghiệm miễn phí không giới hạn . Tùy thuộc vào cách bạn muốn triển khai dự án của mình, điều này có thể là đủ.
PDF thiết yếu có thể được sử dụng để chuyển đổi HTML sang PDF : mẫu C # . Mẫu được liên kết ở đây dựa trên ASP.NET, nhưng thư viện có thể được sử dụng từ Windows Forms, WPF, ASP.NET Webforms và ASP.NET MVC. Thư viện cung cấp tùy chọn sử dụng các công cụ kết xuất HTML khác nhau: Internet Explorer (mặc định) và WebKit (đầu ra tốt nhất).
Toàn bộ bộ điều khiển có sẵn miễn phí (ứng dụng thương mại) thông qua chương trình cấp phép cộng đồng nếu bạn đủ điều kiện. Giấy phép cộng đồng là sản phẩm đầy đủ không có giới hạn hoặc hình mờ.
Lưu ý: Tôi làm việc cho Syncfusion.
Nếu bạn không thực sự cần một thư viện .Net PDF thực sự, có rất nhiều công cụ HTML sang PDF miễn phí , nhiều công cụ có thể chạy từ một dòng lệnh.
Một giải pháp sẽ là chọn một trong số đó và sau đó viết một trình bao bọc mỏng xung quanh đó trong C #. Ví dụ, như được thực hiện trong hướng dẫn này .
Tôi đã sử dụng ExpertPDF Html To Pdf Converter . Làm một công việc tốt. Thật không may, nó không miễn phí.
Ngoài ra còn có một ứng dụng tạo tài liệu dựa trên web mới - DocRaptor.com . Có vẻ dễ sử dụng, và có một tùy chọn miễn phí.
Có một tin tốt cho nhu cầu HTML-to-PDF. Như câu trả lời này cho thấy , css-break-3 tiêu chuẩn W3C sẽ giải quyết vấn đề ... Đó là Khuyến nghị của Ứng viên với kế hoạch biến thành Khuyến nghị dứt khoát vào năm 2017 hoặc 2018, sau các thử nghiệm.
Vì không chuẩn nên có các giải pháp, với các plugin cho C #, như được hiển thị bởi print-css.rocks .
Bạn có thể sử dụng tính năng in-pdf của Google Chrome từ chế độ không đầu. Tôi thấy đây là phương pháp đơn giản nhất nhưng mạnh mẽ nhất.
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)
Chúng tôi sử dụng và đề nghị.
Thành phần rất tốt, nó không chỉ chuyển đổi một trang web thành PDF như hình ảnh mà còn thực sự chuyển đổi văn bản, hình ảnh, định dạng, v.v ...
Nó không miễn phí nhưng nó rẻ.
Dưới đây là một ví dụ về chuyển đổi html + css sang PDF bằng 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();
}
Nó phụ thuộc vào bất kỳ yêu cầu khác mà bạn có.
Một giải pháp thực sự đơn giản nhưng không dễ triển khai là sử dụng điều khiển WebBrowser để tải Html và sau đó sử dụng phương pháp In cho máy in PDF được cài đặt cục bộ. Có một số máy in PDF miễn phí có sẵn và điều khiển WebBrowser là một phần của khung .Net.
EDIT: Nếu bạn Html là XHtml, bạn có thể sử dụng PDFizer để thực hiện công việc.
Tầm nhìn PDF là tốt. Tuy nhiên, bạn phải có Full Trust để sử dụng nó. Tôi đã gửi email và hỏi tại sao HTML của tôi không được chuyển đổi trên máy chủ nhưng nó hoạt động tốt trên localhost.
Tôi là tác giả của gói Rotativa. Nó cho phép tạo tập tin PDF trực tiếp từ chế độ xem dao cạo:
https://www.nuget.org/packages/Rotativa/
Việc sử dụng không quan trọng và bạn có toàn quyền kiểm soát bố cục vì bạn có thể sử dụng chế độ xem dao cạo với dữ liệu từ thùng chứa Model và ViewBag.
Tôi đã phát triển phiên bản SaaS trên Azure. Nó làm cho nó dễ dàng hơn để sử dụng nó từ WebApi hoặc bất kỳ ứng dụng, dịch vụ, trang web Azure, webjob Azure nào, bất cứ thứ gì chạy .Net.
Tài khoản miễn phí có sẵn.
Tôi thấy thư viện sau hiệu quả hơn trong việc chuyển đổi html sang pdf.
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/
Tôi cũng đã tìm kiếm điều này một thời gian trở lại. Tôi đã chạy vào HTMLDOC http://www.easysw.com/htmldoc/ , đây là một ứng dụng dòng lệnh mã nguồn mở miễn phí, lấy một tệp HTML làm đối số và tạo ra một tệp PDF từ nó. Nó làm việc cho tôi khá tốt cho dự án phụ của tôi, nhưng tất cả phụ thuộc vào những gì bạn thực sự cần.
Công ty sản xuất nó bán các tệp nhị phân đã biên dịch, nhưng bạn có thể tải xuống và biên dịch miễn phí từ nguồn và sử dụng miễn phí. Tôi đã quản lý để biên dịch một bản sửa đổi gần đây (cho phiên bản 1.9) và tôi dự định sẽ phát hành trình cài đặt nhị phân cho nó trong vài ngày, vì vậy nếu bạn quan tâm tôi có thể cung cấp liên kết tới nó ngay khi tôi đăng nó.
Chỉnh sửa (25/2/2014): Có vẻ như các tài liệu và trang web đã được chuyển đến http://www.msweet.org/projects.php?Z1
Bạn cần sử dụng một thư viện thương mại nếu bạn cần kết xuất html hoàn hảo trong pdf.
ExpertPdf Html To Pdf Converter rất dễ sử dụng và nó hỗ trợ html5 / css3 mới nhất. Bạn có thể chuyển đổi toàn bộ url sang pdf:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);
hoặc một chuỗi html:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);
Bạn cũng có thể thay thế để lưu trực tiếp tài liệu pdf đã tạo vào Luồng tệp trên đĩa.
Đây là một thư viện miễn phí và hoạt động rất dễ dàng: 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
Có vẻ như cho đến nay, giải pháp .NET miễn phí tốt nhất là thư viện Thứ Ba , là một trình bao bọc xung quanh thư viện riêng wkhtmltopdf .
Bây giờ tôi đã sử dụng phiên bản đơn luồng để chuyển đổi một vài nghìn chuỗi HTML thành tệp PDF và nó dường như hoạt động rất tốt. Nó cũng được cho là hoạt động trong môi trường đa luồng (ví dụ IIS) nhưng tôi chưa thử nghiệm điều đó.
Ngoài ra, vì tôi muốn sử dụng phiên bản mới nhất của wkhtmltopdf (0.12,5 tại thời điểm viết bài), tôi đã tải xuống DLL từ trang web chính thức, sao chép nó vào thư mục gốc của dự án, đặt bản sao thành đầu ra thành đúng và khởi tạo thư viện như vì thế:
var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));
Mã ở trên sẽ trông chính xác cho "wkhtmltox.dll", vì vậy đừng đổi tên tệp. Tôi đã sử dụng phiên bản 64-bit của DLL.
Hãy chắc chắn rằng bạn đã đọc hướng dẫn cho các môi trường đa luồng, vì bạn sẽ chỉ phải khởi tạo nó một lần cho mỗi vòng đời ứng dụng, do đó bạn sẽ cần đặt nó trong một đơn hoặc một cái gì đó.
Đây là một trình bao bọc cho wkhtmltopdf.dll bởi pruiz
Và một trình bao bọc cho wkhtmltopdf.exe bởi Cod Wax
- cũng trên nuget .
No tests are run because no tests are loaded or the selected tests are disabled
cũng không giúp được gì
Công cụ tốt nhất tôi đã tìm thấy và sử dụng để tạo PDF của javascript và các kiểu hiển thị lượt xem hoặc trang html là ph PhantomJS .
Tải xuống tệp .exe với chức năng rasterize.js được tìm thấy trong thư mục gốc của thư mục ví dụ và đặt giải pháp bên trong.
Nó thậm chí cho phép bạn tải xuống tệp trong bất kỳ mã nào mà không cần mở tệp đó, nó cũng cho phép tải xuống tệp khi các kiểu và jquery đặc biệt được áp dụng.
Mã sau đây tạo tệp 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;
}
Bạn cũng có thể kiểm tra Spire , nó cho phép bạn tạo HTML to PDF
bằng đoạn mã đơn giản này
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");
Bài viết chi tiết: Cách chuyển đổi HTML sang PDF trong asp.net C #
Là đại diện của Phần mềm HiQPdf, tôi tin rằng giải pháp tốt nhất là HiQPdf chuyển đổi HTML sang PDF cho .NET . Nó chứa công cụ kết xuất HTML5, CSS3, SVG và JavaScript tiên tiến nhất trên thị trường. Ngoài ra còn có một phiên bản miễn phí của thư viện HTML sang PDF mà bạn có thể sử dụng để sản xuất miễn phí tối đa 3 trang PDF. Mã C # tối thiểu để tạo PDF dưới dạng byte [] từ trang HTML là:
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);
Bạn có thể tìm thấy các ví dụ chi tiết hơn cho cả ASP.NET và MVC trong kho lưu trữ ví dụ HiQPdf HTML sang PDF .
Rất có thể hầu hết các dự án sẽ bọc Công cụ C / C ++ thay vì triển khai giải pháp C # từ đầu. Hãy thử dự án Gotenberg .
Để kiểm tra nó
docker run --rm -p 3000:3000 thecodingmachine/gotenberg:6
Ví dụ Curl
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);
}
}
}
}
Để biên dịch
csc sample.cs -langversion:latest -reference:System.Net.Http.dll && mono ./sample.exe
Hãy thử thành phần chuyển đổi PDF Duo .Net này để chuyển đổi HTML sang PDF từ ứng dụng ASP.NET mà không cần sử dụng thêm các dll.
Bạn có thể truyền chuỗi hoặc tệp HTML hoặc luồng để tạo tệp PDF. Sử dụng mã dưới đây (Ví dụ 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";
}
Ví dụ về thông tin + C # / VB bạn có thể tìm thấy tại: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx
Để chuyển đổi HTML sang PDF trong C #, hãy sử dụng ABCpdf .
ABCpdf có thể sử dụng các công cụ kết xuất Gecko hoặc Trident, do đó bảng HTML của bạn sẽ trông giống như xuất hiện trong FireFox và Internet Explorer.
Có bản demo trực tuyến của ABCpdf tại www.abcpdfeditor.com. Bạn có thể sử dụng điều này để kiểm tra xem bảng của bạn sẽ hiển thị như thế nào trước mà không cần tải xuống và cài đặt phần mềm.
Để hiển thị toàn bộ trang web, bạn sẽ cần các hàm AddImageUrl hoặc AddImageHtml. Nhưng nếu tất cả những gì bạn muốn làm chỉ đơn giản là thêm văn bản theo kiểu HTML thì bạn có thể thử chức năng AddHtml, như sau:
Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();
ABCpdf là một tiêu đề phần mềm thương mại, tuy nhiên phiên bản tiêu chuẩn thường có thể được lấy miễn phí theo đề nghị đặc biệt.
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.
Tất cả các câu trả lời của bạn là về ABCpdf