2016-01-22 3 views
2

Есть ли способ установить размер страницы печати в миллиметрах, как вы можете с помощью границ, в NReco - html to pdf wrapper для wkhtmltopdf? Найден способ указать один из четырех размеров страницы в docs, который недостаточно точен.Установить размер страницы в единицах с помощью NReco (WkHtmlToPdf)

Из-за того, что вы сами читаете сами документы wkhtmltopdf, похоже, что он также ограничен предопределенными размерами страниц, вместо того, чтобы устанавливать их вручную в единицах длины.

Выполнение этого вопроса в случае, если я, надеюсь, ошибаюсь. Например, нужно настроить страницу на 15x10 см.

Редактировать: Мне не удается заставить библиотеку использовать настройки страницы html (в качестве альтернативы не устанавливать ничего в html и устанавливать высоту/ширину/поля в NReco, как показано в моем частичном ответе ниже). Это:

@page { 
     size: 4in 3in; 
     margin: 0mm 0mm 0mm 0mm; 
    } 

на самом деле работает на печать, но когда я пытаюсь заставить NReco использовать его:

pdfConverter.CustomWkHtmlArgs = "--print-media-type"; 

он ничего не делает. Например, с первой страницы сайта NReco, что делает его более смешным.

ответ

1

Глядя на этот фрагмент из документации wkhtmltopdf:

 --page-height <unitreal>  Page height 
    -s, --page-size <Size>    Set paper size to: A4, Letter, etc. 
             (default A4) 
     --page-width <unitreal>   Page width 

Я хотел бы сказать, что с помощью --page-высоты и ширины --page будет делать трюк. Логика скажет, что они задают высоту и ширину страницы в точках, поэтому вам нужно будет сделать математику, чтобы преобразовать ваш cm или mm в точки PDF (72 точки в дюйме).

+0

Я использую обертку NReco. Обертка устанавливает размер страницы в мм или по умолчанию «A4», как показано выше. Я подтвердил ваш ответ, потому что я уверен, что он работает в самом wkhtml, но у меня все еще есть проблемы с реализацией (см. Мой ответ), поэтому я оставляю это открытым пока. – VSO

0

Примечание: Я буду редактировать этот ответ, если я получу где-нибудь, но на данный момент я думаю, что что-то лучше, чем ничего для того, кто мог бы это прочитать.

Проводка ответ, что другие могут оказаться полезными, но это не полное решение моей проблемы:

HtmlToPdfConverter pdfConverter = new HtmlToPdfConverter(); 

//The page width and page height values are in mm 
pdfConverter.PageWidth = 102; 
pdfConverter.PageHeight = 77; 

Это не должно быть принято отвечать - по какой-то причине он не полностью соответствует простой HTML проклейки , Например, если я создаю html-документ с соотношением сторон 4x3 и затем соответствующим образом настрою эти реквизиты, результирующее изображение на странице все равно не занимает всю страницу (заканчивается меньше).

Если я бегу следующие HTML и установочные размеры страниц 102 мм х 72мм я получаю скриншот ниже, который далеко, несмотря на наличие соотношения прав:

<html> 
<head> 
    <style> 
     .reportBody { 
      padding: 0px; 
      border: 0px; 
      margin: 0px; 
     } 

     .reportTable{ 
      padding: 0px; 
      border: 0px; 
      margin: 0px; 
      width: 102mm; 
      height: 77mm; 
     } 
    </style> 
</head> 

<body class = "reportBody"> 
    <table class = "reportTable"> 
     <tr> 
      <td style = "background-color:red"> 
       Row 1 Column 1 
      </td> 
      <td style = "background-color:blue"> 
       Row 1 Column 2 
      </td> 
     </tr> 
     <tr> 
      <td style = "background-color:green"> 
       Row 2 Column 1 
      </td> 
      <td style = "background-color:yellow"> 
       Row 2 Column 2 
      </td> 
     </tr> 
    </table> 
</body> 

</html> 

enter image description here

1

Быстрый ответ ваш вопрос да, настройки находятся в mm, когда вы используете свойства height и width, так что вы делаете правильно в отношении кода C#, ваша проблема с размерами - это конвертер с использованием «умного» способа изменения размера, который включен по умолчанию. Соотношение правильное, но уменьшенные размеры - это точно та же проблема, что и у меня, которая была разрешена включением опции --disable-smart-shrinking.

Для получения более полной картины: Я только что закончил первый шаг по получению печати по рецепту прямо из нового приложения Razor, причем PDF-файлы создаются с помощью оболочки NReco. Я должен печатать на фиксированном листе рецепта (215 мм x 176 мм) с небольшим отрывом вокруг него.Это код, который у меня есть в контроллере, который возвращает pdf в качестве переменной fileResult.

public async Task<ActionResult> OutputScript(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     var model = await GetViewModelForScript(id.Value); 
     if (model == null) 
     { 
      return HttpNotFound(); 
     } 

     // create a string writer to receive the HTML code 
     StringWriter stringWriter = new StringWriter(); 

     // get the view to render 
     ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, "Script", null); 
     // create a context to render a view based on a model 
     ViewContext viewContext = new ViewContext(
       ControllerContext, 
       viewResult.View, 
       new ViewDataDictionary(model), 
       new TempDataDictionary(), 
       stringWriter 
       ); 

     // render the view to a HTML code 
     viewResult.View.Render(viewContext, stringWriter); 

     // return the HTML code 
     string htmlToConvert = stringWriter.ToString(); 

     // instantiate the HTML to PDF converter 
     HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter(); 
     htmlToPdfConverter.CustomWkHtmlArgs = " --print-media-type --title \"SMS Script " + model.ScriptID + "\" --dpi 300 --disable-smart-shrinking"; 
     htmlToPdfConverter.PageHeight = 215; 
     htmlToPdfConverter.PageWidth = 176; 
     var margins = new PageMargins(); 
     margins.Bottom = 4; 
     margins.Top = 4; 
     margins.Left = 5; 
     margins.Right = 5; 
     htmlToPdfConverter.Margins = margins; 
     htmlToPdfConverter.Orientation = PageOrientation.Landscape; 
     // render the HTML code as PDF in memory 
     byte[] pdfBuffer = htmlToPdfConverter.GeneratePdf(htmlToConvert); 

     // send the PDF file to browser 
     FileResult fileResult = new FileContentResult(pdfBuffer, "application/pdf"); 
     fileResult.FileDownloadName = "Script.pdf"; 

     return fileResult; 

    } 

Путь теперь все @media print директивы повиновался, скрывая метки, которые показывают на экране «Предварительный просмотр», когда PDF генерируется для печати.

+0

Я «решил» проблему, установив настройки масштабирования вместо отключения умного сокращения: converter.Zoom = 2; два - просто 2x. Мне приходилось настраивать параметры масштабирования для сервера амазонки, лазурного сервера и локальных компьютеров отдельно, потому что, по-видимому, он основан на машинах, построенных в графической системе (не спрашивайте). Я также написал своего помощника, чтобы добавить комментарии в html, которые может видеть конвертер PDF. Если это то, что вы найдете полезным, дайте мне знать. Со всем, что мы с тобой пытались, я до сих пор не могу получить очень маленькие поля для печати без хаков. – VSO

Смежные вопросы