【问题标题】:Set Page Size in Units with NReco (WkHtmlToPdf)使用 NReco (WkHtmlToPdf) 以单位设置页面大小
【发布时间】:2016-04-29 02:50:08
【问题描述】:

有没有办法以毫米为单位设置打印页面大小,就像你可以在 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 网站的首页,这使它更有趣。

【问题讨论】:

    标签: html asp.net pdf wkhtmltopdf


    【解决方案1】:

    对您的问题的快速回答是肯定的,当您使用 heightwidth 属性时,设置在 mm 中,所以您在 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 生成打印时隐藏在屏幕上显示的标签“预览”。

    【讨论】:

    • 我通过设置缩放设置而不是禁用智能缩小“解决”了这个问题:converter.Zoom = 2;两个只是这里的 2 倍。我不得不分别为亚马逊服务器、天蓝色服务器和本地机器配置缩放设置,因为显然它是基于内置图形系统的机器(不要问)。我还写了自己的helper,把cmets放到PDF转换器可以看到的html中。如果这对您有帮助,请告诉我。尽管你和我都尝试过,但我仍然无法在没有 hack 的情况下获得极小的边距来正确打印。
    【解决方案2】:

    注意:如果我得到某个地方,我会编辑这个答案,但就目前而言,我想对于可能读到这篇文章的人来说,有总比没有好。

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

    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>
    

    【讨论】:

      【解决方案3】:

      查看 wkhtmltopdf 文档中的这个 sn-p:

            --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 可以解决问题。逻辑上会说这些将以磅为单位设置页面高度和宽度,因此您必须进行数学运算才能将 cm 或 mm 转换为 PDF 磅(72 磅/英寸)。

      【讨论】:

      • 我正在使用 NReco 包装器。包装器以毫米为单位设置页面大小或设置为默认的“A4”大小,如上所示。我赞成您的回答,因为我确信它在 wkhtml 本身中有效,但我仍然无法正确呈现事物(请参阅我的回答),所以我暂时保持打开状态。
      猜你喜欢
      • 2014-03-20
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      相关资源
      最近更新 更多