В iTextSharp мы можем установить вертикальное положение pdfwriter? - PullRequest
4 голосов
/ 21 мая 2010

Я недавно начал использовать 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);

Итак, есть ли способ установить положение автора вручную? Спасибо!

Ответы [ 2 ]

4 голосов
/ 21 мая 2010

Хорошо, я думаю, что ответ немного очевиден, но я искал конкретный метод. Для вертикального положения нет установщика, но вы легко можете использовать комбинацию writer.GetVerticalPosition () и para.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 голос
/ 21 мая 2010

Помимо 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();
...