Saya ingin menghasilkan PDF dengan mengirimkan konten HTML ke suatu fungsi. Saya telah menggunakan iTextSharp untuk ini tetapi tidak berkinerja baik ketika bertemu tabel dan tata letak hanya berantakan.
Apakah ada cara yang lebih baik?
Saya ingin menghasilkan PDF dengan mengirimkan konten HTML ke suatu fungsi. Saya telah menggunakan iTextSharp untuk ini tetapi tidak berkinerja baik ketika bertemu tabel dan tata letak hanya berantakan.
Apakah ada cara yang lebih baik?
Jawaban:
EDIT: Saran Baru Renderer HTML untuk PDF menggunakan PdfSharp
(Setelah mencoba wkhtmltopdf dan menyarankan untuk menghindarinya)
HtmlRenderer.PdfSharp adalah 100% kode sepenuhnya dikelola C # , mudah digunakan, aman thread dan yang paling penting GRATIS ( Lisensi BSD Baru ) solusi.
Pemakaian
Gunakan Metode Contoh.
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;
}
Alternatif yang Sangat Baik Adalah Versi Gratis dari iTextSharp
Sampai versi 4.1.6 iTextSharp dilisensikan di bawah lisensi LGPL dan versi hingga 4.16 (atau mungkin juga ada garpu) tersedia sebagai paket dan dapat digunakan secara bebas. Tentu saja seseorang dapat menggunakan versi berbayar 5+ yang berkelanjutan .
Saya mencoba mengintegrasikan solusi wkhtmltopdf pada proyek saya dan memiliki banyak rintangan.
Saya pribadi akan menghindari penggunaan solusi berbasis wkhtmltopdf pada aplikasi Hosted Enterprise karena alasan berikut.
--- PRE Edit Bagian ---
Bagi siapa saja yang ingin menghasilkan pdf dari html di aplikasi / lingkungan yang lebih sederhana, saya meninggalkan posting lama saya sebagai saran.
https://www.nuget.org/packages/TuesPechkin/
atau Khusus Untuk Aplikasi Web MVC (Tapi saya pikir Anda dapat menggunakannya dalam aplikasi .net)
https://www.nuget.org/packages/Rotativa/
Keduanya menggunakan biner wkhtmtopdf untuk mengkonversi html ke pdf. Yang menggunakan mesin webkit untuk merender halaman sehingga juga dapat mengurai style sheet css .
Mereka menyediakan integrasi tanpa batas yang mudah digunakan dengan C #.
Rotativa juga dapat menghasilkan langsung PDF dari Tampilan Razor apa pun .
Selain itu untuk aplikasi web dunia nyata, mereka juga mengelola keamanan utas dll ...
Pembaruan: Saya sekarang akan merekomendasikan PupeteerSharp di atas wkhtmltopdf.
Coba wkhtmtopdf . Ini adalah alat terbaik yang saya temukan sejauh ini.
Untuk .NET, Anda dapat menggunakan ini perpustakaan kecil untuk dengan mudah memanggil utilitas baris perintah wkhtmtopdf.
Baru-baru ini saya melakukan PoC tentang konversi HTML ke PDF dan ingin membagikan hasil saya.
Sejauh ini favorit saya adalah OpenHtmlToPdf
Keuntungan alat ini:
Alat lain yang diuji:
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 bekerja dengan sempurna secara gratis.
Terakhir Diperbarui: Maret 2020
Ini adalah daftar opsi untuk konversi HTML ke PDF di .NET yang telah saya kumpulkan (beberapa gratis berbayar)
Dokumen GemBox
PDF Metamorfosis .Net
HtmlRenderer.PdfSharp
PuppeteerSharp
EO.Pdf
WnvHtmlToPdf_x64
IronPdf
Spire.PDF
Free Spire.PDF untuk .NET (Versi Komunitas)
Aspose.Html
EvoPDF
ExpertPdfHtmlToPdf
Zetpdf
PDFtron
WkHtmlToXSharp
PilihPDF
Jika tidak ada opsi di atas yang membantu Anda, Anda selalu dapat mencari paket NuGet https://www.nuget.org/packages?q=html+pdf
Sebagian besar pengonversi HTML ke PDF mengandalkan IE untuk melakukan penguraian dan rendering HTML. Ini bisa pecah ketika pengguna memperbarui IE mereka. Ini adalah salah satu yang tidak bergantung pada IE.
Kodenya kira-kira seperti ini:
EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);
Seperti banyak konverter lainnya, Anda dapat mengirimkan teks, nama file, atau Url. Hasilnya dapat disimpan ke dalam file atau stream.
Saya sangat merekomendasikan NReco , serius. Ini memiliki versi gratis dan berbayar, dan sangat berharga. Ini menggunakan wkhtmtopdf di latar belakang, tetapi Anda hanya perlu satu perakitan. Fantastis.
Contoh penggunaan:
Instal melalui NuGet .
var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
Penafian: Saya bukan pengembang, hanya penggemar proyek :)
Winnovative menawarkan perpustakaan .Net PDF yang mendukung input HTML. Mereka menawarkan uji coba gratis tanpa batas . Bergantung pada bagaimana Anda ingin menggunakan proyek Anda, ini mungkin cukup.
Essential PDF dapat digunakan untuk mengonversi HTML ke PDF : C # sample . Sampel yang ditautkan ke sini adalah berbasis ASP.NET, tetapi pustaka dapat digunakan dari Windows Forms, WPF, ASP.NET Webforms, dan ASP.NET MVC. Perpustakaan menawarkan opsi untuk menggunakan mesin rendering HTML yang berbeda: Internet Explorer (default) dan WebKit (output terbaik).
Seluruh rangkaian kontrol tersedia gratis (aplikasi komersial juga) melalui program lisensi komunitas jika Anda memenuhi syarat. Lisensi komunitas adalah produk lengkap tanpa batasan atau tanda air.
Catatan: Saya bekerja untuk Syncfusion.
Jika Anda tidak benar-benar membutuhkan perpustakaan .Net PDF yang sebenarnya, ada banyak alat HTML ke PDF gratis , yang banyak di antaranya dapat dijalankan dari baris perintah.
Salah satu solusinya adalah dengan memilih salah satu dari mereka dan kemudian menulis pembungkus tipis di sekitar itu di C #. Misalnya, seperti yang dilakukan dalam tutorial ini .
Saya menggunakan ExpertPDF Html To Pdf Converter . Melakukan pekerjaan yang layak. Sayangnya, ini tidak gratis.
Ada juga aplikasi pembuatan dokumen berbasis web baru - DocRaptor.com . Tampaknya mudah digunakan, dan ada opsi gratis.
Ada kabar baik untuk tuntutan HTML-ke-PDF. Seperti yang ditunjukkan oleh jawaban ini , standar W3C css-break-3 akan menyelesaikan masalah ... Ini adalah Calon Rekomendasi dengan rencana untuk berubah menjadi Rekomendasi definitif pada 2017 atau 2018, setelah pengujian.
Karena tidak terlalu standar ada solusi, dengan plugin untuk C #, seperti yang ditunjukkan oleh print-css.rocks .
Anda dapat menggunakan fitur cetak-ke-pdf Google Chrome dari mode tanpa kepala. Saya menemukan ini sebagai metode paling sederhana namun paling kuat.
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)
Kami menggunakan dan merekomendasikan.
Komponen yang sangat bagus, itu tidak hanya mengkonversi halaman web ke PDF seperti gambar tetapi benar-benar mengubah teks, gambar, pemformatan, dll ...
Ini tidak gratis tetapi murah.
Saya penulis paket Rotativa. Memungkinkan untuk membuat file PDF langsung dari tampilan pisau cukur:
https://www.nuget.org/packages/Rotativa/
Sepele untuk digunakan dan Anda memiliki kontrol penuh pada tata letak karena Anda dapat menggunakan tampilan pisau cukur dengan data dari Model dan wadah ViewBag Anda.
Saya mengembangkan versi SaaS di Azure. Itu membuatnya lebih mudah untuk menggunakannya dari WebApi atau aplikasi .Net, layanan, situs web Azure, webjob Azure, apa pun yang menjalankan .Net.
Akun gratis tersedia.
Di bawah ini adalah contoh konversi html + css ke PDF menggunakan 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();
}
Itu tergantung pada persyaratan lain yang Anda miliki.
Solusi yang sangat sederhana tetapi tidak mudah untuk digunakan adalah dengan menggunakan kontrol WebBrowser untuk memuat Html dan kemudian menggunakan metode cetak untuk mencetak ke printer PDF yang diinstal secara lokal. Ada beberapa printer PDF gratis yang tersedia dan kontrol WebBrowser adalah bagian dari framework .Net.
EDIT: Jika Anda Html adalah XHtml Anda dapat menggunakan PDFizer untuk melakukan pekerjaan itu.
Saya menemukan perpustakaan berikut ini lebih efektif dalam mengkonversi html ke pdf.
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/
Saya juga mencari ini beberapa waktu lalu. Saya berlari ke HTMLDOC http://www.easysw.com/htmldoc/ yang merupakan aplikasi baris perintah open source gratis yang mengambil file HTML sebagai argumen dan mengeluarkan PDF dari itu. Ini bekerja dengan baik untuk proyek sampingan saya, tetapi semuanya tergantung pada apa yang sebenarnya Anda butuhkan.
Perusahaan yang membuatnya menjual binari yang dikompilasi, tetapi Anda bebas mengunduh dan mengkompilasi dari sumber dan menggunakannya secara gratis. Saya berhasil menyusun revisi yang cukup baru (untuk versi 1.9) dan saya bermaksud merilis installer biner untuk itu dalam beberapa hari, jadi jika Anda tertarik saya dapat memberikan tautan kepadanya segera setelah saya mempostingnya.
Sunting (2/25/2014): Sepertinya dokumen dan situs dipindahkan ke http://www.msweet.org/projects.php?Z1
Anda perlu menggunakan perpustakaan komersial jika Anda membutuhkan rendering html yang sempurna dalam pdf.
ExpertPdf Html To Pdf Converter sangat mudah digunakan dan mendukung html5 / css3 terbaru. Anda dapat mengonversi seluruh url ke pdf:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);
atau string html:
using ExpertPdf.HtmlToPdf;
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);
Anda juga memiliki alternatif untuk secara langsung menyimpan dokumen pdf yang dihasilkan ke Stream file pada disk.
Ini adalah perpustakaan gratis dan bekerja dengan sangat mudah: 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
Sepertinya sejauh ini solusi .NET gratis terbaik adalah perpustakaan SubsPechkin yang merupakan pembungkus di sekitar perpustakaan asli wkhtmltopdf .
Saya sekarang telah menggunakan versi single-threaded untuk mengonversi beberapa ribu string HTML ke file PDF dan tampaknya berfungsi dengan baik. Seharusnya juga berfungsi di lingkungan multi-threaded (IIS, misalnya) tetapi saya belum mengujinya.
Juga karena saya ingin menggunakan versi terbaru dari wkhtmltopdf ( 0.12.5 pada saat penulisan), saya mengunduh DLL dari situs web resmi, menyalinnya ke root proyek saya, mengatur salinan ke keluaran ke true, dan menginisialisasi perpustakaan seperti begitu:
var dllDir = AppDomain.CurrentDomain.BaseDirectory;
Converter = new StandardConverter(new PdfToolset(new StaticDeployment(dllDir)));
Kode di atas akan terlihat persis "wkhtmltox.dll", jadi jangan mengubah nama file. Saya menggunakan versi 64-bit dari DLL.
Pastikan Anda membaca instruksi untuk lingkungan multi-utas, karena Anda harus menginisialisasi hanya sekali per siklus hidup aplikasi sehingga Anda harus memasukkannya ke dalam singleton atau apalah.
Ini bungkusnya untuk wkhtmltopdf.dll oleh pruiz
Dan pembungkus untuk wkhtmltopdf.exe oleh Codaxy
- juga di nuget .
No tests are run because no tests are loaded or the selected tests are disabled
googling juga tidak membantu
Alat terbaik yang saya temukan dan digunakan untuk menghasilkan PDF dari javascript dan gaya yang diberikan tampilan atau halaman html adalah phantomJS .
Unduh file .exe dengan fungsi rasterize.js yang ditemukan di root dari folder contoh exe dan masukkan solusi di dalamnya.
Bahkan memungkinkan Anda untuk mengunduh file dalam kode apa pun tanpa membuka file itu juga memungkinkan untuk mengunduh file ketika gaya dan jquery khusus diterapkan.
Kode berikut menghasilkan 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;
}
Anda juga dapat memeriksa Spire , ini memungkinkan Anda membuat HTML to PDF
dengan potongan kode sederhana ini
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");
Artikel terperinci: Cara mengonversi HTML ke PDF di asp.net C #
Sebagai perwakilan dari Perangkat Lunak HiQPdf saya percaya solusi terbaik adalah HiQPdf HTML to PDF converter untuk .NET . Ini berisi mesin rendering HTML5, CSS3, SVG dan JavaScript paling canggih di pasaran. Ada juga versi gratis dari perpustakaan HTML ke PDF yang dapat Anda gunakan untuk menghasilkan secara gratis hingga 3 halaman PDF. Kode C # minimal untuk menghasilkan PDF sebagai byte [] dari halaman HTML adalah:
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);
Anda dapat menemukan contoh yang lebih terperinci baik untuk ASP.NET dan MVC dalam repositori contoh HTML ke PDF Converter HiQPdf .
Kemungkinan besar sebagian besar proyek akan membungkus Mesin C / C ++ daripada mengimplementasikan solusi C # dari awal. Coba Proyek Gotenberg .
Untuk mengujinya
docker run --rm -p 3000:3000 thecodingmachine/gotenberg:6
Contoh Keriting
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);
}
}
}
}
Untuk mengkompilasi
csc sample.cs -langversion:latest -reference:System.Net.Http.dll && mono ./sample.exe
Coba komponen konversi PDF Duo .Net ini untuk mengonversi HTML ke PDF dari aplikasi ASP.NET tanpa menggunakan dll.
Anda dapat melewati string atau file HTML, atau streaming untuk menghasilkan PDF. Gunakan kode di bawah ini (Contoh 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 contohnya dapat Anda temukan di: http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx
Untuk mengonversi HTML ke PDF dalam C # gunakan ABCpdf .
ABCpdf dapat menggunakan mesin rendering Gecko atau Trident, sehingga tabel HTML Anda akan terlihat sama seperti yang muncul di FireFox dan Internet Explorer.
Ada demo online ABCpdf di www.abcpdfeditor.com. Anda bisa menggunakan ini untuk memeriksa bagaimana tabel Anda akan merender terlebih dahulu, tanpa perlu mengunduh dan menginstal perangkat lunak.
Untuk merender seluruh halaman web Anda memerlukan fungsi AddImageUrl atau AddImageHtml. Tetapi jika semua yang ingin Anda lakukan hanyalah menambahkan teks bergaya HTML maka Anda dapat mencoba fungsi AddHtml, seperti di bawah ini:
Doc theDoc = new Doc();
theDoc.FontSize = 72;
theDoc.AddHtml("<b>Some HTML styled text</b>");
theDoc.Save(Server.MapPath("docaddhtml.pdf"));
theDoc.Clear();
ABCpdf adalah judul perangkat lunak komersial, namun edisi standar seringkali dapat diperoleh secara gratis dengan penawaran khusus.
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.
Semua jawaban Anda tentang ABCpdf