首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NReco (WkHtmlToPdf)以单位设置页面大小

使用NReco (WkHtmlToPdf)以单位设置页面大小
EN

Stack Overflow用户
提问于 2016-01-22 21:26:09
回答 3查看 9K关注 0票数 4

有没有一种方法可以像设置边框一样,在NReco中以毫米为单位设置打印页面大小?找到了在docs中指定四种页面大小中的一种的方法,但这还不够精确。

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

提出这个问题,以防我错了,希望如此。例如,需要将页面设置为15x10 to。

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

代码语言:javascript
复制
    @page {
       size: 4in 3in;
       margin: 0mm 0mm 0mm 0mm;
    }

实际上在打印时有效,但当我试图强制NReco使用它时:

代码语言:javascript
复制
pdfConverter.CustomWkHtmlArgs = "--print-media-type";

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

EN

回答 3

Stack Overflow用户

发布于 2016-01-22 23:00:51

查看wkhtmltopdf文档中的以下代码片段:

代码语言:javascript
复制
      --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就可以了。逻辑上会说,它们将设置页面的高度和宽度(以磅为单位),因此您必须计算将厘米或毫米转换为PDF点(一英寸为72点)。

票数 3
EN

Stack Overflow用户

发布于 2016-01-22 23:14:41

注意:如果我到了什么地方,我会编辑这个答案,但现在,我想对于任何可能读到这篇文章的人来说,有东西总比没有好。

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

代码语言:javascript
复制
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 mm x 72 mm,我会得到下面的屏幕截图,尽管比例是正确的,但这仍然是错误的:

代码语言:javascript
复制
<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>

票数 1
EN

Stack Overflow用户

发布于 2016-02-12 02:33:02

对你的问题的快速回答是肯定的,当你使用heightwidth属性时,这些设置是在mm中的,所以你所做的关于C#代码是正确的,你的大小调整问题是转换器采用了“智能”大小调整技术,默认情况下是打开的。比率是正确的,但尺寸缩小与我遇到的问题完全相同,通过包含--disable-smart-shrinking选项解决了这个问题。

更完整的图片:我刚刚完成了第一步,直接从一个新的剃须刀应用程序打印处方,PDF是通过NReco包装器生成的。我必须打印到一张固定的处方纸(215 it X 176 It),周围有一个小的页边距。这是我在控制器中获得的代码,它将pdf作为fileResult变量返回。

代码语言:javascript
复制
    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时,隐藏在屏幕上“预览”的标签。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34947804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档