我需要开发类,该类应该具有一种在页面上添加文本的方法(具有不同的参数),并且该方法可以被多次调用,结果类的用户可以调用获取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封装的方法(使用打开流/动作/关闭流),但是它不能用于许多动作。