SelectPDF 在幕后渲染重复值
SelectPDF rendering duplicate values behind the scenes
我最近继承了一些用 SelectPDF 呈现的报告,我正在尝试解决一个问题。在这种特殊情况下,一个非常基本的 MVC 页面呈现一组 tables,中间有分页符,将随机分类的重复数据呈现为幕后的隐藏字段。当您通过 Ctrl+F 搜索文档或尝试拖动 select(见图片)时,数据显示为可搜索,复制时,数据显示为报告中 fields/values 的某种组合.例如下图中,那些黄色字段是前一页或后一页的数据,可以搜索、复制等。该文件没有隐藏字段,没有display:none,没有那种性质。我想看看这是否是一个 SelectPDF 设置?为什么它会在报告其他地方找到的隐藏字段数据中重新呈现?
代码是非常基本的 boostrap 布局,包含一个 div 和一个 for 循环,在每个进程中呈现一个 table。每个table之后是一个分页符,比如:
<div class="new-page"></div>
其中 class 是
.new-page {
page-break-after: always;
根据文档,渲染看起来也非常简单:
public static string RenderRazorViewToPDFWithHeader(RazorHeaderPartialView headerPartialView, string contentViewName, RazorFooterPartialView? footerPartialView, object model, ControllerContext ControllerContext, ViewDataDictionary ViewData, TempDataDictionary TempData, PdfPageOrientation pageOrientation)
{
string filePath = Path.GetTempPath() + Path.GetRandomFileName();
var header = RenderRazorViewToString(headerPartialView.PartialViewName, model, ControllerContext, ViewData, TempData);
var PDFView = RenderRazorViewToString(contentViewName, model, ControllerContext, ViewData, TempData);
var footer = footerPartialView.HasValue ? RenderRazorViewToString(footerPartialView.Value.PartialViewName, model, ControllerContext, ViewData, TempData) : String.Empty;
var pdf = new HtmlToPdf();
pdf.Options.PdfPageOrientation = pageOrientation;
pdf.Options.DisplayHeader = true;
pdf.Header.DisplayOnFirstPage = true;
pdf.Header.DisplayOnOddPages = true;
pdf.Header.DisplayOnEvenPages = true;
pdf.Header.Height = headerPartialView.Height;
pdf.Header.Add(new PdfHtmlSection(header, null));
if (footerPartialView.HasValue)
{
pdf.Options.DisplayFooter = true;
pdf.Footer.Height = footerPartialView.Value.Height;
pdf.Footer.Add(new PdfHtmlSection(footer, null));
if (footerPartialView.Value.ShowPageNumbers)
{
const int fontSize = 8;
int pageNumX = (pdf.Options.WebPageWidth / 3) + footerPartialView.Value.HorizontalMarginOffset;
int pageNumY = footerPartialView.Value.VerticalMarginOffset;
PdfTextSection pageNumText = new PdfTextSection(pageNumX, pageNumY,
"Page {page_number} of {total_pages}",
new System.Drawing.Font("Arial", fontSize));
pdf.Footer.Add(pageNumText);
}
}
var doc = pdf.ConvertHtmlString(PDFView);
doc.Save(filePath);
doc.Close();
return filePath;
}
披露:我为 SelectPdf 工作。
您需要启用备用分页算法。为此,请使用以下代码:
pdf.Options.PageBreaksEnhancedAlgorithm = true;
有关 属性 的详细信息如下:
https://selectpdf.com/docs/P_SelectPdf_HtmlToPdfOptions_PageBreaksEnhancedAlgorithm.htm
我最近继承了一些用 SelectPDF 呈现的报告,我正在尝试解决一个问题。在这种特殊情况下,一个非常基本的 MVC 页面呈现一组 tables,中间有分页符,将随机分类的重复数据呈现为幕后的隐藏字段。当您通过 Ctrl+F 搜索文档或尝试拖动 select(见图片)时,数据显示为可搜索,复制时,数据显示为报告中 fields/values 的某种组合.例如下图中,那些黄色字段是前一页或后一页的数据,可以搜索、复制等。该文件没有隐藏字段,没有display:none,没有那种性质。我想看看这是否是一个 SelectPDF 设置?为什么它会在报告其他地方找到的隐藏字段数据中重新呈现?
代码是非常基本的 boostrap 布局,包含一个 div 和一个 for 循环,在每个进程中呈现一个 table。每个table之后是一个分页符,比如:
<div class="new-page"></div>
其中 class 是
.new-page {
page-break-after: always;
根据文档,渲染看起来也非常简单:
public static string RenderRazorViewToPDFWithHeader(RazorHeaderPartialView headerPartialView, string contentViewName, RazorFooterPartialView? footerPartialView, object model, ControllerContext ControllerContext, ViewDataDictionary ViewData, TempDataDictionary TempData, PdfPageOrientation pageOrientation)
{
string filePath = Path.GetTempPath() + Path.GetRandomFileName();
var header = RenderRazorViewToString(headerPartialView.PartialViewName, model, ControllerContext, ViewData, TempData);
var PDFView = RenderRazorViewToString(contentViewName, model, ControllerContext, ViewData, TempData);
var footer = footerPartialView.HasValue ? RenderRazorViewToString(footerPartialView.Value.PartialViewName, model, ControllerContext, ViewData, TempData) : String.Empty;
var pdf = new HtmlToPdf();
pdf.Options.PdfPageOrientation = pageOrientation;
pdf.Options.DisplayHeader = true;
pdf.Header.DisplayOnFirstPage = true;
pdf.Header.DisplayOnOddPages = true;
pdf.Header.DisplayOnEvenPages = true;
pdf.Header.Height = headerPartialView.Height;
pdf.Header.Add(new PdfHtmlSection(header, null));
if (footerPartialView.HasValue)
{
pdf.Options.DisplayFooter = true;
pdf.Footer.Height = footerPartialView.Value.Height;
pdf.Footer.Add(new PdfHtmlSection(footer, null));
if (footerPartialView.Value.ShowPageNumbers)
{
const int fontSize = 8;
int pageNumX = (pdf.Options.WebPageWidth / 3) + footerPartialView.Value.HorizontalMarginOffset;
int pageNumY = footerPartialView.Value.VerticalMarginOffset;
PdfTextSection pageNumText = new PdfTextSection(pageNumX, pageNumY,
"Page {page_number} of {total_pages}",
new System.Drawing.Font("Arial", fontSize));
pdf.Footer.Add(pageNumText);
}
}
var doc = pdf.ConvertHtmlString(PDFView);
doc.Save(filePath);
doc.Close();
return filePath;
}
披露:我为 SelectPdf 工作。
您需要启用备用分页算法。为此,请使用以下代码:
pdf.Options.PageBreaksEnhancedAlgorithm = true;
有关 属性 的详细信息如下: https://selectpdf.com/docs/P_SelectPdf_HtmlToPdfOptions_PageBreaksEnhancedAlgorithm.htm