Мне нужно разработать класс, в котором должен быть метод для добавления текста на страницу (с другими параметрами), и этот метод может вызываться много раз, и в результате пользователь класса может вызывать метод для получения PDF.
Мой код:
public class PdfActions : IPdfActions, IDisposable
{
PdfReader pdfReader;
MemoryStream ms = new MemoryStream();
PdfWriter outputWriter;
Document inputDoc;
int pageCount;
public PdfActions(byte[] input)
{
pdfReader = new PdfReader(input);
pageCount = pdfReader.NumberOfPages;
// load the input document
inputDoc = new Document(pdfReader.GetPageSizeWithRotation(1));
outputWriter = PdfWriter.GetInstance(inputDoc, ms);
inputDoc.Open();
for (int i = 1; i <= pageCount; i++)
{
inputDoc.SetPageSize(pdfReader.GetPageSizeWithRotation(i));
inputDoc.NewPage();
PdfContentByte cb = outputWriter.DirectContent;
PdfImportedPage page = outputWriter.GetImportedPage(pdfReader, i);
cb.AddTemplate(page, 0, 0);
}
}
это конструктор, который "копирует" PDF в поток
Тогда мой метод добавления текста:
public void AddText(string text, BaseColor color, float x, float y, float fontSize = 12, string font = iTextSharp.text.pdf.BaseFont.HELVETICA, int alignment = 3, int activePage = 1)
{
PdfContentByte cb = outputWriter.DirectContent;
BaseFont bf = BaseFont.CreateFont(font, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.SetColorFill(color);
cb.SetFontAndSize(bf, fontSize);
// write the text in the pdf content
cb.BeginText();
// put the alignment and coordinates here
cb.ShowTextAligned(alignment, text, x, y, 0);
cb.EndText();
PdfImportedPage page = outputWriter.GetImportedPage(pdfReader, activePage);
cb.AddTemplate(page, 0, 0);
}
и метод для получения байтового массива PDF:
public byte[] GetPdfOutput()
{
inputDoc.Close();
outputWriter.Close();
return ms.ToArray();
}
Я называю это:
_pdfActions = new PdfActions(bytes);
_pdfActions.AddText("Example, Inc.", BaseColor.Black, x: 185, y: 380, fontSize: 26, font: iTextSharp.text.pdf.BaseFont.TIMES_ROMAN);
_pdfActions.AddText("My Address", BaseColor.Black, x: 185, y: 360, fontSize: 16, font: iTextSharp.text.pdf.BaseFont.TIMES_ROMAN);
var result = _pdfActions.GetPdfOutput();
Но это всегда PDF как шаблон. Что не так?
PS. У меня был реализован метод AddText как инкапсулированный (с открытым потоком / действиями / закрытым потоком), но он не работает со многими действиями.