Konwertuj HTML na PDF w .NET

425

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?

Amedee Van Gasse
źródło
Możesz do tego użyć GemBox.Document . Również tutaj możesz znaleźć przykładowy kod do konwersji pliku HTML na plik PDF.
Mario Z
Z jakiej wersji iTextSharp korzystasz i czy możesz udostępnić swój plik HTML?
Amedee Van Gasse
Wciąż brak odpowiedzi na moją prośbę o dodatkowe informacje. Dodaj także, jeśli używasz HTMLWorker lub XMLWorker.
Amedee Van Gasse,
Co z rdzeniem .net?
Piero Alberto,
WRZESIEŃ 2019: Dodałem nową odpowiedź, niektóre z wymienionych opcji są bezpłatne, inne płatne, a kilka jest dostępnych jako .net core stackoverflow.com/questions/564650/...
Mauricio Gracia Gutierrez

Odpowiedzi:

198

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

  1. Pobierz pakiet nuget HtmlRenderer.PdfSharp .
  2. 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.

  1. Przede wszystkim wkhtmltopdf jest zaimplementowany w C ++, a nie w C #, i napotkasz różne problemy z osadzaniem go w kodzie C #, szczególnie podczas przełączania między 32-bitowymi i 64-bitowymi wersjami twojego projektu. Musiałem wypróbować kilka obejść, w tym warunkowe budowanie projektów itp., Aby uniknąć „wyjątków nieprawidłowego formatu” na różnych komputerach.
  2. Jeśli zarządzasz własną maszyną wirtualną, jest w porządku. Ale jeśli twój projekt działa w ograniczonym środowisku, takim jak ( Azure (w rzeczywistości jest to niemożliwe z lazurami, jak wspomniano przez autora TuesPenchin ), Elastic Beanstalk itp.) Koszmarem jest skonfigurowanie tego środowiska tylko dla wkhtmltopdf do działania.
  3. wkhtmltopdf tworzy pliki na twoim serwerze, więc musisz zarządzać uprawnieniami użytkowników i przyznać dostęp „do zapisu” do miejsca, w którym działa wkhtmltopdf.
  4. Wkhtmltopdf działa jako samodzielna aplikacja, więc nie jest zarządzany przez pulę aplikacji IIS . Musisz więc hostować ją jako usługę na innym komputerze lub doświadczysz skoków przetwarzania i zużycia pamięci na serwerze produkcyjnym.
  5. Używa plików tymczasowych do generowania pliku pdf, aw przypadkach takich jak AWS EC2, który ma naprawdę wolne dyskowe operacje we / wy, jest to duży problem z wydajnością.
  6. Najbardziej znienawidzony błąd „Nie można załadować DLL„ wkhtmltox.dll ”” zgłoszony przez wielu użytkowników.

--- PRE Edytuj sekcję ---

Dla każdego, kto chce generować pdf z HTML w prostszych aplikacjach / środowiskach, pozostawiam mój stary post jako sugestię.

TuesPechkin

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)

Rotativa

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.

Anestis Kivranoglou
źródło
2
Dziękujemy za aktualizację swojego posta. Spróbuję PdfSharp. Zaoszczędziłeś mi dużo czasu.
John Henckel,
1
PdfSharp jest dobry pod względem wydajności, ale nie renderował poprawnie pływaków dla mnie. Na szczęście mogłem zmienić znaczniki, aby używać starych dobrych tabel, PdfSharp radzi sobie z nimi dobrze.
Gebb,
3
Wypróbowaliśmy HtmlRenderer. To było naprawdę szybkie, gdy nie ładowałem żadnego CSS. Ale kiedy próbowaliśmy zastosować CSS (Bootstrap plus trochę na zamówienie), parsowanie CSS zajęło trochę czasu (co prawdopodobnie moglibyśmy złagodzić), a renderowanie było zupełnie inne niż na stronie internetowej.
OutstandingBill,
1
@ user2347528 - patrząc na źródło HtmlRenderer.PdfSharp, nie ma sposobu, aby to naprawić - po prostu bierze całkowitą wysokość strony i klipy na każdej stronie PDF, co jest naprawdę niefortunne - oznacza to, że wielostronicowe pliki PDF z tą biblioteką naprawdę mogą ' skończone.
Pan Bungle
3
BS. Spowoduje to utworzenie obrazu HTML i dodanie obrazu do pliku pdf. To wcale nie jest prawdziwy PDF. Ponadto PDF jest formatem grafiki wektorowej - możesz przewijać go w nieskończoność - oczywiście, chyba że PDF składa się z grafiki rastrowej, którą tworzy ta biblioteka.
Stefan Steiger,
191

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.

Marko
źródło
17
obsługuje .NET?
Kiquenet,
6
jest to samodzielny plik wykonywalny. Możesz uruchomić go jako proces, przekazując adres URL dokumentu HTML jako argument.
Marek
46
@bamccaig Już to mam =) github.com/gmanny/Pechkin Udostępnia każdą użyteczną funkcję biblioteki, a także ma opakowanie do użycia w wielu wątkach. I to jest na NuGet.
Gman
7
Aby użyć tego w C # stackoverflow.com/questions/4651373/...
Daniel Little
7
@ AdamMoszczyński: Z Wikipedii : LGPL pozwala programistom i firmom używać i integrować oprogramowanie LGPL z własnym (nawet zastrzeżonym) oprogramowaniem bez konieczności (zgodnie z zasadami silnego copyleft) wydania kodu źródłowego własnych części oprogramowania.
Oliver,
34

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:

  • Bardzo dobra zgodność HTML (np. Było to jedyne narzędzie w moim przykładzie, które poprawnie powtarzało nagłówki tabeli, gdy tabela obejmowała wiele stron)
  • Płynne API
  • Darmowe i OpenSource ( licencja Creative Commons Uznanie autorstwa 3.0 )
  • Dostępne za pośrednictwem NuGet

Inne przetestowane narzędzia:

Markus
źródło
+1 za to, przetestowałem HtmlRenderer dla PdfSharp, ale napotkałem zbyt wiele problemów z podziałem stron. Mogę żyć z zależnością od wkHtmlToPdf w tym projekcie, więc to rozwiązanie było świetne - pięknie renderuje HTML.
jmdon,
Wyglądał pięknie, ale wow zajęło to dużo czasu. 30 sekund, z motywem bootstrap i tak dalej, dość prosta strona, ale mimo to.
Nicholas Petersen
Stephanie z IronPDF tutaj. Oto przykładowy kod używający IronPDF do konwersji HTML na PDF w C #. Więcej można znaleźć w naszym samouczku HTML-pdf na naszej stronie internetowej. 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,
Użyłem iText pdfHtml, ale nie obsługuje background-color. OpenHtmlToPdf działa idealnie za darmo.
Hp93,
Zgadzam się z wyższością OpenHtmlToPdf. Obsługuje także łączenie .exe i .dll z ILMerge.
saygley,
30

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)

Jeśli żadna z powyższych opcji nie pomoże, zawsze możesz przeszukać pakiety NuGet https://www.nuget.org/packages?q=html+pdf

Mauricio Gracia Gutierrez
źródło
1
czy testowałeś jakieś pod kątem wydajności? staramy się poprawić obecne czasy konwersji i badamy inne biblioteki pod kątem tych korzyści w zakresie wydajności
od
Nie zrobiłem żadnego porównania wydajności, szczególnie dlatego, że jest tak długa lista - być może ktoś już zrobił „przegląd wydajności generowania plików PDF bibliotek .net” lub podobny
Mauricio Gracia Gutierrez
28

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.

Jason
źródło
35
nie jest to przydatne, ponieważ musisz kupić bibliotekę
d1jhoni1b
47
d1jhoni1b, jak to sprawia, że ​​nie jest użyteczny? Jeśli jest to narzędzie płatne, można powiedzieć, że jest drogie, ale nie tylko bezużyteczne na podstawie tych kryteriów.
Don Rolling
3
To prawda, że ​​EO.Pdf nie używa IE. Ale wydaje się, że odradza się 32-bitowe instancje przeglądarki internetowej w tle. Sprawdź listę procesów, a zobaczysz je jako instancje rundll32.exe wskazujące na dll EO.PDF. Moim zdaniem nadal jest to nieco zuchwałe.
Matt
1
Nie obsługuje media = „print”, co jest naprawdę bolesne.
Marat Faskhiev
15
Licencja dla jednego dewelopera za 650 USD. To jest kosztowne.
Abhijeet Nagre
25

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

Kim Tranjan
źródło
3
Wygląda naprawdę całkiem przydatnie. Warto zauważyć, że na dzień dzisiejszy (05/10/15) jest to najczęściej pobierane opakowanie .Net dla wkhtmtopdf (jako pakiet Nuget).
ken2k,
3
Próbowałem, niestety nie udało mi się sprawić, by działał na stronach internetowych lazur.
gabriel14,
Ta biblioteka działa dobrze, gdy uruchamiam ją lokalnie na moim komputerze, ale na serwerze hostingowym losowo pojawia się następujący błąd. Pdf jest czasami generowany, ale czasami generuje następujący błąd. „Błąd. Wystąpił błąd podczas przetwarzania żądania. Nie można wygenerować pliku PDF: (kod wyjścia: 1)”
user2347528,
wkhtmtopdf zależy od GDI + lub x-server, jeśli używasz Mono / Linux. Nie jest to więc przydatne w środowiskach serwerowych ...
nuzzolilo,
Jest dobry i działa zgodnie z oczekiwaniami, ale problem z jakością jest trochę widoczny w moim pdf, czy możemy to poprawić?
Bharat
13

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.

Stewart
źródło
4
Pamiętaj, że kiedy ostatnio sprawdziliśmy, Winnovative był niezgodny z IE9 (ponieważ korzystali z silnika renderowania IE GDI, który został usunięty w IE9). Więc jeśli masz zainstalowany IE9 na komputerze, którego używasz, konwersja nie zadziała. Być może naprawili to, zanim to przeczytałeś, ale wiele komercyjnych komponentów używało silnika renderującego IE i przestało działać z IE9, więc warto to sprawdzić.
fubaar
Winnovative był najłatwiejszy do skonfigurowania i po prostu działał od razu po wyjęciu z pudełka. Ale: 1. NIE działa na witrynach Azure, tylko CloudApp. 2. jest wolny, zajmuje 8 sekund, aby wygenerować prosty plik PDF na maszynie wirtualnej Azure D1
jsgoupil
Potwierdzać. To jest naprawdę wolne. Porównałem z wkhtmltopdf.
Marat Faskhiev
Biblioteka Winnovative jest bardzo kosztowna. Około 650 USD za licencję programisty i 1200 USD za inną licencję.
Abhijeet Nagre,
Winnovative HTML to PDF Converter działa w witrynach platformy Azure i nie zależy od IE, jak sugerowano w komentarzu. Sprawdź rozwiązanie Winnovative HTML to PDF dla platformy Azure na stronie internetowej: winnovative-software.com/html-to-pdf-converter-azure.aspx . Aby poprawić czas konwersji, ustaw HtmlToPdf.ConversionDelay = 0. Konwerter używa domyślnego opóźnienia do obsługi stron HTML, które aktualizują swoją zawartość po załadowaniu strony.
EvoPdf,
9

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.

Davis Jebaraj
źródło
8

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 .

Stewart
źródło
Samouczek wykorzystuje komponent ze strony internetowej, który już nie istnieje.
Tom Winter
7

Użyłem ExpertPDF Html To Pdf Converter . Wykonuje przyzwoitą pracę. Niestety nie jest za darmo.

charpdevel0p3r
źródło
czy ExpertPDf ma opcję znakowania dokumentów wodą?
user1799214,
@ user1799214 - Tak, ExpertPDF obsługuje znaki wodne. Zobacz tutaj przykładowy kod. Z powodzeniem użyłem go ze znakami wodnymi na jednej z moich stron internetowych.
Theophilus
Działa całkiem dobrze, ale nie odpowiadają na pytania pomocnicze.
Michael Freidgeim,
7

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.

Paweł
źródło
7

Aktualizacja 2018 roku i użyjmy standardowego HTML + CSS = równanie PDF!

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 .

Peter Krauss
źródło
1
Rozwiązania połączone przez print-css.rocks kosztują 2 950,00 USD za PDFreactor, 3800 USD za Prince i 5 000,00 USD za Antenna House Formatter V7. Wydaje się, że Weasyprint jest dla Pythona.
MDave
6

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();
    }
Leonard AB
źródło
Hej, to naprawdę fajne dla posiadanego serwera i vps. Dzięki za udostępnienie.
mjb
Aby umożliwić ASP.NET w IIS uruchamianie zewnętrznego programu z uprawnieniami do zapisu, pula aplikacji> zaawansowane ustawienia> tożsamość> ustawiona na „LocalSystem”
mjb
4

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.

Christophe Trevisani Chavey
źródło
10
Używamy tego od kilku lat i stwierdziliśmy, że jest to dość bolesne w użyciu. Słaba obsługa, bardzo wybredna ze względu na opakowanie wokół silnika renderującego IE, słabą jakość obrazu i kompresję, ograniczona możliwość dostosowania żądania do obsługi bardziej zaawansowanych scenariuszy użycia (takich jak dostarczanie plików cookie i nagłówków żądań). Przypuszczam, że to, jak działa, zależy od tego, czego potrzebujesz.
moribvndvs
3
+1 dla ABCPdf. Poprzedni komentator nie mógł rozmawiać z tymi samymi osobami wspierającymi, co ja - zawsze odpisywali mi od razu i zawsze mieli rozwiązanie wszelkich problemów. Obsługują teraz używanie Gecko jako mechanizmu renderowania zamiast IE. Możesz wybrać ten, który chcesz w czasie wykonywania. ABC pozwala robić dosłownie wszystko, co pozwala PDF.
Steve
12
zbyt drogie i słabe wsparcie. W ogóle nie polecam abcPDF.
Vivek,
Używam go również przez ostatnie 6 lat i, szczerze mówiąc, dobrze nam to służyło.
toepoke.co.uk
Czy to nie jest kolejna powtórka stackoverflow.com/a/2182212/471213 ? To znaczy, inny facet związany z programem przynajmniej dostarczył kilka wierszy przykładowego kodu
usr-local-ΕΨΗΕΛΩΝ
4

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.

http://www.rotativahq.com/

Darmowe konta dostępne.

Giorgio Bozio
źródło
Czy to zależy od Itextsharp, a więc musisz mieć licencję na używanie itextsharp?
Micheasz Armantrout
2
@MicahArmantrout Nie, nie ma. Używa wkhtmltopdf.exe do utworzenia pliku PDF. Nie wymaga licencji.
Giorgio Bozio
@MicahArmantrout, czy iTextSharp nie jest także GNU GPL? gnu.org/licenses/agpl.html
Pranav Singh
Nie zalecamy używania wersji wcześniejszych niż iText (Sharp) 5 zarówno ze względów technicznych, jak i prawnych. stackoverflow.com/questions/8517776/itexsharp-license
Micah Armantrout
4

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();
}
Siergiej Malyutin
źródło
Pamiętaj, że iTextSharp współpracuje z XHtml i jest dość wrażliwy na jakość twojego HTML. Mogłoby się zepsuć, czego nie zrobiłyby SelectPdf i HiqPdf.
Savage
3

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.

Rune Grimstad
źródło
3

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.

Mikrofon
źródło
2

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

enriquein
źródło
cześć, czy możesz podać link, a także przewodnik, jak go używać z podziękowaniami dla c # asp.net
user287745
static.persistedthoughts.com/htmldoc_1.9.1586-setup.exe Należy pamiętać, że jest to program wiersza polecenia. Musisz uruchomić go z poziomu aplikacji, aby działał. Dokumentację dotyczącą jej argumentów i zastrzeżeń można znaleźć w rozdziale 4 na stronie: easysw.com/htmldoc/documentation.php
enriquein
Nie jestem pewien, jak przydatne byłoby to w dzisiejszych czasach, ale jeśli to pomoże: dropbox.com/s/9kfn3ttoxs0fiar/htmldoc_1.9.1586-setup.exe
enriquein
Witryna nie działa już.
Tom Winter
2

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.

charpdevel0p3r
źródło
Nie musisz używać biblioteki komercyjnej, jeśli potrzebujesz doskonałego renderowania HTML w pdf
obayhan
Zaczynam w to wierzyć. Wypróbowałem 5 darmowych gier i wszystkie mają jedną rzecz, która mnie rujnuje. Od zadławienia do strony, która wykracza poza zwykły świat cześć, po okropne wyglądanie - myślę, że będę musiał wykasować trochę pieniędzy na prawdziwy konwerter. Próbki każdego z produktów komercyjnych działają tak, jak można się spodziewać po wyjściu z pliku PDF.
Herb Meehan,
@obayhan - Chciałbym ci wierzyć. Być może możesz udostępnić nam link do narzędzi, które uważasz za tak dobre.
Peter Wone
@PeterWone na górze znajduje się wiele alternatywnych programów typu open source, jak łatwo zobaczyć. Proszenie kogoś o podzielenie się tymi samymi rzeczami to tylko kradzież czasu. Ale jeśli wypróbowałeś je wszystkie i jesteś niezadowolony, mam nadzieję, że podzielisz się z nimi swoimi komentarzami na temat tego, co Cię nie satysfakcjonuje, a być może pomogłoby to zwiększyć wiedzę.
obayhan
@obayhan - Po co powtarzać to, co już zrobili inni? Można je podzielić na trzy kategorie: niezupełnie bezpłatne, niedopuszczalne zależności, takie jak wkhtmltopdf lub IE9, oraz moduł renderujący HTML dla PDFSharp. HR dla PDF # jest jedynym w czystym języku C # i wykonuje straszną pracę paginacji - renderuje jedną długą stronę i tnie ją, często przecinając linie tekstu. Jeśli znajdę czas na całkowite przepisanie renderera, HR for PDF # przyniesie ogromne korzyści: jest szybki, darmowy i nie ma żadnych zależności. Obawiam się, że byłby to jednak zupełnie nowy renderer.
Peter Wone,
2

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
Abhishek Sengupta
źródło
2

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.

Shahin Dohan
źródło
1

Oto opakowanie dla wkhtmltopdf.dll firmy pruiz

I opakowanie dla wkhtmltopdf.exe firmy Codaxy
- również w nuget .

Garfield
źródło
Jakieś dokumenty lub samouczki, jak z nich korzystać? jest tam tylko kod źródłowy bez jakiejkolwiek dokumentacji
Burjua
1
Pobierz kod i spójrz na testy jednostkowe. To powinno dać ci dobre przykłady użycia.
Garfield,
Naprawdę nie pomaga, w rzeczywistości nie mogę nawet przetestować rozwiązania pruiz do działania, mówi też, że No tests are run because no tests are loaded or the selected tests are disabledgoogling nie pomaga
Burjua 1'12
@ Burjua jest to zwykle związane z wersją testera, którego używasz. Spróbuj jednak otworzyć problem na stronie mojego projektu github, a postaram się ci pomóc ...
Pablo Ruiz García,
Cześć, to opakowanie działa dobrze, ale nie wyświetla moich wykresów kołowych Google. Więc dopóki nie będę mógł rozwiązać tego problemu, będę musiał znaleźć inne rozwiązanie.
Andre Lombaard
1

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;
}
Shan Khan
źródło
Czy możesz udostępnić pełny kod źródłowy? Jestem nowy w C #, więc utknąłem nawet w imporcie.
Sibi John
1

Możesz także sprawdzić Spire , dzięki czemu możesz tworzyć za HTML to PDFpomocą 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 #

Satinder singh
źródło
Spire generuje plik PDF, który jest tylko obrazem. Niektóre css nie są nawet poprawne, na przykład ignorowanie pogrubionych czcionek.
Savage
Zobacz odpowiedź na moje pytanie dotyczące generowania plików PDF jako obrazu: e-iceblue.com/forum/nuget-pdf-as-non-image-t6710.html
Savage
Iglica to czwarta, którą wypróbowałem na tej stronie i myślę, że jest najlepsza, dzięki.
MDave
1

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 .

HiQPdf
źródło
1
Daje przyzwoite wyniki, ale podobnie jak SelectPdf, może mieć duży wpływ na czas kompilacji i rozmiar pakietu. To prawie podwoiło czas kompilacji Visual Studio. Miałem też trudności z wypełnieniem mojej strony - HTML był za mały w środku - pod tym względem SelectPdf spisał się lepiej.
Savage
1
wypełnienie strony treścią HTML zależy od właściwości HtmlToPdf.BrowserWidth. Domyślnie jest to 1200 pikseli, ale można ustawić go na 800 pikseli, a HTML powinien bardzo dobrze wypełniać całą stronę PDF. Prezentację na żywo i przykładowy kod można znaleźć na stronie hiqpdf.com/demo/HtmlFittingAndScalingOptions.aspx
HiQPdf
1
Brak obsługi .NET Core.
Taylor Buchanan
1

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
Alex Nolasco
źródło
0

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

Konstantyn
źródło
1
BitDefender zgłasza: „Wykryto złośliwe oprogramowanie! Dostęp do tej strony został zablokowany.” Nie mam zdania, czy to sprawozdanie jest prawdziwe, czy fałszywie pozytywne.
GeoffM,
0

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.

AffineMesh
źródło
91
Naprawdę powinieneś napisać we wszystkich swoich odpowiedziach, że pracujesz dla websupergoo. Z 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
zadawanych pytań
12
Auć! Zasugerowałem ABCpdf, ponieważ jest to element, który znam. Jeśli duży procent moich postów dotyczy plików PDF, to tylko dlatego, że powstrzymuję się od udziału w tematach poza moimi obszarami zainteresowań. Przeprosiny.
AffineMesh,
W obronie plakatów strona internetowa sprawia, że ​​produkt jest całkiem niezły.
Tom Winter