我一直在使用itextsharp SDK,我有一个包含一些数据的pdf文件,我想添加页眉或页脚文本,它会添加它,但是在页面的最后,页眉/页脚文本部分可见
请参阅示例代码:
PdfReader reader = new PdfReader("C:\Source pdf file.pdf");
string f_textPrefix = "Page No : 1";
using (MemoryStream memoryStream = new MemoryStream())
{
PdfStamper pdfStamper = new PdfStamper(reader, memoryStream);
bool flag = false;
for (int i = 1; i <= reader.NumberOfPages; i++)
{
iTextSharp.text.Rectangle pageSize = reader.GetPageSizeWithRotation(i);
PdfContentByte pdfPageContents = pdfStamper.GetOverContent(i);
pdfPageContents.BeginText();
BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD,
BaseFont.CP1252,
false);
System.Drawing.Color m_Color = new System.Drawing.Color();
pdfPageContents.SetFontAndSize(baseFont, Convert.ToInt32(p_objParam.pdfBatesDetail.FontSize));
pdfPageContents.SetRGBColorFill(m_Color.R, m_Color.G,
m_Color.B);
// this is to set the cursor tp Bottom Middle
int yPos = 0;
yPos = PDFLayout.BottomHeight;
pdfPageContents.SetTextMatrix(pageSize.Width / 2, yPos);
pdfPageContents.ShowText(f_textPrefix.Trim());
pdfPageContents.EndText();
}
pdfStamper.FormFlattening = true; // enable this if you want the PDF flattened.
pdfStamper.Close(); // Always close the stamper or you'll have a 0 byte stream.
byte []bt = btmemoryStream.ToArray();
File.WriteAllBytes("C:\new_file.pdf", bt);
}
我还附上了pdf截图的输出,请参见截图。
提前致谢。
答案 0 :(得分:1)
您已选择使用iText API的一个非常低级别的部分来绘制文本,该部分基本上代表PDF中使用的确切文本绘制说明。
这些绘图说明不使用您提供的 y 坐标作为文本的底部,而是使用基线:
字形原点所在的行是基线。
因此,如果您使用页面底部的 y 坐标进行文本绘制,则基线下方的字形部分将被截断。
为防止出现这种情况,您可以查询BaseFont
实例,了解您想要绘制的字符串中的低边界框是如何使用的
/**
* Gets the descent of a <CODE>String</CODE> in points. The descent will always be
* less than or equal to zero even if all the characters have an higher descent.
* @param text the <CODE>String</CODE> to get the descent of
* @param fontSize the size of the font
* @return the dexcent in points
*/
virtual public float GetDescentPoint(String text, float fontSize)
并从y坐标中减去该值。
或者您可以使用更高级别的API替代方案,其中一些可以让您定义一个用于绘制文本的框。
另一个问题可能是您假设页面底部位于 y 坐标0处。虽然情况经常如此,但不一定如此。因此,您可能需要考虑相关页面的裁剪框的底部。
答案 1 :(得分:1)
所以,首先,我不知道iTextSharp,我只使用过一次,我记得有同样的问题。这对我有用,也许这对你也有帮助:
我有以下扩展类:
public class ITextSharpExtension
{
//Add pagination
public class PageEventHelper : PdfPageEventHelper
{
PdfContentByte cb;
PdfTemplate template;
public override void OnOpenDocument(PdfWriter writer, Document document)
{
cb = writer.DirectContent;
template = cb.CreateTemplate(50, 50);
}
public override void OnEndPage(PdfWriter writer, Document document)
{
Font arial = FontFactory.GetFont("Arial", 10, GrayColor.GRAY);
base.OnEndPage(writer, document);
int pageN = writer.PageNumber;
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
string text = String.Format("Page {0} of ", pageN.ToString());
float len = bf.GetWidthPoint(text, 8);
iTextSharp.text.Rectangle pageSize = document.PageSize;
cb.SetRGBColorFill(100, 100, 100);
cb.BeginText();
cb.SetFontAndSize(bf, 10);
cb.SetTextMatrix(10, pageSize.GetBottom(10));
cb.ShowText(text);
cb.EndText();
cb.AddTemplate(template, 60, pageSize.GetBottom(10));
}
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
template.BeginText();
template.SetFontAndSize(bf, 10);
template.SetTextMatrix(0, 0);
template.ShowText("" + (writer.PageNumber - 1));
template.EndText();
}
}
}
此行是在底部添加边距的地方:
cb.AddTemplate(template, 60, pageSize.GetBottom(10));
具体为此部分:pageSize.GetBottom(10)
就像我说的那样,我不确定这是最好的方法,我想这比你问的要多(我猜你可以分辨出你需要它的哪一部分),但这是有用的我请你不要downvote:)