Добавление таблицы iTextSharp к документу в потоке памяти после использования PDFStamper - PullRequest
2 голосов
/ 03 марта 2011

Привет. Я пытаюсь добавить таблицу в pdf после того, как использую штамп.

    // CREATE MEMORY STRING 
    MemoryStream ms = new MemoryStream();

    string formFile = Server.MapPath("testImg.pdf");      

    PdfReader reader = new PdfReader(formFile);
    PdfStamper outStamper = new PdfStamper(reader, ms);
    AcroFields fields = outStamper.AcroFields;

    // UPDATE THE FORM FIELDS
    fields.SetField("Text1", "John Smith");
    fields.SetField("Text2", "1234567890");
    fields.SetField("Text3", "1234567890");

    //ADD LOGO
    iTextSharp.text.Image headerlogo = iTextSharp.text.Image.GetInstance(Server.MapPath("logo.jpg"));
    headerlogo.ScaleToFit(140, 399);
    headerlogo.Alignment = iTextSharp.text.Image.UNDERLYING;
    headerlogo.SetAbsolutePosition(200, 500);

    int pageCount = reader.NumberOfPages;
    PdfContentByte body = outStamper.GetOverContent(pageCount);

    body.AddImage(headerlogo);      

    outStamper.Close();

    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=test");
    Response.Buffer = true;
    Response.Clear();
    Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
    Response.OutputStream.Flush();
    Response.End();

Я хочу добавить документ в таблицу.

        PdfPTable table = new PdfPTable(3);
        PdfPCell cell = new PdfPCell(new Phrase("Header spanning 3 columns"));
        cell.Colspan = 3;
        cell.BorderWidth = 5;
        cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right
        table.AddCell(cell);
        table.AddCell("Col 1 Row 1");
        table.AddCell("Col 2 Row 1");
        table.AddCell("Col 3 Row 1");
        table.AddCell("Col 1 Row 2");
        table.AddCell("Col 2 Row 2");
        table.AddCell("Col 3 Row 2");
        document.Add(table);

У меня проблемы с определением документа для добавления таблицы.Пожалуйста, кто-нибудь может посоветовать, как мне добавить таблицу в PDF-файл в потоке памяти.

Любая помощь будет принята с благодарностью.

Alex

1 Ответ

1 голос
/ 03 марта 2011

Не знаю, как у вас две части работают вместе, но вот как я это сделал для своего приложения.

По сути, я отделяю штампование от добавления структурированного контента и затем объединяю результаты в один большойPDF.Вы можете попробовать сделать все это вместе за один большой шаг, используя table.WriteSelectedRows (который принимает PdfContentByte в качестве одного из аргументов), но время, которое мне приходится тратить на макеты вручную, имеет тенденцию перевешивать выгоду от того, что этовсе сделано за один шаг (кроме того факта, что он становится одним огромным методом, который трудно поддерживать / повторно использовать)

Для разъяснения и тестирования я использовал FileStream, но, конечно, то же самое прекрасно работает с MemoryStreamи повторно использовать потоки, если в итоге вы создадите одну монолитную функцию в своем коде разработки.

Вот мое тестовое приложение, которое я использовал для подтверждения кода и запуска вашего сценария:

Шаги:

  1. Создать Test2.pdf (штампованное содержимое оригинального источника) из Test.pdf (наш оригинальный источник)
  2. Создать Test3.pdf (содержащий весь наш контент, который будет добавлен в конце)
  3. Откройте Test2.pdf & Test3.pdf и объедините их в финальный поток Test4.pdf

Примечание. Я не использовал код для печати изображений, и вы можетепридется настроить using на Document в первом разделе, если PdfStamper также закрывает базовый Document (не могу вспомнить, если это происходит с моей головы, но это вызовет полезное исключение в случае, если вам нужноскорректируйте оператор using)

private static void Main(string[] args)
    {
        using (FileStream ms = new FileStream("C:\\Test2.pdf", FileMode.Create))
        using (FileStream formFile = new FileStream("C:\\Test.pdf", FileMode.Open))
        {
            PdfReader reader = new PdfReader(formFile);
            using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
            {
                //PdfStamper outStamper = new PdfStamper(reader, ms);
                //PdfContentByte body = outStamper.GetOverContent(reader.NumberOfPages);

                //document.Open(); //Open document to work with

                //AcroFields fields = outStamper.AcroFields;

                //// UPDATE THE FORM FIELDS
                //fields.SetField("Text1", "John Smith");
                //fields.SetField("Text2", "1234567890");
                //fields.SetField("Text3", "1234567890");

                ////ADD LOGO
                //iTextSharp.text.Image headerlogo = iTextSharp.text.Image.GetInstance(Server.MapPath("logo.jpg"));
                //headerlogo.ScaleToFit(140, 399);
                //headerlogo.Alignment = iTextSharp.text.Image.UNDERLYING;
                //headerlogo.SetAbsolutePosition(200, 500);

                //body.AddImage(headerlogo);

                //outStamper.Close();
            }
        }

        using (FileStream ms = new FileStream("C:\\Test3.pdf", FileMode.Create))
        using (FileStream formFile = new FileStream("C:\\Test2.pdf", FileMode.Open))
        {
            PdfReader reader = new PdfReader(formFile);
            using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
            {
                PdfWriter pdfWriter = PdfWriter.GetInstance(document, ms);
                document.Open();

                PdfPTable table = new PdfPTable(3);
                PdfPCell cell = new PdfPCell(new Phrase("Header spanning 3 columns")) { Colspan = 3, BorderWidth = 5, HorizontalAlignment = 1 };
                table.AddCell(cell);
                table.AddCell("Col 1 Row 1");
                table.AddCell("Col 2 Row 1");
                table.AddCell("Col 3 Row 1");
                table.AddCell("Col 1 Row 2");
                table.AddCell("Col 2 Row 2");
                table.AddCell("Col 3 Row 2");

                table.CompleteRow(); //Added - table won't add the final row if its cells are incomplete - safe to have it ending a table
                document.Add(table);
            }
        }

        using (FileStream ms = new FileStream("C:\\Test4.pdf", FileMode.Create))
        using (FileStream stampedfile = new FileStream("C:\\Test2.pdf", FileMode.Open))
        using (FileStream appendfile = new FileStream("C:\\Test3.pdf", FileMode.Open))
        {
            PdfReader stampedContentReader = new PdfReader(stampedfile);
            PdfReader appendContentReader = new PdfReader(appendfile);

            using (Document document = new Document(stampedContentReader.GetPageSizeWithRotation(1)))
            {
                PdfCopy pdfCopy = new PdfCopy(document, ms);

                document.Open();

                for (int i = 1; i <= stampedContentReader.NumberOfPages; i++)
                    pdfCopy.AddPage(pdfCopy.GetImportedPage(stampedContentReader, i));

                for (int i = 1; i <= appendContentReader.NumberOfPages; i++)
                    pdfCopy.AddPage(pdfCopy.GetImportedPage(appendContentReader, i));
            }
        }
    }

Надеюсь, это поможет.

...