无法在itextsharp中为某些pdf添加页脚

时间:2018-03-08 03:43:36

标签: c# itext

我使用的是itextsharp。我可以添加页脚到一些pdf,但有些我不能。这是我的代码:

byte[] bytes = File.ReadAllBytes(PPTpath);
Font blackFont = FontFactory.GetFont("Arial", 12, Font.NORMAL, BaseColor.BLACK);
using (MemoryStream stream = new MemoryStream())
{
    PdfReader reader = new PdfReader(bytes);
    using (stamper = new PdfStamper(reader, stream))
    {
        //stamper.FormFlattening = true;
        int pages = reader.NumberOfPages;
        for (int i = 1; i <= pages; i++)
        {
            //ColumnText.ShowTextAligned(stamper.GetUnderContent(i), Element.ALIGN_RIGHT, new Phrase("Generated ECAB", blackFont), 568f, 15f, 0);
            ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_RIGHT, new Phrase("Generated ECAB", blackFont), 568f, 15f, 0);
        }
    }
    bytes = stream.ToArray();
    stamper.Close();
}
File.WriteAllBytes(PPTpath, bytes);

这是我尝试添加页脚https://dl.ubnt.com/datasheets/airfiber/airFiber_DS.pdf的pdf链接。有人可以解释为什么我无法在这个pdf文件中添加页脚。谢谢

1 个答案:

答案 0 :(得分:2)

正如评论中已经提到的,有问题的代码可以与共享PDF一起使用,唯一的区别是我为结果使用了不同的文件,并且我声明了变量stamper。因此,可能不允许OP覆盖有问题的文件。

话虽如此,代码中确实存在一个问题,有时可能会或可能不会引起问题:

假设坐标系

OP在绘制页脚时使用固定坐标:

ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_RIGHT,
    new Phrase("Generated ECAB", blackFont), 568f, 15f, 0);

只要页面的宽度类似于LETTER或A4,就可以正常工作,但对于较小的纸张格式,字符串可能会被截断。

此外,这些坐标假设坐标系的原点位于可见页面的左下角。虽然情况经常如此,但并非如此。每个页面都可以定义其底层内容画布的可见窗口。

关于这两个潜在问题,您可以通过根据页面裁剪框值计算坐标来抵消:

Rectangle cropBox = reader.GetCropBox(i);
ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_RIGHT,
    new Phrase("Generated ECAB", blackFont), cropBox.GetRight(44f), cropBox.GetBottom(15f), 0);

这会使文本的锚点位于右侧纸张边框左侧44个单位,下方边框上方15个单位。

此外,还有一个小小的怪异:

使用块

后关闭压模

OP定义stamper之外的using并在此后关闭。

首先,已经在using块的末尾,stamper自动关闭,因此此后再次关闭它最多只是一个无操作。因此,OP应该删除Close调用。

此外,尚不清楚OP在哪里宣称stamper变量。如果他是将它定义为类成员,如果从多个线程使用该类,则可能会遇到问题;由于stamper是在using的开头创建的,并且位于using块的末尾,我建议在using中声明它,即:

using (MemoryStream stream = new MemoryStream())
{
    PdfReader reader = new PdfReader(bytes);
    using (PdfStamper stamper = new PdfStamper(reader, stream))
    {
        //stamper.FormFlattening = true;
        int pages = reader.NumberOfPages;
        for (int i = 1; i <= pages; i++)
        {
            Rectangle cropBox = reader.GetCropBox(i);
            ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_RIGHT,
                new Phrase("Generated ECAB", blackFont), cropBox.GetRight(44f), cropBox.GetBottom(15f), 0);
        }
    }
    bytes = stream.ToArray();
}