使用 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();
在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
希望这有帮助!!