使用 itextsharp 将转发器控件转换为 pdf 每个重复的内容都应该出现在新页面中
converting repeater control to pdf using itextsharp every repeated contents should come in new page
我正在使用 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 中引入分页符,你使用的是错误的 class。 HTMLWorker
从来不适合将 HTML+CSS 转换为 PDF。此外,class 已被放弃,取而代之的是 XML Worker。
请看一下HtmlPageBreaks例子:
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">
有一个 page-break-after
属性的值为 'always'(目前唯一支持的值)。
现在仔细看看最后一个<h1>
的开始标签:
<h1 style="page-break-before: always">
有一个 page-break-before
属性值为 'always'。
我做了这个例子来演示这些 CSS 属性的使用:它们会导致 iText 触发一个新页面,如生成的 PDF 所示:page_breaks.pdf
请注意,这仅在较新的 iText 版本中受支持。如果您在 AGPL 范围之外使用 iText 和 XML Worker,您可能需要购买商业许可证。
我有多个 html 字符串,我在它们之间附加了 "pagebreak" 作为文本,
Dim sb As New StringBuilder()
sb.Append(htmlstring1.Text)
sb.Append("pagebreak")
sb.Append(htmlstring2.Text)
sb.Append("pagebreak")
我希望每个 html 字符串都呈现在一个新的 page.To 标识页面的结尾或新页面的开头 我在末尾附加了一个 "pagebreak" 文本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
希望对您有所帮助!!
我正在使用 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 中引入分页符,你使用的是错误的 class。 HTMLWorker
从来不适合将 HTML+CSS 转换为 PDF。此外,class 已被放弃,取而代之的是 XML Worker。
请看一下HtmlPageBreaks例子:
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">
有一个 page-break-after
属性的值为 'always'(目前唯一支持的值)。
现在仔细看看最后一个<h1>
的开始标签:
<h1 style="page-break-before: always">
有一个 page-break-before
属性值为 'always'。
我做了这个例子来演示这些 CSS 属性的使用:它们会导致 iText 触发一个新页面,如生成的 PDF 所示:page_breaks.pdf
请注意,这仅在较新的 iText 版本中受支持。如果您在 AGPL 范围之外使用 iText 和 XML Worker,您可能需要购买商业许可证。
我有多个 html 字符串,我在它们之间附加了 "pagebreak" 作为文本,
Dim sb As New StringBuilder()
sb.Append(htmlstring1.Text)
sb.Append("pagebreak")
sb.Append(htmlstring2.Text)
sb.Append("pagebreak")
我希望每个 html 字符串都呈现在一个新的 page.To 标识页面的结尾或新页面的开头 我在末尾附加了一个 "pagebreak" 文本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
希望对您有所帮助!!