Изменение PDF требует времени в C # - PullRequest
0 голосов
/ 31 мая 2018

Я использую iTextSharp, чтобы изменить файл PDF и добавить в него определенные данные.

Вот мой сценарий, у меня есть DataTable, который содержит тысячи строк, каждая строка представляет клиента иликлиент, и у меня есть один шаблон PDF.

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

Я использую этот код для выполнения необходимой работы, но он истекает при обработке огромного количества строк или занимает не менее 15 минут, в моем случае 4 тыс. Строк - потому что это означаетоткрываем pdf файл 4k раз и модифицируем его по мере необходимости.

// file is the pdf tmeplate, id is the customer's id - represens 1 row in the DataTable, landingPage: is client's specific page should be added to the file
private static byte[] GeneratePdfFromPdfFile(byte[] file, int id, string landingPage)
{

    try
    {
        using (var ms = new MemoryStream())
        {
            //Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF
            var doc = new iTextSharp.text.Document();
            //Create a writer that's bound to our PDF abstraction and our stream
            var writer = PdfWriter.GetInstance(doc, ms);
            //Open the document for writing
            doc.Open();
            PdfContentByte cb = writer.DirectContent;

            ////parse html code to xml 
            //iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
            PdfReader reader = new PdfReader(file);
            for (int pageNumber = 1; pageNumber < reader.NumberOfPages + 1; pageNumber++)
            {
                doc.SetPageSize(reader.GetPageSizeWithRotation(1));
                doc.NewPage();
                //Insert to Destination on the first page
                PdfImportedPage page = writer.GetImportedPage(reader, pageNumber);
                int rotation = reader.GetPageRotation(pageNumber);
                if (rotation == 90 || rotation == 270)
                {
                    cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(pageNumber).Height);
                }
                else
                {
                    cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                }
            }

            // Add a new page to the pdf file
            doc.NewPage();
            // set pdf open action to open the link embedded in the file.
            string _embeddedURL = "http://" + landingPage + "/Default.aspx?code=" + id;
            PdfAction act = new PdfAction(_embeddedURL);
            writer.SetOpenAction(act);
            doc.Close();
            return ms.ToArray();
        }
    }
    catch { return null; }
}

Примечание: я использую цикл ForEach для итерации по строкам DataTable

1 Ответ

0 голосов
/ 31 мая 2018

Ваш вопрос (текст) не соответствует вашему коду (часть C #).Вы просите одну вещь (добавить контент в существующий PDF), а делаете другую вещь (добавляете действие опции в существующий PDF), но независимо от того, что вы хотите сделать, вам не следует использовать PdfWriter длясделайте поверхностную копию каждой страницы существующего PDF (отбрасывая всю интерактивность).

Вы можете значительно сократить количество строк кода, которые вы написали, используя PdfStamper:

PdfReader reader = new PdfReader(file);
MemoryStream ms = new MemoryStream();
PdfStamper stamper = new PdfStamper(reader, ms);
string _embeddedURL = "http://" + landingPage + "/Default.aspx?code=" + id;
PdfAction act = new PdfAction(_embeddedURL);
stamper.Writer.SetOpenAction(act);
stamper.Close();
reader.Close();
return ms.ToArray();

Пожалуйста,Прочтите главу 6 моей книги, чтобы понять, почему PdfWriter не тот класс для вас.PdfStamper предназначен для манипулирования существующим документом PDF, сохраняя все его существующие функции без изменений.

Также имейте в виду, что вы используете старую версию iText.Самая последняя версия - iText 7 .Пожалуйста, обратитесь к учебнику Jump-Start для получения дополнительной информации об использовании последней версии iText.

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