使用itextsharp将转发器控制转换为pdf,每个重复的内容都应该出现在新的页面中

时间:2015-01-08 15:14:04

标签: c# asp.net pdf itextsharp

我正在使用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(); 

2 个答案:

答案 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

希望这会有所帮助!!