如何使用 iTextSharp 为横向生成的页面添加页脚到 PDF 文档

Posted

技术标签:

【中文标题】如何使用 iTextSharp 为横向生成的页面添加页脚到 PDF 文档【英文标题】:how to add page footer to PDF document using iTextSharp for pages generated in landscape 【发布时间】:2017-07-21 16:40:35 【问题描述】:

在我的 ASP.net MVC 应用程序中,我使用 iTextSharp 和 XSLT 作为模板来生成 PDF。页面应该是横向的。

横向模式下的PDF文档跟随。

new Document(PageSize.LETTER.Rotate(), marginLeft, marginRight, marginTop, marginBottom);

从 XSLT 我得到 html 并构建 PDF 内容如下:

public void ParseXhtmlContents(string xhtml)

    //Instantiate handler
    var elementhandler = new ElementHandler();
    //Bind a reader to text
    using (TextReader sr = new StringReader(xhtml))
    
        //Parse
        XMLWorkerHelper.GetInstance().ParseXHtml(elementhandler, sr);
    

    //Loop through each element
    foreach (var element in elementhandler.Elements)
    
        var div = element as PdfDiv;
        if (div != null)
            foreach (var table in div.Content.OfType<PdfPTable>())
            
                table.HeaderRows = 1;
            
        _iTextDocument.Add(element);
    

生成 PDF 字节后,我尝试添加页脚如下

private byte[] AddPageHeader(byte[] pdf, float marginLeft, float marginRight, float marginTop, float marginBottom)

    using (var stream = new MemoryStream())
    
        stream.Write(pdf, 0, pdf.Length);
        var reader = new PdfReader(pdf);
        var totalPage = reader.NumberOfPages;
        var pageSize = reader.GetPageSize(1);
        var document = new Document(pageSize, marginLeft, marginRight, marginTop, marginBottom);
        var writer = PdfWriter.GetInstance(document, stream);
        document.Open();
        var contentByte = writer.DirectContent;
        var pageIndex = 0;
        for (var page = 1; page <= reader.NumberOfPages; page++)
        
            document.NewPage();
            pageIndex++;
            var importedPage = writer.GetImportedPage(reader, page);
            contentByte.AddTemplate(importedPage, 0, 0);
            contentByte.BeginText();
            var baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            contentByte.SetFontAndSize(baseFont, 6);
            contentByte.ShowTextAligned(PdfContentByte.ALIGN_CENTER, "-     " + pageIndex.ToString() + "     -", 300f, 20, 0);
            contentByte.EndText();
            contentByte.SaveState();
            contentByte.SetColorStroke(new PdfSpotColor("black", new BaseColor(0, 0, 0)), 100);
            contentByte.SetLineWidth(0.25f);
            contentByte.Rectangle(20, 45, 572, 0.25f);
            contentByte.FillStroke();
            contentByte.RestoreState();
        
        startingPageNumber = pageIndex;
        document.Close();
        return stream.ToArray();
    

如果我跳过添加页码的部分,我可以横向生成 PDF,内容以正确的顺序显示,但是当我添加页脚时,我得到以下结果,呈现的页面是纵向的。

请参考附图输出:

帮我看看哪里出错了,谢谢。

【问题讨论】:

1.您创建新页面但不设置它们的页面大小。 2. 复制页面,将它们作为模板添加到其他页面,这里可能会丢失很多信息。 1 和 2 会导致“丢失”您的页面方向 由于您首先解析元素并将它们添加到 iText 文档中,因此解决此问题的更好方法是通过页面事件。看看这个示例表单 iText 的实际应用:developers.itextpdf.com/examples/itext-action-second-edition/… 【参考方案1】:

我发现了什么问题

我更改了文档创建代码如下:

var document = new Document(reader.GetPageSizeWithRotation(1), marginLeft, marginRight, marginTop, marginBottom);

并添加了类似于上面的页脚模板:

contentByte.AddTemplate(importedPage, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pageIndex).Height);

【讨论】:

你修补了一个糟糕的解决方案以某种方式工作。一个好的解决方案是改用PdfStamper @mkl 我将来一定会研究PdfStamper,但工作有点紧迫,目前无法更改实施。谢谢

以上是关于如何使用 iTextSharp 为横向生成的页面添加页脚到 PDF 文档的主要内容,如果未能解决你的问题,请参考以下文章

使用iTextSharp生成的PDF生成水印给出错误

POI组件怎样使生成的word文档横向排版

使用 itextsharp 获取 PDF 页面的缩略图

iTextSharp 表格宽度为页面的 100%

更改页面方向

使用itextsharp.dll生成PDF [关闭]