我正在使用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();
答案 0 :(得分:1)
如果要在HTML中引入分页符,则使用的是错误的类。 HTMLWorker
从未适合将HTML + CSS转换为PDF。此外,该类已被放弃,转而支持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,则可能需要购买商业许可证。
答案 1 :(得分:0)
我有多个html字符串,我在其中添加了“pagebreak”作为文本,如
Dim sb As New StringBuilder()
sb.Append(htmlstring1.Text)
sb.Append("pagebreak")
sb.Append(htmlstring2.Text)
sb.Append("pagebreak")
我希望每个html字符串都在新页面上呈现。为了识别页面的结尾或新页面的开头,我在html字符串的末尾添加了“pagebreak”文本。
以下是拆分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
希望这会有所帮助!!