Как преобразовать файл HTML в PDF, используя WkHTMLToSharp / wkhtmltopdf с изображениями в C # - PullRequest
0 голосов
/ 17 июля 2011

Я генерирую HTML-файлы на лету, и я хотел бы создать PDF-файл из окончательного файла.Я использую следующее для генерации файла HTML:

    public static void WriteHTML(string cFile, List<Movie> mList)
    {
        int lineID = 0;
        string strHeader, strMovie, strGenre, tmpGenre = null;

        string strPDF = null;

        // initiates streamwriter for catalog output file
        FileStream fs = new FileStream(cFile, FileMode.Create);
        StreamWriter catalog = new StreamWriter(fs);

        strHeader = "<style type=\"text/css\">\r\n" + "<!--\r\n" + "tr#odd {\r\n" + "   background-color:#e2e2e2;\r\n" + "  vertical-align:top;\r\n" + "}\r\n" + "\r\n" + "tr#even {\r\n" + "   vertical-align:top;\r\n" + "}\r\n" + "div#title {\r\n" + "  font-size:16px;\r\n" + "    font-weight:bold;\r\n" + "}\r\n" + "\r\n" + "div#mpaa {\r\n" + "    font-size:10px;\r\n" + "}\r\n" + "\r\n" + "div#genre {\r\n" + " font-size:12px;\r\n" + "    font-style:italic;\r\n" + "}\r\n" + "\r\n" + "div#plot {\r\n" + "   height: 63px;\r\n" + "  font-size:12px;\r\n" + "    overflow:hidden;\r\n" + "}\r\n" + "-->\r\n" + "</style>\r\n" + "\r\n" + "<html>\r\n" + "    <body>\r\n" + "     <table>\r\n";
        catalog.WriteLine(strHeader);
        strPDF = strHeader;

        foreach (Movie m in mList)
        {
            tmpGenre = null;

            strMovie = lineID == 0 ? "          <tr id=\"odd\" style=\"page-break-inside:avoid\">\r\n" : "          <tr id=\"even\" style=\"page-break-inside:avoid\">\r\n";
            catalog.WriteLine(strMovie);
            strPDF += strMovie;

            foreach (string genre in m.Genres)
                tmpGenre += ", <a href=\"" + genre + ".html\" target=\"_blank\">" + genre + "</a>";
            strGenre = tmpGenre != null ? tmpGenre.Substring(2) : null;

            strMovie = "                <td>\r\n" + "                   <img src=\".\\images\\" + m.ImageFile + "\" width=\"75\" height=\"110\">\r\n" + "               </td>\r\n" + "              <td>\r\n" + "                   <div id=\"title\">" + m.Title + "</div>\r\n" + "                    <div id=\"mpaa\">" + m.Certification + " " + m.MPAA + "</div>\r\n" + "                  <div id=\"genre\">" + strGenre + "</div>\r\n" + "                   <div id=\"plot\">" + m.Plot + "</div>\r\n" + "              </td>\r\n" + "          </tr>\r\n";
            catalog.WriteLine(strMovie);
            strPDF += strMovie;
            lineID = lineID == 0 ? 1 : 0;
        }

        string closingHTML = "      </table>\r\n" + "   </body>\r\n" + "</html>";
        catalog.WriteLine(closingHTML);
        strPDF += closingHTML;
        WritePDF(strPDF, cFile + ".PDF");
        catalog.Close();
    }

После завершения я хочу вызвать следующую функцию для генерации файла PDF:

public static void WritePDF(string cFile, string pdfFile)
{
    WkHtmlToPdfConverter w = new WkHtmlToPdfConverter();

    byte[] strHTML = w.Convert(cFile);
    File.WriteAllBytes(pdfFile, strHTML);
    w.Dispose();
}

Я обнаружил, чтоФункция .Convert преобразует HTML-код в PDF, а не в файл.Во-вторых, когда я передаю код HTML напрямую, изображения не отображаются в PDF.Я знаю, что есть проблема с файлами .GIF, но это все файлы .JPG.

Я много читал о том, насколько хорош wkhtmltopdf, и парень, который написал WkHTMLToSharp, опубликовал свой проект по всему SO,но я был разочарован отсутствием документации для этого.

Я ХОЧУ иметь возможность передать файл для преобразования, изменить поля (я знаю, что это возможно, мне просто нужно выяснитьправильные настройки), чтобы он преобразовывал изображения правильно и, что самое важное, чтобы не разбивать мои элементы по нескольким страницам (поддержка «разрыва страницы: избегать» или что-то подобное).Посмотрите, как другие используют это!

Ответы [ 4 ]

1 голос
/ 20 декабря 2016

Я написал пример о том, как создать PDF из HTML. Я только что обновил его, чтобы также печатать изображения.

https://github.com/hmadrigal/playground-dotnet/tree/master/MsDotNet.PdfGeneration

(В своем блоге я объясняю большую часть проекта https://hmadrigal.wordpress.com/2015/10/16/creating-pdf-reports-from-html-using-dotliquid-markup-for-templates-and-wkhtmltoxsharp-for-printing-pdf/)

Почти у вас есть два варианта:

1: Использование file: // и полный путь к файлу.

<img alt="profile" src="{{ employee.PorfileFileName | Prepend: "Assets\ProfileImage\" | ToLocalPath  }}" />

2: использование данных URL (https://en.wikipedia.org/wiki/Data_URI_scheme)

<img alt="profile" src="data:image/png;base64,{{ employee.PorfileFileName | Prepend: "Assets\ProfileImage\" | ToLocalPath | ToBase64 }}" />

Ура, Херб

0 голосов
/ 05 августа 2011

Мы также используем wkhtmltopdf и можем правильно отображать изображения.Однако по умолчанию рендеринг изображений отключен.

Вы должны указать эти параметры в экземпляре конвертера:

var wk = _GetConverter()
wk.GlobalSettings.Margin.Top = "20mm";
wk.GlobalSettings.Margin.Bottom = "10mm";
wk.GlobalSettings.Margin.Left = "10mm";
wk.GlobalSettings.Margin.Right = "10mm";
wk.GlobalSettings.Size.PaperSize = PdfPaperSize.A4;
wk.ObjectSettings.Web.PrintMediaType = true;
wk.ObjectSettings.Web.LoadImages = true;
wk.ObjectSettings.Web.EnablePlugins = false;
wk.ObjectSettings.Web.EnableJavascript = true;

result = wk.Convert(htmlContent);
0 голосов
/ 31 октября 2013

Использовать WkHtmlToXSharp.

Загрузите последнюю версию DLL с Github

public static string ConvertHTMLtoPDF(string htmlFullPath, string pageSize, string orientation)
{
   string pdfUrl = htmlFullPath.Replace(".html", ".pdf");

   try
   {
       #region USING WkHtmlToXSharp.dll
       //IHtmlToPdfConverter converter = new WkHtmlToPdfConverter();
       IHtmlToPdfConverter converter = new MultiplexingConverter();

       converter.GlobalSettings.Margin.Top = "0cm";
       converter.GlobalSettings.Margin.Bottom = "0cm";
       converter.GlobalSettings.Margin.Left = "0cm";
       converter.GlobalSettings.Margin.Right = "0cm";
       converter.GlobalSettings.Orientation = (PdfOrientation)Enum.Parse(typeof(PdfOrientation), orientation);
       if (!string.IsNullOrEmpty(pageSize))
           converter.GlobalSettings.Size.PageSize = (PdfPageSize)Enum.Parse(typeof(PdfPageSize), pageSize);

       converter.ObjectSettings.Page = htmlFullPath;
       converter.ObjectSettings.Web.EnablePlugins = true;
       converter.ObjectSettings.Web.EnableJavascript = true;
       converter.ObjectSettings.Web.Background = true;
       converter.ObjectSettings.Web.LoadImages = true;
       converter.ObjectSettings.Load.LoadErrorHandling = LoadErrorHandlingType.ignore;

       Byte[] bufferPDF = converter.Convert();

       System.IO.File.WriteAllBytes(pdfUrl, bufferPDF);

       converter.Dispose();

       #endregion
   }
   catch (Exception ex)
   {
       throw new Exception(ex.Message, ex);
   }

   return pdfUrl;
}
0 голосов
/ 18 июля 2011

Вы можете использовать Spire.Pdf для этого.

Этот компонент может конвертировать html в pdf.

 PdfDocument pdfdoc = new PdfDocument();
 pdfdoc.LoadFromHTML(fileFullName, true, true, true);
 //String url = "http://www.e-iceblue.com/";
 //pdfdoc.LoadFromHTML(url, false, true, true);
 pdfdoc.SaveToFile("FromHTML.pdf");
...