使用NReco设置页面大小(WkHtmlToPdf)

时间:2016-01-22 13:26:09

标签: html asp.net pdf wkhtmltopdf

有没有办法在NReco中设置以毫米为单位的打印页面大小,就像你可以用边框一样 - wkhtmltopdf的html到pdf包装器?找到了一种在docs中指定四种页面尺寸之一的方法,这种方法不够精确。

从阅读wkhtmltopdf文档本身来看,它似乎也仅限于预定义的页面大小,而不是以长度为单位手动设置。

提出这个问题,以防万一,希望是错误的。例如,需要将页面设置为15x10cm。

编辑:我无法强迫库使用html页面设置(作为替代,不在html中设置任何内容,并在NReco中设置高度/宽度/边距,如下面的部分答案所示)。这样:

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

实际上适用于打印,但当我尝试强制NReco使用它时:

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

它什么都不做。示例来自NReco网站的首页,这使它更有趣。

3 个答案:

答案 0 :(得分: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-height和--page-width可以解决这个问题。 Logic会说这些将以点为单位设置页面高度和宽度,因此您必须进行数学运算才能将cm或mm转换为PDF点(72英寸)。

答案 1 :(得分:1)

注意:如果我到达某个地方,我将编辑这个答案,但就目前而言,我觉得对于那些想读这个的人来说,事情总比什么都好。

发布其他人可能会觉得有帮助的答案,但这不是我问题的完整解决方案:

HtmlToPdfConverter pdfConverter = new HtmlToPdfConverter();

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

这不应该是接受的答案 - 由于某种原因它不完全匹配简单的html大小。例如,如果我创建一个大小比为4x3的html文档,然后适当地设置这些道具,页面上生成的图像仍然不占用整个页面(最终变小)。

如果我运行以下html并将页面大小设置为102毫米x 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

答案 2 :(得分:1)

您的问题的快速回答是肯定的,当您使用mmheight属性时,设置位于width,因此您对C#代码的处理是正确的,你的尺寸问题是使用“智能”的转换器。调整大小的技术,默认情况下处于启用状态。比率正确但尺寸减小与我遇到的问题完全相同,而--disable-smart-shrinking选项已包含此问题。

更全面的图片: 我刚刚完成了从一个新的Razor应用程序直接获得处方打印的第一步,通过NReco包装器生成PDF。我必须打印到一个固定的处方表(215毫米x 176毫米),周围有一个小的边缘。这是我在Controller中获得的代码,它将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指令,隐藏屏幕上显示的标签&#34;预览&#34;生成PDF以进行打印时。