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

C# 如何使用iTextSharp为横向生成的页面向PDF文档添加页脚,c#,asp.net,pdf,xslt,itext,C#,Asp.net,Pdf,Xslt,Itext,在我的ASP.net MVC应用程序中,我使用iTextSharp和XSLT作为模板生成PDF。页面应该是横向的 在横向模式下,通过以下方式创建PDF文档 new Document(PageSize.LETTER.Rotate(), marginLeft, marginRight, marginTop, marginBottom); 从XSLT中,我获得HTML并构建PDF内容,如下所示: public void ParseXhtmlContents(string xhtml) { /

在我的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);
    }
}
var document = new Document(reader.GetPageSizeWithRotation(1), marginLeft, marginRight, marginTop, marginBottom);
public void解析xhtml内容(字符串xhtml)
{
//实例化处理程序
var elementhandler=new elementhandler();
//将读取器绑定到文本
使用(TextReader sr=新的StringReader(xhtml))
{
//解析
XMLWorkerHelper.GetInstance().ParseXHtml(elementhandler,sr);
}
//循环遍历每个元素
foreach(elementhandler.Elements中的var元素)
{
var div=作为PdfDiv的元素;
如果(div!=null)
foreach(div.Content.OfType()中的var表)
{
表1.1-1;
}
_iTextDocument.Add(元素);
}
}
生成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();
    }
}
private byte[]AddPageHeader(byte[]pdf,float-marginLeft,float-marginRight,float-marginTop,float-marginBottom)
{
使用(var stream=new MemoryStream())
{
stream.Write(pdf,0,pdf.Length);
var阅读器=新的pdf阅读器(pdf);
var totalPage=reader.NumberOfPages;
var pageSize=reader.GetPageSize(1);
var文档=新文档(页面大小、边距左侧、边距右侧、边距顶部、边距底部);
var writer=PdfWriter.GetInstance(文档、流);
document.Open();
var contentByte=writer.DirectContent;
var pageIndex=0;

对于(var page=1;page我发现了问题所在

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

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);
    }
}
var document = new Document(reader.GetPageSizeWithRotation(1), marginLeft, marginRight, marginTop, marginBottom);
并添加了与上述类似的页脚模板:

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

1.创建新页面但不设置页面大小。2.通过将页面作为模板添加到其他页面来复制页面,此处可能会丢失大量信息。1和2会导致“丢失”页面方向。由于您首先解析元素并将其添加到iText文档中,解决此问题的更好方法是通过页面-事件。请从iText中查看此示例:您修补了一个不好的解决方案,使其能够以某种方式工作。一个好的解决方案应该使用
PdfStamper
。@mkl我将来肯定会研究
PdfStamper
,但工作有点紧迫,目前无法更改实现。谢谢