Создание файла PDF с использованием itextSharp - PullRequest
2 голосов
/ 17 декабря 2010

Привет Я создаю сайт ASP.net, где некоторые статьи могут быть загружены. Мне нужно, чтобы мои пользователи могли получить его PDF версию, нажав на кнопку. Для этой функциональности я использую itextSharp. Я рассматриваю следующие два варианта. 1. Я создам файл PDF один раз (по первому запросу) и буду использовать его всегда, проверяя его наличие. 2. Я создам его на лету и удалю, как только файл PDF будет доставлен клиенту. Первый подход приведет к более быстрой доставке PDF, тогда как второй подход приведет к экономии места. Может кто-нибудь сказать, пожалуйста, какой из вариантов лучше?

Мне также интересно, возможно ли это без сохранения PDF-файла на сервере. Так может кто-нибудь ответить мне как можно скорее.

Спасибо Dipa

Ответы [ 5 ]

2 голосов
/ 20 декабря 2010

Вы можете создать PDF-файл на лету, не записывая его на диск.Вместо использования FileStream используйте MemoryString:

        'PDF Document'
        Dim document As New Document(PageSize.LETTER)
        'Use a memory string so we don't need to write to disk
        Using outputStream As New MemoryStream()
            'Associate the PDF with the stream
            Dim w = PdfWriter.GetInstance(document, outputStream)

            'Open the PDF for writing'
            document.Open()

            'Do PDF stuff Here'


            'Close the PDF'
            document.Close()
            'Clear the response buffer'
            Response.Clear()
            'Set the output type as a PDF'
            Response.ContentType = "application/pdf"
            'Disable caching'
            Response.AddHeader("Expires", "0")
            Response.AddHeader("Cache-Control", "")
            'Set the filename'
            Response.AddHeader("Content-Disposition", "attachment; filename=" & OutputFileName)
            'Set the length of the file so the browser can display an accurate progress bar'
            Response.AddHeader("Content-length", outputStream.GetBuffer().Length.ToString())
            'Write the contents of the memory stream'
            Response.OutputStream.Write(outputStream.GetBuffer(), 0, outputStream.GetBuffer().Length)
            'Close the response stream'
            Response.End()

        End Using

iTextSharp очень и очень быстр для меня.Я на общем хосте и могу создавать довольно сложные PDF-файлы из десятков страниц, не замечая никакой медлительности.

EDIT Вот код, преобразованный с использованием VB.Net в C # конвертер.Я не проверял это, и вам, возможно, придется очистить пару вещей, но это должно быть довольно просто.

Document document = new Document(PageSize.LETTER);
//Use a memory string so we don't need to write to disk
using (MemoryStream outputStream = new MemoryStream()) {
    //Associate the PDF with the stream
    dynamic w = PdfWriter.GetInstance(document, outputStream);

    //Open the PDF for writing'
    document.Open();

    //Do PDF stuff Here'


    //Close the PDF'
    document.Close();
    //Clear the response buffer'
    Response.Clear();
    //Set the output type as a PDF'
    Response.ContentType = "application/pdf";
    //Disable caching'
    Response.AddHeader("Expires", "0");
    Response.AddHeader("Cache-Control", "");
    //Set the filename'
    Response.AddHeader("Content-Disposition", "attachment; filename=" + OutputFileName);
    //Set the length of the file so the browser can display an accurate progress bar'
    Response.AddHeader("Content-length", outputStream.GetBuffer().Length.ToString());
    //Write the contents of the memory stream'
    Response.OutputStream.Write(outputStream.GetBuffer(), 0, outputStream.GetBuffer().Length);
    //Close the response stream'
    Response.End();

}

Чтобы открыть PDF в новом окне, сделайте так, чтобы ваша кнопка ссылки указывала на страницутакие как «CreatePDF.aspx».На этой странице должен быть этот код.

2 голосов
/ 17 декабря 2010

Таким образом, ваш компромисс - экономия циклов ЦП путем сохранения файла по сравнению с сохранением дискового пространства путем его постоянной генерации. Я бы порекомендовал экономить циклы ЦП, поскольку добавление дискового хранилища дешево и просто (это можно сделать, не отключая сервер). Добавление ЦП относительно дороже и обычно требует отключения сервера (зависит от вашей среды).

Вариант 1. Создание PDF-файла по первому запросу

Преимущества:

  • PDF не создается, если кто-то его не загружает, поэтому не тратится впустую ЦП на создание PDF-файлов, которые никому не нужны.
  • PDF - это файл, поэтому IIS может передавать его клиенту в виде файла, он доступен для стратегий кэширования IIS и т. Д.

Недостатки:

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

Вариант 2. Создание PDF-файла при каждом запросе

Преимущества:

  • PDF всегда обновлен до последней версии статьи.
  • Дисковое пространство сведено к минимуму.

Недостатки:

  • Высокая загрузка процессора на сервере, если многие пользователи запрашивают загрузку PDF.
  • Невозможно использовать IIS или другие стратегии кэширования веб-сервера.
0 голосов
/ 20 декабря 2010

На самом деле это полностью зависит от требований приложения. Как и в моем приложении, мне не нужно сохранять файл pdf на сервере, поэтому после доставки файла pdf на клиентскую сторону я удаляю его с сервера.Так что в вашем случае, если конкретный пользователь получит доступ к определенному файлу PDF несколько раз, то вам придется сохранить его на сервере, это сэкономит ваше время генерации PDF.

0 голосов
/ 20 декабря 2010

Если вы используете iTextSharp, создать его на лету невозможно.Таким образом, второй вариант кажется хорошим.Если вы хотите уменьшить используемое серверное пространство, вы можете запустить некоторую службу Windows, которая удалит все / менее используемые PDF-файлы с сервера.

Это может решить обе ваши проблемы, я думаю.

0 голосов
/ 20 декабря 2010

Привет, Дипа. Как сказал DarrellNoton, важно экономить циклы процессора, я тоже согласен с этим.Никто не будет долго ждать, чтобы подготовить PDF, конечный пользователь захочет его быстрее.

Я предлагаю вам создать его один раз и сохранить в БД в двоичном формате.Так что вы можете получить к нему быстрый доступ, и это займет меньше времени, чем создание нового PDF каждый раз.Или вы можете дать имя файлу PDf и сохранить имя только в БД.имя может быть путеводителем.

Надеюсь, это поможет вам.Спасибо:)

...