我使用的是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文件中添加页脚。谢谢
答案 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();
}