Используя iTextSharp, чтобы добавить повторяющиеся данные в существующий PDF? - PullRequest
0 голосов
/ 07 февраля 2011

Я собираюсь использовать iTextSharp для вставки данных в PDF-файл, созданный графическим отделом.Большая часть этих данных представляет собой простое сопоставление данных с полями, но некоторые данные представляют собой список элементов, которые необходимо добавить (например, данные о продукте; пользователи могут иметь любое количество продуктов, и данные должны отображаться для всех них).

Возможно ли это сделать с помощью iTextSharp?Очевидно, что шаблон PDF не может быть создан с определенным количеством полей, так как невозможно узнать, сколько их будет полей - это может быть 1, 10 или даже 100;что мне нужно сделать, это «повторно использовать» раздел PDF и повторить этот раздел для каждого элемента в цикле.

Это выполнимо?

1 Ответ

1 голос
/ 07 февраля 2011

В прошлом мне нужно было делать нечто подобное.Мне нужно было создать PDF с неизвестным количеством изображений + контент.В моем случае 'Entry' был определен изображением и набором полей.

Что я сделал, так это то, что у меня был документ.это послужило шаблоном «Entry».Затем я сгенерировал темп.PDF-файл для каждой «записи», и сгенерированные имена файлов хранятся в списке.После того, как все «записи» были обработаны, я объединил все временные документы в формате PDF в один итоговый документ.

Вот некоторый код, чтобы дать вам лучшее представление (он не компилируется, просто служит ссылкой, как я взялнекоторые части из моего старого проекта).

        List<string> files = new List<string>(); // list of files to merge
        foreach (string pageId in pages)
        {

            // create an intermediate page
            string intermediatePdf = Path.Combine(_tempPath, System.Guid.NewGuid() + ".pdf");
            files.Add(intermediatePdf);

            string pdfTemplate = Path.Combine(_templatePath, _template);


            CreatePage(pdfTemplate, intermediatePdf, pc, pageValues, imageMap, tmd);


        }

        // merge into resulting pdf file
        string outputFolder = "~/Output/";
        if (preview)
        {
            outputFolder = "~/temp/";
        }
        string pdfResult = Path.Combine(HttpContext.Current.Server.MapPath(outputFolder), Guid.NewGuid().ToString() + ".pdf");
        PdfMerge.MergeFiles(pdfResult, files);

        //////////////////////////////////////////////////////////////////////////
        // delete temporary files...
        foreach (string fd in files)
        {
            File.Delete(fd);
        }

        return pdfResult;

Вот код для объединения шаблонов:

 public class PdfMerge
    {
        public static void MergeFiles(string destinationFile, List<string> sourceFiles)
        {
            int f = 0;
            // we create a reader for a certain document
            PdfReader reader = new PdfReader(sourceFiles[f]);
            // we retrieve the total number of pages
            int n = reader.NumberOfPages;
            // step 1: creation of a document-object
            Document document = new Document(reader.GetPageSizeWithRotation(1));
            // step 2: we create a writer that listens to the document
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(destinationFile, FileMode.Create));
            // step 3: we open the document
            document.Open();
            PdfContentByte cb = writer.DirectContent;
            PdfImportedPage page;
            int rotation;
            // step 4: we add content
            while (f < sourceFiles.Count)
            {
                int i = 0;
                while (i < n)
                {
                    i++;
                    document.SetPageSize(reader.GetPageSizeWithRotation(i));
                    document.NewPage();
                    page = writer.GetImportedPage(reader, i);
                    rotation = reader.GetPageRotation(i);
                    if (rotation == 90 || rotation == 270)
                    {
                        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
                    }
                    else
                    {
                        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                    }
                }
                f++;
                if (f < sourceFiles.Count)
                {
                    reader = new PdfReader(sourceFiles[f]);
                    // we retrieve the total number of pages
                    n = reader.NumberOfPages;
                }
            }
            // step 5: we close the document
            document.Close();
        }
    }

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

...