如何使用 PdfWriter 生成多页

How to generate mutiple page using PdfWriter

我正在使用 C# 中的 PdfWriter 为工资单生成 pdf 文件。我正在从 html 代码下载 pdf 文件,每个用户都会创建一个 table (

...
) 并且每个 table 在新页面显示。 但是所有 table 都显示在同一页中。

例如

第 1 页
员工 1 详情
可能详情会出现在下一页。

第 2 页
员工 2 详情

第 3 页
员工 2 详细信息
第 4 页
员工 3 详细信息

.....
.....
....

但是现在我的输出会来
第 1 页
员工 1
员工 2
第 2 页
员工 3
员工 4
员工 5
.....

我的密码是

StringBuilder stb = new StringBuilder();
stb.Append(All.ToString());
EXP.InnerHtml = stb.ToString();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);

StringWriter stringWriter = new StringWriter();
HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter);


string resHtml = "";

for(int i=0;i<10;i++)
{
    resHtml+="<table width='100%'><tr><td align='center'>payslip"+ i+"</td></tr></table>"; 
}
StringReader stringReader = new StringReader(resHtml);
Doc = new Document(PageSize.A2, 10f, 10f, 50f, 20f);

HTMLWorker htmlparser = new HTMLWorker(Doc);
PdfWriter.GetInstance(Doc, Response.OutputStream);
Doc.Open();
htmlparser.Open(); 
htmlparser.Parse(stringReader);
htmlparser.Close();
Doc.Close();
Response.Write(Doc);
Response.End();

如果您的 html 内容是固定的,那么您可以使用分页符,但如果您的 HTML 内容是可变的,那么预测页面何时开始和结束将有所不同。

您正在使用 HTMLWorker。 class 已弃用:不再支持它,因为它已被放弃以支持 XML Worker。有多种方法可以解决您的问题。

创建多个小 HTML 文件而不是一个大 HTML

我不会为每个员工创建一个长table,而是为每个员工创建一个table,并在添加每个table后引入document.NewPage()。 请参阅 问题

的答案 #2

这是一些Java代码(你可以把它当作伪代码来阅读):

public void createPdf(Employees employees) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter.getInstance(document, new FileOutputStream(file));
    document.open();
    String css = readCSS();
    for (Employee employee : employees) {
        String html = createHtml(employee);
        ElementList list = XMLWorkerHelper.parseToElementList(html, css);
        for (Element e : list) {
            document.add(e);
        }
        document.newPage();
    }
    document.close();
}

从内存和CPU使用的角度来看,此解决方案是最佳解决方案。

创建一大HTML并引入分页符

另一种选择是在每个员工之前引入分页符 table。参见 set new page in HTML using iTextSharp HTMLWorker (html to pdf)

这不是一个好主意,因为您会在内存中建立大量数据,并且只有在呈现 PDF 后才能释放内存。 iTextSharp 尝试尽快将页面刷新到 OutputStream。如果您创建小 HTML 文件,并立即将它们添加到 PDF,您可以尽快从内存中丢弃 HTML 字节,iTextSharp 也将能够将内容流刷新到输出,释放存储该内容所需的内存。

重要提示:

显然,这些答案表明您做对了。那就是:扔掉你依赖于废弃的 HTMLWorker 的代码,开始使用 XML Worker.

您可以在每个标签之后附加分页符,也可以在标签之前附加分页符。 这会给你一个像这样的字符串, .....................

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

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

要在新页面上呈现每个 html 字符串,

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