Chuyển đổi HTML sang PDF bằng .NET


425

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?


Bạn có thể sử dụng GemBox.Document cho việc này. Cũng tại đây, bạn có thể tìm thấy một mã mẫu để chuyển đổi tệp HTML thành tệp PDF.
Mario Z

Bạn sử dụng phiên bản iTextSharp nào và bạn có thể chia sẻ html của mình không?
Amedee Van Gasse

Vẫn không có câu trả lời cho yêu cầu của tôi để biết thêm thông tin. Vui lòng thêm nếu bạn đang sử dụng HTMLWorker hoặc XMLWorker.
Amedee Van Gasse

Còn lõi .net thì sao?
Piero Alberto

SEPT 2019: Tôi đã thêm một câu trả lời mới, một số tùy chọn được liệt kê là những người khác được trả tiền miễn phí và một số có sẵn như .net core stackoverflow.com/questions/564650/ Lỗi
Mauricio Gracia Gutierrez

Câu trả lời:


198

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

  1. Tải xuống gói nuget HtmlRenderer.PdfSharp .
  2. 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ốtphiê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.

  1. Trước hết, wkhtmltopdf là C ++ được triển khai chứ không phải C # và bạn sẽ gặp nhiều vấn đề khác nhau khi nhúng nó vào mã C # của mình, đặc biệt là trong khi chuyển đổi giữa các bản dựng 32 bit và 64 bit của dự án. Phải thử một số cách giải quyết bao gồm xây dựng dự án có điều kiện, v.v. chỉ để tránh "ngoại lệ định dạng không hợp lệ" trên các máy khác nhau.
  2. Nếu bạn quản lý máy ảo của riêng bạn thì ok. Nhưng nếu dự án của bạn đang chạy trong một môi trường bị hạn chế như ( Azure (Trên thực tế là không thể chống lại phương vị như được đề cập bởi tác giả Thứ ba ), Elastic Beanstalk, v.v.) thì đó là một cơn ác mộng khi chỉ định cấu hình môi trường đó để wkhtmltopdf hoạt động.
  3. wkhtmltopdf đang tạo các tệp trong máy chủ của bạn để bạn phải quản lý quyền của người dùng và cấp quyền truy cập "ghi" vào nơi wkhtmltopdf đang chạy.
  4. Wkhtmltopdf đang chạy như một ứng dụng độc lập, do đó, nó không được quản lý bởi nhóm ứng dụng IIS của bạn . Vì vậy, bạn phải lưu trữ nó dưới dạng dịch vụ trên một máy khác hoặc bạn sẽ gặp phải tình trạng xử lý đột biến và tiêu thụ bộ nhớ trong máy chủ sản xuất của mình.
  5. Nó sử dụng các tệp tạm thời để tạo pdf và trong các trường hợp như AWS EC2 có đĩa thực sự chậm, đó là một vấn đề hiệu năng lớn.
  6. Lỗi "Không thể tải DLL 'wkhtmltox.dll'" bị ghét nhất được báo cáo bởi nhiều người dùng.

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

Thứ ba

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)

Rotativa

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


2
Cảm ơn bạn đã cập nhật bài viết của bạn. Tôi sẽ thử PdfSharp. Bạn đã tiết kiệm cho tôi rất nhiều thời gian.
John Henckel

1
PdfSharp tốt về hiệu suất, nhưng nó không khiến tôi nổi đúng cách. May mắn thay, tôi có thể thay đổi đánh dấu để sử dụng các bảng cũ tốt, PdfSharp xử lý chúng tốt.
Gebb

3
Chúng tôi đã thử HtmlRenderer. Nó thực sự nhanh chóng khi không tải bất kỳ CSS nào. Nhưng khi chúng tôi thử áp dụng CSS (Bootstrap cộng với một số bespoke), việc phân tích cú pháp CSS mất một thời gian (mà chúng tôi có thể giảm thiểu) và kết xuất hoàn toàn khác với trang web.
Nổi bật vào

1
@ user2347528 - nhìn vào nguồn cho HtmlRenderer.PdfSharp, không có cách nào để khắc phục điều này - chỉ cần lấy tổng chiều cao trang và clip vào mỗi trang PDF, điều này thật đáng tiếc - điều đó có nghĩa là các tệp PDF nhiều trang với thư viện này thực sự có thể ' được thực hiện
Ông Bungle

3
BS. Điều này tạo ra một hình ảnh của HTML và thêm hình ảnh vào tệp pdf. Đây hoàn toàn không phải là một bản PDF. Ngoài ra, PDF là một định dạng đồ họa vector - bạn có thể cuộn gần vô hạn - tất nhiên trừ khi PDF bao gồm một đồ họa raster, đó là những gì thư viện này tạo ra.
Stefan Steiger

191

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.


17
hỗ trợ .NET ??
Kiquenet

6
nó là một thực thi độc lập. Bạn có thể khởi chạy nó như một quá trình, chuyển một URL của tài liệu HTML làm đối số.
Marek

46
@bamccaig Tôi đã có nó rồi =) github.com/gmanny/Pechkin Nó hiển thị mọi chức năng có thể sử dụng của thư viện và cũng có trình bao bọc để sử dụng trong nhiều luồng. Và đó là trên NuGet.
Gman

7
Để sử dụng điều này trong C # stackoverflow.com/questions/4651373/ Kẻ
Daniel Little

7
@ AdamMoszczyński: Từ Wikipedia : LGPL cho phép các nhà phát triển và công ty sử dụng và tích hợp phần mềm LGPL vào phần mềm (thậm chí độc quyền) của họ mà không bị yêu cầu (theo các điều khoản của một copyleft mạnh) để phát hành mã nguồn của các phần mềm của chính họ.
Oliver

34

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:

  • Khả năng tương thích HTML rất tốt (ví dụ: đây là công cụ duy nhất trong ví dụ của tôi lặp lại chính xác các tiêu đề bảng khi một bảng kéo dài nhiều trang)
  • API thông thạo
  • FreeSource và OpenSource ( giấy phép Creative Commons Attribution 3.0 )
  • Có sẵn qua NuGet

Các công cụ khác được thử nghiệm:


+1 cho điều này, tôi đã thử nghiệm HtmlRenderer cho PdfSharp nhưng gặp quá nhiều vấn đề với việc ngắt trang. Tôi có thể sống với sự phụ thuộc vào wkHtmlToPdf trong dự án này vì vậy giải pháp này rất tuyệt - nó hiển thị HTML rất đẹp.
jmdon

Nhìn đẹp, nhưng wow phải mất một thời gian dài. 30 giây, với một chủ đề bootstrap và vv, trang khá đơn giản, nhưng dù sao.
Nicholas Petersen

Stephanie từ IronPDF đây. Đây là một mẫu mã về cách sử dụng IronPDF để chuyển đổi html sang PDF trong C #. Nhiều hơn có thể được tìm thấy trong hướng dẫn html sang pdf của chúng tôi trên trang web của chúng tôi. 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

Tôi đã sử dụng iText pdfHtml nhưng nó không hỗ trợ background-color. OpenHtmlToPdf hoạt động hoàn hảo miễn phí.
Hp93

Tôi đồng ý với sự vượt trội của OpenHtmlToPdf. Ngoài ra, nó hỗ trợ hợp nhất .exe và .t với ILMerge.
saygle

30

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)

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


1
Bạn đã thử nghiệm bất kỳ cho hiệu suất? chúng tôi đang tìm cách cải thiện thời gian chuyển đổi hiện tại và đang khám phá các thư viện khác để có những lợi ích hiệu suất này
từ

Tôi chưa thực hiện bất kỳ so sánh hiệu suất nào, đặc biệt là vì một danh sách dài như vậy - có thể ở ngoài đó ai đó đã thực hiện "đánh giá hiệu suất thư viện PDF .net" hoặc tương tự
Mauricio Gracia Gutierrez

28

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.


35
nó không hữu ích vì bạn phải mua thư viện
d1jhoni1b

47
d1jhoni1b, làm thế nào điều này làm cho nó không hữu ích? Nếu nó là một công cụ trả tiền, thì nó có thể được cho là đắt tiền, nhưng không vô dụng với tiêu chí đó.
Don Cán

3
Đó là EO.Pdf thật không sử dụng IE. Nhưng nó dường như sinh ra các phiên bản 32 bit của trình duyệt webkit ở chế độ nền. Kiểm tra danh sách quy trình của bạn và bạn sẽ thấy chúng là các trường hợp rundll32.exe chỉ vào dll EO.PDF. Vì vậy, nó vẫn là một chút hacky theo ý kiến ​​của tôi.
Matt

1
Nó không hỗ trợ media = "print", điều này thực sự đau đớn.
Marat Faskhiev

15
Giấy phép phát triển duy nhất với giá $ 650. Đó là tốn kém.
Abhijeet Nagre 17/8/2015

25

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


3
Trông thực sự khá hữu ích. Đáng chú ý là tính đến ngày hôm nay (05/10/15), đây là trình bao bọc .Net được tải xuống nhiều nhất cho wkhtmtopdf (dưới dạng gói Nuget).
ken2k

3
Đã thử nó, thật không may, tôi không thể làm cho nó hoạt động trên các trang web của azure.
gabriel14

Thư viện này hoạt động tốt khi tôi chạy cục bộ trên máy của mình, nhưng trên máy chủ lưu trữ, tôi gặp lỗi ngẫu nhiên sau đây. Pdf đôi khi được tạo nhưng đôi khi nó gây ra lỗi sau. "Lỗi. Đã xảy ra lỗi khi xử lý yêu cầu của bạn. Không thể tạo PDF: (mã thoát: 1)"
user2348528

wkhtmtopdf phụ thuộc vào GDI + hoặc máy chủ x nếu bạn đang chạy trên Mono / Linux. Vì vậy, điều này không hữu ích cho môi trường máy chủ ...
nuzzolilo

Nó tốt và hoạt động như mong đợi nhưng vấn đề chất lượng bit tôi thấy trong pdf của mình, chúng ta có thể cải thiện điều này không?
Bharat

13

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à đủ.


4
Hãy nhớ rằng khi chúng tôi kiểm tra winnovative lần cuối không tương thích với IE9 (vì họ đã sử dụng công cụ kết xuất IE GDI đã bị xóa trong IE9). Vì vậy, nếu bạn đã cài đặt IE9 trên máy bạn đang sử dụng, chuyển đổi sẽ không hoạt động. Họ có thể đã sửa nó vào thời điểm bạn đọc nó, nhưng nhiều thành phần thương mại đã sử dụng công cụ kết xuất IE và đã không hoạt động với IE9 nên rất đáng để kiểm tra.
fubaar

Winnovative là dễ dàng nhất để thiết lập và nó chỉ hoạt động ra khỏi hộp. Nhưng: 1. nó KHÔNG LÀM VIỆC trên các trang web Azure, chỉ có CloudApp. 2. chậm, phải mất 8 giây để tạo một tệp PDF đơn giản trên máy ảo Azure D1
jsgoupil

Xác nhận. Nó thực sự rất chậm. Tôi so sánh với wkhtmltopdf.
Marat Faskhiev

Thư viện Winnovative là rất tốn kém. Một số $ 650 cho giấy phép nhà phát triển và $ 1200 cho giấy phép khác.
Abhijeet Nagre 17/08/2015

Winnovative HTML to PDF Converter hoạt động trong các trang web Azure và nó không phụ thuộc vào IE như được đề xuất trong một bình luận. Vui lòng kiểm tra giải pháp Winnovative HTML sang PDF cho Azure trên trang web: winnovative-software.com/html-to-pdf-converter-azure.aspx . Để cải thiện thời gian chuyển đổi, hãy đặt HtmlToPdf.ConversionDelay = 0. Trình chuyển đổi đang sử dụng độ trễ mặc định để xử lý các trang HTML cập nhật nội dung của chúng sau khi trang được tải.
EvoPdf

9

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.


8

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 .


Hướng dẫn sử dụng một thành phần từ một trang web không còn tồn tại nữa.
Tom Winter

7

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


ExpertPDf có tùy chọn nước đánh dấu tài liệu không?
dùng1799214

@ user1799214 - Có, ExpertPDF hỗ trợ hình mờ. Xem ở đây cho mã mẫu. Tôi đã sử dụng thành công với hình mờ trên một trong các trang web của mình.
Theophilus

Nó hoạt động khá tốt, nhưng họ không trả lời các câu hỏi hỗ trợ.
Michael Freidgeim

7

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


7

Cập nhật năm 2018 và hãy sử dụng phương trình HTML + CSS = PDF tiêu chuẩn!

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 .


1
Các giải pháp được liên kết bởi print-css.rocks có giá 2.950,00 đô la cho PDFreactor, 3800 đô la cho Hoàng tử và 5.000 đô la cho Công cụ định dạng ăng ten V7. Và Weasyprint dường như là dành cho Python.
MDave

6

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

Hey, điều này thực sự tuyệt vời cho máy chủ sở hữu và vps. Cám ơn vì đã chia sẻ.
mjb

Để cho phép ASP.NET trong IIS chạy chương trình bên ngoài với quyền truy cập ghi, nhóm ứng dụng> cài đặt trước> nhận dạng> được đặt thành "LocalSystem"
mjb

4

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


10
Chúng tôi đã sử dụng điều này trong một vài năm và thấy nó khá đau khi sử dụng. Hỗ trợ kém, rất khó khăn do trình bao bọc của nó xung quanh công cụ kết xuất IE, chất lượng hình ảnh và nén kém, khả năng tùy chỉnh yêu cầu bị hạn chế để xử lý một số tình huống sử dụng nâng cao hơn (như cung cấp cookie và tiêu đề yêu cầu). Tôi cho rằng nó hoạt động tốt như thế nào tùy thuộc vào những gì bạn cần nó làm.
moribvndvs

3
+1 cho ABCPdf. Người bình luận trước đó không được nói chuyện với những người hỗ trợ giống như tôi đã làm - họ luôn viết thư cho tôi ngay và luôn có giải pháp cho mọi vấn đề chúng tôi gặp phải. Bây giờ họ hỗ trợ sử dụng Gecko làm công cụ kết xuất thay vì IE. Bạn có thể chọn cái bạn muốn vào thời gian chạy. ABC cho phép bạn làm bất cứ điều gì theo nghĩa đen mà PDF cho phép bạn làm.
Steve

12
quá đắt và hỗ trợ kém. Tôi không khuyên bạn nên abcPDF cả.
Vivek

Tôi đã sử dụng nó trong 6 năm qua và để công bằng, nó đã phục vụ chúng tôi tốt.
toepoke.co.uk

Đây không phải là câu trả lời nữa của stackoverflow.com/a/2182212/471213 ? Ý tôi là, anh chàng khác liên kết với chương trình ít nhất đã cung cấp một vài dòng mã ví dụ
usr-local-ΕΨΗΕΛΩΝ

4

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

Lưu ý rằng iTextSharp hoạt động với XHtml và khá nhạy cảm với chất lượng html của bạn. Nó sẽ bị hỏng, trong đó SelectPdf và HiqPdf sẽ không.
Savage

3

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.


3

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.


3

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.

http://www.rotativahq.com /

Tài khoản miễn phí có sẵn.


Điều này có dựa vào Itextsharp và vì vậy bạn cần phải có giấy phép cho itextsharp để sử dụng nó?
Micah Armantrout

2
@MicahArmantrout Không, không. Nó sử dụng wkhtmltopdf.exe để tạo tệp PDF. Không cần giấy phép.
Giorgio Bozio

@MicahArmantrout, Không phải iTextSharp cũng là GNU GPL sao? gnu.org/licenses/agpl.html
Pranav Singh

Chúng tôi không khuyên bạn nên sử dụng các phiên bản trước iText (Sharp) 5 vì cả lý do kỹ thuật cũng như pháp lý. stackoverflow.com/questions/8517776/itexsharp-license
Micah Armantrout


2

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


xin chào, bạn có thể cung cấp một liên kết và cũng là một hướng dẫn về cách sử dụng nó với c # asp.net cảm ơn
user287745

static.persisted47ts.com/htmldoc_1.9.1586-setup.exe Hãy lưu ý rằng đây là chương trình dòng lệnh. Bạn phải thực thi nó từ bên trong ứng dụng của mình để làm cho nó hoạt động. Bạn có thể tìm tài liệu cho các đối số và cảnh báo của nó từ Chương 4 trên: Easysw.com/htmldoc/documentation.php
enriquein

Tôi không chắc ngày nay nó hữu ích như thế nào, nhưng nếu nó giúp bạn: dropbox.com/s/9kfn3ttoxs0fiar/htmldoc_1.9.1586-setup.exe
enriquein

Trang web không còn hoạt động.
Tom Winter

2

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.


Bạn không phải sử dụng thư viện thương mại nếu bạn cần kết xuất html hoàn hảo trong pdf
obayhan 9/2/2015

Tôi bắt đầu tin điều này. Tôi đã thử 5 trong số những thứ miễn phí và tất cả chúng đều có một thứ làm hỏng nó cho tôi. Từ nghẹt thở đến một trang vượt ra ngoài một thế giới xin chào đơn giản, đến trông thật tồi tệ - tôi nghĩ rằng tôi sẽ phải ho một số tiền cho một công cụ chuyển đổi thực sự. Các mẫu của từng sản phẩm thương mại thực sự hoạt động theo cách bạn mong muốn PDF xuất hiện dưới dạng.
Herb Meehan

@obayhan - Tôi muốn tin bạn. Có lẽ bạn có thể chia sẻ với chúng tôi một liên kết đến bất kỳ công cụ nào bạn đang tìm thấy rất tốt.
Peter Wone

@PeterWone trên đầu trang có nhiều lựa chọn thay thế nguồn mở như bạn có thể thấy dễ dàng. Yêu cầu ai đó chia sẻ những điều tương tự chỉ là đánh cắp thời gian. Nhưng nếu bạn đã thử tất cả chúng và không hài lòng, tôi hy vọng bạn sẽ chia sẻ ý kiến ​​của mình dưới chúng về những gì không làm bạn hài lòng và có lẽ nó sẽ giúp phát triển kiến ​​thức.
obayhan

@obayhan - Tại sao lặp lại những gì người khác đã làm? Chúng thuộc ba loại: không thực sự miễn phí, phụ thuộc không thể chấp nhận như wkhtmltopdf hoặc IE9 và Trình kết xuất HTML cho PDFSharp. Nhân sự cho PDF # là người duy nhất trong C # thuần túy và nó thực hiện một công việc khủng khiếp là phân trang - nó hiển thị một trang dài và cắt nó ra, thường cắt qua các dòng văn bản. Nếu tôi có thể tìm thấy thời gian để viết lại hoàn toàn trình kết xuất, HR cho PDF # sẽ chiến thắng: nó nhanh, miễn phí và không có phụ thuộc. Nhưng đó sẽ là một trình kết xuất hoàn toàn mới, tôi sợ.
Peter Wone

2

Đâ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


2

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ì đó.


1

Đây là một trình bao bọc cho wkhtmltopdf.dll bởi pruiz

một trình bao bọc cho wkhtmltopdf.exe bởi Cod Wax
- cũng trên nuget .


Bất kỳ tài liệu hoặc hướng dẫn làm thế nào để sử dụng chúng? chỉ có mã nguồn ở đó mà không có bất kỳ tài liệu nào
Burjua

1
Tải về mã và xem xét các bài kiểm tra đơn vị. Điều đó sẽ cung cấp cho bạn một số mẫu sử dụng tốt.
Garfield

Thực sự không có ích gì, thực tế tôi thậm chí không thể làm cho các thử nghiệm về giải pháp pruiz hoạt động, nó nói rằng việc làm việc đó No tests are run because no tests are loaded or the selected tests are disabledcũng không giúp được gì
Burjua

@Burjua điều này thường liên quan đến phiên bản của người chạy thử bạn đang sử dụng. Tuy nhiên, hãy thử mở một vấn đề tại trang dự án của github của tôi và tôi sẽ cố gắng giúp bạn ..
Pablo Ruiz García

Xin chào trình bao bọc này hoạt động tốt, nhưng không hiển thị biểu đồ google pie của tôi. Vì vậy, cho đến khi tôi có thể giải quyết vấn đề này, tôi sẽ phải tìm một giải pháp khác.
Andreolasaard

1

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ó thể chia sẻ mã nguồn đầy đủ của bạn? Tôi chưa quen với C # vì vậy tôi đang bị mắc kẹt ngay cả khi nhập khẩu.
Sibi John

1

Bạn cũng có thể kiểm tra Spire , nó cho phép bạn tạo HTML to PDFbằ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 #


Spire tạo một tệp PDF chỉ là một hình ảnh. Một số css thậm chí không chính xác, chẳng hạn như bỏ qua các phông chữ đậm.
Savage

Xem câu trả lời cho câu hỏi của tôi về việc tạo các tệp PDF dưới dạng hình ảnh: e-iceblue.com/forum/nuget-pdf-as-non-image-t6710.html
Savage

Spire là trang thứ 4 tôi đã thử từ trang này và tôi nghĩ nó là thứ tốt nhất, cảm ơn.
MDave

1

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 .


1
Tạo ra kết quả tốt, nhưng giống như SelectPdf, nó có thể có tác động lớn đến thời gian xây dựng và kích thước gói triển khai của bạn. Nó gần như tăng gấp đôi thời gian xây dựng Visual Studio của tôi. Tôi cũng đã có một thời gian khó khăn để đưa nó vào trang của mình - html quá nhỏ ở giữa - về mặt đó, SelectPdf đã làm tốt hơn.
Savage

1
việc điền trang với nội dung HTML phụ thuộc vào thuộc tính HtmlToPdf.BrowserWidth. Nó là 1200 pixel theo mặc định nhưng bạn có thể đặt thành 800 pixel và HTML sẽ điền rất tốt toàn bộ trang PDF. Bạn có thể tìm thấy bản demo và mã mẫu trực tiếp cho điều này tại hiqpdf.com/demo/HtmlFmitAndScalingOptions.aspx
HiQPdf

1
Không hỗ trợ .NET Core.
Taylor Hội trưởng

1

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

0

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


1
BitDefender báo cáo: "Phần mềm độc hại được phát hiện! Truy cập vào trang này đã bị chặn." Tôi không có ý kiến ​​về việc báo cáo này là thật hay là dương tính giả.
GeoffM

0

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


91
Bạn thực sự nên viết trong tất cả các câu trả lời của bạn mà bạn làm việc cho websupergoo. Từ faq: 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
jgauffin

12
Ôi! Tôi đã đề xuất ABCpdf vì đây là thành phần tôi quen thuộc. Nếu một tỷ lệ lớn các bài đăng của tôi liên quan đến PDF, thì đó chỉ là do tôi không đóng góp cho các chủ đề ngoài lĩnh vực mà tôi quan tâm. Lời xin lỗi.
AffineMesh

Trong phần bảo vệ áp phích, trang web tạo ra sản phẩm khá tốt.
Tom Winter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.