使用 iTextsharp 将中继器控件转换为 PDF,每个重复的内容都应该出现在新页面中

本文关键字:新页面 控件 中继器 iTextsharp 转换 PDF 使用 | 更新日期: 2023-09-27 18:36:49

我正在使用iTextSharp将中继器控件中的html内容转换为pdf(内容来自数据库)。 一切都很好,但每个重复的内容都应该出现在新的PDF页面中,而不是同一页面中的两个重复数据。例如,我正在将学生注册信息从数据库绑定到中继器控件,我想将内容转换为PDF,但两个学生的注册数据出现在同一个PDF页面中,这不应该发生。多条记录应分别放在新页面中,而不是在同一页面中

将转发器内容转换为 PDF 的代码

    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=Registrations.pdf");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);
    this.Repeater1.RenderControl(hw);
    StringWriter sw2 = new StringWriter();
    HtmlTextWriter hw1 = new HtmlTextWriter(sw2);
    StringReader sr = new StringReader(sw.ToString().Replace("'r", "").Replace("'n'n", "").Replace("  ", ""));
    Document pdfDoc = new Document(iTextSharp.text.PageSize.A4, 40f, 40f, 100f, 95f);
     HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
    PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
    pdfDoc.NewPage();
    pdfDoc.Open();     
    htmlparser.Parse(sr);
    pdfDoc.Close();
    Response.Write(pdfDoc);
    Response.End(); 

使用 iTextsharp 将中继器控件转换为 PDF,每个重复的内容都应该出现在新页面中

如果要

在HTML中引入分页符,则使用了错误的类。 HTMLWorker从来不适合将HTML+CSS转换为PDF。此外,该类已被放弃,转而支持XML Worker。

请看一下 HtmlPageBreak 示例:

public void createPdf(String file) throws IOException, DocumentException {
    // step 1
    Document document = new Document();
    // step 2
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
    // step 3
    document.open();
    // step 4
    XMLWorkerHelper.getInstance().parseXHtml(writer, document,
            new FileInputStream(HTML));
    // step 5
    document.close();
}

在此示例中,我们解析以下 HTML 文件:page_breaks.html

仔细看看第一<table>的开场标签:

<table style="border: solid 1pt; page-break-after: always" cellspacing="0">

有一个值为"always"(当前支持的唯一值)的 page-break-after 属性。

现在仔细看看最后<h1>的开场标签:

<h1 style="page-break-before: always">

有一个值为"always"的page-break-before属性。

我制作此示例来演示这些CSS属性的使用:它们会导致iText触发一个新页面,如生成的PDF:page_breaks.pdf

请注意,这仅在较新的 iText 版本中受支持。如果您在 AGPL 上下文之外使用 iText 和 XML Worker ,则可能需要购买商业许可证。

我有多个 html 字符串,我用"分页符"作为文本附加在两者之间,例如,

Dim sb As New StringBuilder()
sb.Append(htmlstring1.Text)
sb.Append("pagebreak")
sb.Append(htmlstring2.Text)
sb.Append("pagebreak")

我希望每个 html 字符串都呈现在新页面上。为了识别页面的结尾或新页面的开头,我在 html 字符串的末尾附加了一个"分页符"文本。

以下是拆分 HTML 字符串的代码。

Dim myString As String = sb.ToString()
Dim mySplit As String = "pagebreak"
Dim myResult() As String = myString.Split(New String() {mySplit}, StringSplitOptions.None)

我们将从创建 pdf 开始,

Dim pdfDoc As New Document(PageSize.A4, 10.0F, 10.0F, 10.0F, 0.0F)
        Dim htmlparser As New HTMLWorker(pdfDoc)
        Using memoryStream As New MemoryStream()
            Dim writer As PdfWriter = PdfWriter.GetInstance(pdfDoc, memoryStream)
            pdfDoc.Open()
            For Each r As String In myResult
                Dim sr As New StringReader(r)
                htmlparser.Parse(sr)
                pdfDoc.NewPage()
                sr.Dispose()
            Next
            pdfDoc.Close()
            Dim bytes As Byte() = memoryStream.ToArray()
            memoryStream.Close()
            Response.Clear()
            Response.ContentType = "application/pdf"
            Response.AddHeader("Content-Disposition", "attachment;filename=Report.pdf")
            Response.Buffer = True
            Response.Cache.SetCacheability(HttpCacheability.NoCache)
            Response.BinaryWrite(bytes)
            Response.[End]()
            Response.Close()
        End Using

希望这有帮助!!