Programing

.NET에서 HTML을 PDF로 변환

lottogame 2020. 2. 22. 11:18
반응형

.NET에서 HTML을 PDF로 변환


HTML 내용을 함수에 전달하여 PDF를 생성하고 싶습니다. 나는 이것을 위해 iTextSharp를 사용했지만 테이블을 만났을 때 잘 수행되지 않고 레이아웃이 지저분 해집니다.

더 좋은 방법이 있습니까?


업데이트 : 이제 wkhtmltopdf 보다 PupeteerSharp를 권장 합니다.

wkhtmtopdf를 사용해보십시오 . 내가 지금까지 찾은 최고의 도구입니다.

.NET의 경우이 작은 라이브러리사용 하여 wkhtmtopdf 명령 행 유틸리티를 쉽게 호출 할 수 있습니다.


편집 : PdfSharp를 사용하여 PDF에 대한 새로운 제안 HTML 렌더러

(wkhtmltopdf를 시도한 후 피하도록 제안한 후)

HtmlRenderer.PdfSharp는 100 % 완전 C # 관리 코드 이며, 사용 하기 쉽고 , 스레드 안전하고 가장 중요한 무료 ( New BSD License ) 솔루션입니다.

용법

  1. HtmlRenderer.PdfSharp nuget 패키지를 다운로드 하십시오 .
  2. 예제 방법을 사용하십시오.

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

아주 좋은 대안iTextSharp무료 버전 입니다

버전 4.1.6까지 iTextSharp는 LGPL 라이센스에 따라 라이센스가 부여되었으며 4.16까지 (또는 포크가있을 때까지) 버전이 패키지로 제공되어 자유롭게 사용할 수 있습니다. 물론 누군가 계속 5+ 유료 버전을 사용할 수 있습니다 .

프로젝트에 wkhtmltopdf 솔루션 을 통합하려고 시도했지만 많은 장애물이있었습니다.

개인적 으로 Hosted Enterprise 응용 프로그램에서 wkhtmltopdf 기반 솔루션을 사용하지 않는 이유는 다음과 같습니다.

  1. 우선 wkhtmltopdf는 C #이 아닌 C ++로 구현되어 있으며, 특히 프로젝트의 32 비트와 64 비트 빌드 사이를 전환하는 동안 C # 코드에 포함시키는 데 여러 가지 문제가 발생합니다. 다른 컴퓨터에서 "잘못된 형식 예외"를 피하기 위해 조건부 프로젝트 빌드 등을 포함한 여러 가지 해결 방법을 시도했습니다.
  2. 자신의 가상 머신을 관리한다면 괜찮습니다. 그러나 프로젝트가 ( Azure (실제로 TuesPenchin 작성자가 언급 한 바와 같이 azure를 사용할 수 없음 ), Elastic Beanstalk 등) 와 같은 제한된 환경에서 실행되는 경우 wkhtmltopdf가 작동하도록 환경을 구성하는 것은 악몽입니다.
  3. wkhtmltopdf는 서버 내에서 파일을 생성하므로 사용자 권한을 관리하고 wkhtmltopdf가 실행중인 위치에 "쓰기"액세스 권한을 부여해야합니다.
  4. Wkhtmltopdf는 독립형 애플리케이션으로 실행되므로 IIS 애플리케이션 풀에서 관리하지 않습니다 . 따라서 다른 머신에서 서비스로 호스팅하거나 프로덕션 서버 내에서 스파이크 및 메모리 소비를 처리해야합니다.
  5. 임시 파일을 사용하여 pdf를 생성하며 실제로 디스크 i / o가 느린 AWS EC2 와 같은 경우 에는 큰 성능 문제입니다.
  6. 대부분의 사용자가보고 한 "DLL 'wkhtmltox.dll'을 (를)로드 할 수 없습니다"오류가 가장 싫습니다.

--- PRE 편집 섹션 ---

더 간단한 응용 프로그램 / 환경에서 html에서 pdf를 생성하려는 사람은 이전 게시물을 제안으로 남겨 둡니다.

페 치킨

https://www.nuget.org/packages/TuesPechkin/

또는 특히 MVC 웹 응용 프로그램의 경우 (그러나 .net 응용 프로그램에서 사용할 수 있다고 생각합니다)

로타 티바

https://www.nuget.org/packages/Rotativa/

둘 다 wkhtmtopdf 바이너리를 사용하여 html을 pdf로 변환합니다. 이것은 웹킷 엔진을 사용하여 페이지를 렌더링하여 CSS 스타일 시트를 구문 분석 할 수도 있습니다 .

C #과의 완벽한 통합을 제공합니다.

Rotativa는 모든 Razor View 에서 직접 PDF를 생성 할 수도 있습니다 .

또한 실제 웹 응용 프로그램의 경우 스레드 안전 등을 관리합니다.


대부분의 HTML-PDF 변환기는 HTML 구문 분석 및 렌더링을 수행하기 위해 IE를 사용합니다. 사용자가 IE를 업데이트하면 중단 될 수 있습니다. 다음 은 IE에 의존하지 않는 것입니다.

코드는 다음과 같습니다.

EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);

다른 많은 변환기와 마찬가지로 텍스트, 파일 이름 또는 URL을 전달할 수 있습니다. 결과는 파일 또는 스트림에 저장 될 수 있습니다.


최근에 HTML에서 PDF 로의 변환에 관한 PoC를 수행했으며 결과를 공유하고 싶었습니다.

내가 가장 좋아하는 것은 OpenHtmlToPdf입니다.

이 도구의 장점 :

  • 매우 우수한 HTML 호환성 (예 : 테이블이 여러 페이지에 걸쳐있을 때 테이블 헤더를 올바르게 반복 한 예제에서 유일한 도구였습니다)
  • 유창한 API
  • 무료 및 오픈 소스 ( Creative Commons Attribution 3.0 라이센스 )
  • NuGet을 통해 사용 가능

테스트 된 다른 도구 :


나는 NReco 를 진지하게 추천 합니다. 무료 및 유료 버전이 있으며 실제로 가치가 있습니다. 백그라운드에서 wkhtmtopdf를 사용하지만 어셈블리가 하나만 있으면됩니다. 환상적인.

사용 예 :

NuGet을 통해 설치하십시오 .

var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);

면책 조항 : 나는 개발자가 아니며 프로젝트의 팬 일뿐입니다 :)


Winnovative 는 HTML 입력을 지원하는 .Net PDF 라이브러리를 제공합니다. 그들은 무제한 무료 평가판을 제공합니다 . 프로젝트 배포 방법에 따라 이것으로 충분할 수 있습니다.


필수 PDF 를 사용하여 HTML을 PDF로 변환 할 수 있습니다 : C # 샘플 . 여기에 링크 된 샘플은 ASP.NET 기반이지만 Windows Forms, WPF, ASP.NET Webforms 및 ASP.NET MVC에서 라이브러리를 사용할 수 있습니다. 라이브러리는 Internet Explorer (기본값) 및 WebKit (최상의 출력)과 같은 다른 HTML 렌더링 엔진을 사용하는 옵션을 제공합니다.

자격이있는 경우 커뮤니티 라이센스 프로그램을 통해 전체 제어 제품군을 무료로 사용할 수 있습니다 (상업용 응용 프로그램도) . 커뮤니티 라이센스는 제한이나 워터 마크가없는 정식 제품입니다.

참고 : Syncfusion에서 일합니다.


ExpertPDF Html To Pdf Converter를 사용했습니다 . 괜찮은 일을한다. 불행히도, 그것은 무료가 아닙니다.


새로운 웹 기반 문서 생성 앱인 DocRaptor.com도 있습니다. 사용하기 쉽고 무료 옵션이 있습니다.


진정한 .Net PDF 라이브러리가 실제로 필요하지 않은 경우 수많은 무료 HTML-PDF 도구 가 있으며,이 중 다수 는 명령 줄에서 실행할 수 있습니다.

한 가지 해결책은 그중 하나를 선택한 다음 C #으로 그 주위에 얇은 래퍼를 작성하는 것입니다. 예를 들어이 자습서 에서 수행 한대로 .


2018 년 업데이트 및 표준 HTML + CSS = PDF 방정식을 사용합시다!

HTML에서 PDF 로의 요구에 대한 좋은 소식이 있습니다. 으로 이 대답했다 , W3C의 표준 CSS - 휴식 - 3 문제를 해결할 것입니다 ... 그것은 시험 후, 2017 또는 2018에 최종 권고로 전환 할 계획이있는 후보 추천입니다.

표준이 아니기 때문에 print-css.rocks에서 알 수 있듯이 C # 용 플러그인이있는 솔루션이 있습니다 .


ABCpdf.NET (http://www.websupergoo.com/abcpdf-5.htm)

우리는 사용하고 추천합니다.

매우 좋은 구성 요소로 웹 페이지를 이미지처럼 PDF로 변환 할뿐만 아니라 실제로 텍스트, 이미지, 서식 등을 변환합니다.

무료는 아니지만 싸다.


다음은 iTextSharp (iTextSharp + itextsharp.xmlworker)를 사용하여 html + css를 PDF로 변환하는 예입니다.

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

다른 요구 사항에 따라 다릅니다.

실제로 간단하지만 쉽게 배포 할 수없는 솔루션은 WebBrowser 컨트롤을 사용하여 HTML을로드 한 다음 Print 메서드 인쇄를 사용하여 로컬로 설치된 PDF 프린터에 인쇄하는 것입니다. 사용 가능한 무료 PDF 프린터가 여러 개 있으며 WebBrowser 컨트롤은 .Net 프레임 워크의 일부입니다.

편집 : HTML이 XHtml 인 경우 PDFizer사용 하여 작업을 수행 할 수 있습니다 .


PDF 비전 이 좋습니다. 그러나 사용하려면 완전 신뢰가 있어야합니다. 나는 이미 이메일을 보냈고 서버에서 HTML이 변환되지 않는 이유를 물었지만 localhost에서 제대로 작동했습니다.


html을 pdf로 변환하는 데 다음 라이브러리가 더 효과적이라는 것을 알았습니다.
너겟 : https://www.nuget.org/packages/Select.HtmlToPdf/


최종 업데이트 : 2019 년 9 월

이것은 내가 결합 한 .NET에서 HTML을 PDF로 변환하는 옵션 목록입니다 (일부 무료)

위의 옵션 중 어느 것도 도움이되지 않으면 항상 NuGet 패키지를 검색 할 수 있습니다 https://www.nuget.org/packages?q=html+pdf


나는 또한 이것을 다시 찾고 있었다. HTMLDOC http://www.easysw.com/htmldoc/에 접속 하여 HTML 파일을 인수로 사용하여 PDF를 추출하는 무료 오픈 소스 명령 줄 앱입니다. 그것은 내 측면 프로젝트에서 나를 위해 잘 작동했지만 실제로는 실제로 필요한 것에 달려 있습니다.

컴파일 된 바이너리를 판매하는 회사이지만 소스에서 무료로 다운로드하여 컴파일하여 무료로 사용할 수 있습니다. 나는 최신 개정판 (버전 1.9 용)을 컴파일 할 수 있었고 며칠 안에 바이너리 설치 프로그램을 릴리스 할 계획이므로 관심이 있다면 게시하자마자 링크를 제공 할 수 있습니다.

편집 (2014 년 2 월 25 일) : 문서 및 사이트가 http://www.msweet.org/projects.php?Z1 로 이동 한 것처럼 보입니다 .


PDF로 완벽한 HTML 렌더링이 필요한 경우 상용 라이브러리를 사용해야합니다.

PDF 변환기로 ExpertPdf HTML 은 사용하기 매우 쉽고 최신 html5 / css3를 지원합니다. 전체 URL을 pdf로 변환 할 수 있습니다.

using ExpertPdf.HtmlToPdf; 
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromUrl(url);

또는 html 문자열 :

using ExpertPdf.HtmlToPdf; 
byte[] pdfBytes = new PdfConverter().GetPdfBytesFromHtmlString(html, baseUrl);

또한 생성 된 pdf 문서를 디스크의 파일 스트림에 직접 저장할 수도 있습니다.


저는 Rotativa 패키지의 저자입니다. 면도기보기에서 직접 PDF 파일을 작성할 수 있습니다.

https://www.nuget.org/packages/Rotativa/

Model 및 ViewBag 컨테이너의 데이터와 함께 면도기 뷰를 사용할 수 있으므로 사용이 간단하고 레이아웃을 완전히 제어 할 수 있습니다.

Azure에서 SaaS 버전을 개발했습니다. WebApi 또는 .Net이 실행되는 모든 .Net 앱, 서비스, Azure 웹 사이트, Azure 웹 작업에서 훨씬 쉽게 사용할 수 있습니다.

http://www.rotativahq.com/

사용 가능한 무료 계정.


다음은 pruiz의 wkhtmltopdf.dll 래퍼 입니다.

그리고 래퍼 Codaxy에 의해 wkhtmltopdf.exe을위한
- 또한 nuget에 .


내가 찾은 자바 스크립트 및 스타일 렌더링 뷰 또는 html 페이지의 PDF 생성에 사용되는 최고의 도구는 phantomJS 입니다.

예제 폴더의 exe 루트에있는 rasterize.js 함수를 사용하여 .exe 파일을 다운로드하고 솔루션에 넣습니다.

그것은 심지어 파일을 열지 않고도 코드로 파일을 다운로드 할 수있게 해줍니다. 또한 스타일과 특별히 jquery가 적용될 때 파일을 다운로드 할 수도 있습니다.

다음 코드는 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;
}

HiQPdf 소프트웨어의 대표자로서 최고의 솔루션은 .NET 용 HiQPdf HTML to PDF 변환기 라고 생각합니다 . 그것은 시장에서 가장 진보 된 HTML5, CSS3, SVG 및 JavaScript 렌더링 엔진을 포함합니다. 또한 최대 3 개의 PDF 페이지를 무료로 생성하는 데 사용할 수 있는 HTML to PDF 라이브러리무료 버전있습니다. HTML 페이지에서 PDF를 바이트 []로 생성하는 최소 C # 코드는 다음과 같습니다.

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

HiQPdf HTML-PDF 변환기 예제 저장소 에서 ASP.NET 및 MVC에 대한 자세한 예제를 찾을 수 있습니다 .


이것은 무료 라이브러리 이며 매우 쉽게 작동합니다 : 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

추가 dll을 사용하지 않고 ASP.NET 응용 프로그램 에서 HTML을 PDF 로 변환 하려면PDF Duo .Net 변환 구성 요소를 사용해보십시오 .

HTML 문자열이나 파일을 전달하거나 PDF를 생성하기 위해 스트리밍 할 수 있습니다. 아래 코드를 사용하십시오 (예 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";   
}   

http://www.duodimension.com/html_pdf_asp.net/component_html_pdf.aspx 에서 찾을 수있는 정보 + C # / VB 예제


좋아,이 기술을 사용하여 ....

에서 SRC를 다운로드 할 수 있습니다 여기 가 필요한 NANT를


HTML을 PDF로 직접 구문 분석하는 대신 HTML 페이지의 비트 맵을 만든 다음 iTextSharp 와 같은 비트 맵을 PDF에 삽입 할 수 있습니다 .

다음은 URL의 비트 맵을 얻는 방법입니다. 소스를 찾으면 링크 할 것입니다.

public System.Drawing.Bitmap HTMLToImage(String strHTML)
{
    System.Drawing.Bitmap myBitmap = null;

    System.Threading.Thread myThread = new System.Threading.Thread(delegate()
    {
        // create a hidden web browser, which will navigate to the page
        System.Windows.Forms.WebBrowser myWebBrowser = new System.Windows.Forms.WebBrowser();
        // we don't want scrollbars on our image
        myWebBrowser.ScrollBarsEnabled = false;
        // don't let any errors shine through
        myWebBrowser.ScriptErrorsSuppressed = true;
        // let's load up that page!    
        myWebBrowser.Navigate("about:blank");

        // wait until the page is fully loaded
        while (myWebBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
            System.Windows.Forms.Application.DoEvents();

        myWebBrowser.Document.Body.InnerHtml = strHTML;

        // set the size of our web browser to be the same size as the page
        int intScrollPadding = 20;
        int intDocumentWidth = myWebBrowser.Document.Body.ScrollRectangle.Width + intScrollPadding;
        int intDocumentHeight = myWebBrowser.Document.Body.ScrollRectangle.Height + intScrollPadding;
        myWebBrowser.Width = intDocumentWidth;
        myWebBrowser.Height = intDocumentHeight;
        // a bitmap that we will draw to
        myBitmap = new System.Drawing.Bitmap(intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding);
        // draw the web browser to the bitmap
        myWebBrowser.DrawToBitmap(myBitmap, new System.Drawing.Rectangle(0, 0, intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding));
    });
    myThread.SetApartmentState(System.Threading.ApartmentState.STA);
    myThread.Start();
    myThread.Join();

    return myBitmap;
}

으로 PDF의에 Winnovative HTML 변환기를 사용하면 한 줄에 HTML 문자열을 변환 할 수 있습니다

byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl);

기본 URL은 HTML 문자열에서 상대 URL이 참조하는 이미지를 해결하는 데 사용됩니다. 또는 HTML에서 전체 URL을 사용하거나 이미지 태그에 src = "data : image / png"를 사용하여 이미지를 포함 할 수 있습니다.

Winnovative 변환기에 대한 'fubaar'사용자 의견에 대한 답변으로 수정이 필요합니다. 변환기는 IE를 렌더링 엔진으로 사용하지 않습니다. 실제로 설치된 소프트웨어에 의존하지 않으며 렌더링은 WebKit 엔진과 호환됩니다.


사용자가 브라우저에서 렌더링 된 PDF 페이지를 다운로드하도록하려면 문제에 대한 가장 쉬운 해결책은 다음과 같습니다.

window.print(); 

클라이언트 쪽에서는 현재 페이지의 PDF를 저장하라는 메시지가 표시됩니다. 스타일을 연결하여 PDF 모양을 사용자 정의 할 수도 있습니다.

<link rel="stylesheet" type="text/css" href="print.css" media="print">

print.css는 인쇄하는 동안 HTML에 적용됩니다.

한정

파일을 서버 측에 저장할 수 없습니다. 페이지를 수동으로 저장하는 것보다 페이지를 인쇄하라는 메시지가 표시됩니다. 페이지는 탭으로 렌더링되어야합니다.


PDFmyURL은 최근 웹 페이지 / HTML에서 PDF 로의 변환을위한 .NET 구성 요소를 출시했습니다. 여기에는 매우 사용자 친화적 인 인터페이스가 있습니다.

PDFmyURL pdf = new PDFmyURL("yourlicensekey");
pdf.ConvertURL("http://www.example.com", Application.StartupPath + @"\example.pdf");

설명서 : PDFmyURL .NET 구성 요소 설명서

면책 조항 : PDFmyURL을 소유 한 회사에서 일합니다.

참고 URL : https://stackoverflow.com/questions/564650/convert-html-to-pdf-in-net



반응형