iTextSharp добавить много текста в PDF - PullRequest
0 голосов
/ 27 апреля 2019

Мне нужно разработать класс, в котором должен быть метод для добавления текста на страницу (с другими параметрами), и этот метод может вызываться много раз, и в результате пользователь класса может вызывать метод для получения 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 как инкапсулированный (с открытым потоком / действиями / закрытым потоком), но он не работает со многими действиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...