我最近开始使用iTextSharp从数据生成PDF报告。它工作得非常好。
在一个特定的报告中,我需要一个部分始终显示在页面底部。我正在使用PdfContentByte从底部创建一个虚线200f:
cb.MoveTo(0f, 200f);
cb.SetLineDash(8, 4, 0);
cb.LineTo(doc.PageSize.Width, 200f);
cb.Stroke();
现在我想在该行下面插入内容。但是,(正如预期的那样)PdfContentByte方法不会改变PdfWriter的垂直位置。例如,新段落出现在页面的前面。
// appears wherever my last content was, NOT below the dashed line
doc.Add(new Paragraph("test", _myFont));
有没有办法指示pdfwriter我想立即将垂直位置推到虚线下方,并继续在那里插入内容?有一个 GetVerticalPosition()方法 - 如果有相应的Setter会很好: - )。
// Gives me the vertical position, but I can't change it
var pos = writer.GetVerticalPosition(false);
那么,有没有办法手动设置作者的位置?谢谢!
答案 0 :(得分:4)
好吧,我猜答案有点明显,但我一直在寻找一种特定的方法。垂直位置没有设置器,但您可以轻松地使用writer.GetVerticalPosition()和paragraph.SpacingBefore的组合来实现此结果。
我的解决方案:
cb.MoveTo(0f, 225f);
cb.SetLineDash(8, 4, 0);
cb.LineTo(doc.PageSize.Width, 225f);
cb.Stroke();
var pos = writer.GetVerticalPosition(false);
var p = new Paragraph("test", _myFont) { SpacingBefore = pos - 225f };
doc.add(p);
答案 1 :(得分:1)
除了SpacingBefore之外,通常的做法是使用PdfContentByte
而不是直接向Document
// we create a writer that listens to the document
// and directs a PDF-stream to a file
PdfWriter writer = PdfWriter.getInstance(document, new FileStream("Chap1002.pdf", FileMode.Create));
document.Open();
// we grab the ContentByte and do some stuff with it
PdfContentByte cb = writer.DirectContent;
// we tell the ContentByte we're ready to draw text
cb.beginText();
// we draw some text on a certain position
cb.setTextMatrix(100, 400);
cb.showText("Text at position 100,400.");
// we tell the contentByte, we've finished drawing text
cb.endText();