有没有办法在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网站的首页,这使它更有趣。
答案 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>
答案 2 :(得分:1)
您的问题的快速回答是肯定的,当您使用mm
和height
属性时,设置位于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以进行打印时。