iTextsharp - размер файла PDF после вставки изображения - PullRequest
5 голосов
/ 20 августа 2010

В настоящее время я конвертирую какой-то устаревший код для создания PDF-файлов с помощью iTextSharp.Мы создаем большой файл PDF, содержащий несколько изображений, которые я вставляю примерно так:

Document doc = new Document(PageSize.A4, 50, 50, 25, 25);
PdfWriter writer = PdfWriter.GetInstance(doc, myStream);

writer.SetFullCompression();

doc.Open();

Image frontCover = iTextSharp.text.Image.GetInstance(@"C:\MyImage.png");

//Scale down from a 96 dpi image to standard itextsharp 72 dpi
frontCover.ScalePercent(75f);

frontCover.SetAbsolutePosition(0, 0);

doc.Add(frontCover);

doc.Close();

Вставка изображения (файл PNG размером 20,8 КБ), похоже, увеличивает размер файла PDF почти100 КБ.

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

Ответы [ 3 ]

8 голосов
/ 27 августа 2010

Ответ, по-видимому, заключается в том, что вам нужно установить соответствующую целевую версию спецификации PDF, а затем установить сжатие следующим образом:

PdfWriter writer = PdfWriter.GetInstance(doc, ms);
PdfContentByte contentPlacer;

writer.SetPdfVersion(PdfWriter.PDF_VERSION_1_5);

writer.CompressionLevel = PdfStream.BEST_COMPRESSION;

Это значительно уменьшило размер моего файла. Я также обнаружил, что PNG дают мне лучшие результаты в отношении окончательного размера документа.

1 голос
/ 06 июля 2011

Я провел несколько экспериментов этим утром. Мое тестовое изображение было 800x600 с размером файла 100,69 КБ при сохранении в формате PNG. Я вставил это в PDF (используя iTextSharp и обычный метод GetInstance ()), и размер файла увеличился с 301,71K до 402,63K. Затем я повторно сохранил мое тестовое изображение в виде необработанного растрового изображения с размером файла 1,440,054. Я вставил это в PDF, и размер файла уменьшился до 389,81K. Интересно!

Я провел некоторое исследование в Интернете для возможного объяснения, и, основываясь на том, что я нашел, похоже, что iTextSharp не сжимает изображения, а скорее сжимает все с помощью некоторого общего сжатия. Другими словами, BMP на самом деле не конвертируется в другой тип файла, он просто сжимается так же, как если бы вы его архивировали. Что бы они ни делали, это должно быть хорошо, поскольку оно сжимается лучше, чем изображение со сжатием PNG. Я предполагаю, что iTextSharp woudld попытается сжать PNG, но сожмет на 0%, так как он уже сжат. (Это не согласуется с наблюдениями первоначального автора, однако ... Пэдди сказал, что его размер PDF увеличился намного больше, чем размер PNG ... не уверен, что с этим делать. Я могу только проводить собственные эксперименты).

Выводы:

1) Мне не нужно добавлять какую-то необычную библиотеку в мой проект для преобразования моего (возможно, динамически созданного) изображения в PNG; на самом деле лучше оставить его без сжатия и позволить iTextSharp выполнять всю работу по сжатию.

2) Я также читал в Интернете материал о сохранении изображений в iTextSharp с определенным разрешением. Я НЕ видел эту проблему ... Я использовал метод ScalePercent (), чтобы масштабировать растровое изображение до 1%, и размер файла был таким же, и не было "потери" в пикселях растрового изображения в растровом изображении ... это подтверждает, что iTextSharp делает простое, хорошее, общее сжатие без потерь.

0 голосов
/ 22 августа 2010

Кажется, что PDF требует, чтобы png был перекодирован во что-то еще, jpeg, наиболее вероятно.

см. Здесь: http://forums.adobe.com/message/2952201

Единственное, о чем я могу думать, - это сначала преобразовать png в наименьший jpeg, включая уменьшение на 75%, а затем импортировать этот файл без масштабирования.

...