iTextSharp рендерит изображение с низким качеством в формате PDF


Я использую iTextSharp для печати PDF-документа. Все идет хорошо, пока я не должен напечатать логотип компании в нем.

Сначала я заметил, что логотип был низкого качества, но после тестирования с несколькими изображениями, я понимаю, что это был iTextSharp рендеринга его плохо. Тест, который я сделал, чтобы сказать это, состоял в том, чтобы распечатать PDF с помощью моего кода, а затем отредактировать документ с помощью Acrobat 8.0, и я нарисовал изображение. Затем распечатал оба документа и увидел заметную разницу. Мой вопрос в том, что если кто-то знайте, может ли это быть связано с проблемой масштабирования, когда я не могу сказать iTextSharp, как он должен визуализировать изображение,или это ограничение iTextSharp.

Код для визуализации изображения выглядит следующим образом:

            Dim para As Paragraph = New Paragraph
            para.Alignment = Image.RIGHT_ALIGN
            para.Add(text)

            Dim imageFile As String = String.Format("{0}{1}", GetAppSetting("UploadDirectory"), myCompany.LogoUrl)

            Dim thisImage As Image = Image.GetInstance(imageFile)
            thisImage.Alignment = Image.LEFT_ALIGN

            para.Add(thisImage)

Печатными изображениями являются следующие:: alt текст http://img710.imageshack.us/img710/4199/sshot2y.png

Изображение, напечатанное непосредственно с помощью iTextSharp

Alt текст http://img231.imageshack.us/img231/3610/sshot1z.png

Изображение отредактировано и печатается с помощью Acrobat 8

Править: Эти изображения логотипа загружаются со страницы загрузки, где пользователь загружает любое изображение логотипа, которое он хочет, и я масштабировал это изображение, используя следующий код:

            Dim graph As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(newImage)

            graph.CompositingMode = Drawing.Drawing2D.CompositingMode.SourceOver
            graph.CompositingQuality = Drawing.Drawing2D.CompositingQuality.HighQuality
            graph.InterpolationMode = Drawing.Drawing2D.InterpolationMode.Bicubic
            graph.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
            graph.PixelOffsetMode = Drawing.Drawing2D.PixelOffsetMode.HighQuality

            graph.DrawImage(newImage, 0, 0, newWidth, newHeight)

            graph.Dispose()
            graph = Nothing
Это приводило к потере информации из исходного изображения, поэтому при печати в pdf эта потеря информации была очень заметна, потому что каким-то образом iTextSharp рисовал больше, чем было, независимо от масштаба, который я туда вставил. Поэтому я попытался сохранить изображение таким, каким оно было изначально, предотвращение загрузки пользователем изображений размером более 200 К и изменение размера изображения, чтобы я мог сохранить соотношение сторон, и использование этого изменения размера с объектом iTextSharp Image перед его печатью. Это решило мою проблему с изображением, напечатанным с плохим качеством для этих больших изображений, но заставило pdf-документ иметь разрыв страницы или просто не вписываться в страницу, странная вещь, потому что изображение выглядит хорошим размером, но ведет себя так, как будто оно было больше. Это снимок экрана нового изображение: alt текст http://img38.imageshack.us/img38/5756/sshot3tc.png

Править 2:

При проверке изображения iTextSharp, отправленного на печать, оно не показывает никаких изменений после масштабирования с помощью ScaleAbsolute, поэтому страница разрывается. Но показано правильно, вроде изображение успешно масштабировалось, а вот фон "бумажный" не был. До сих пор использовался следующий код:

                Dim imageFile As String = String.Format("{0}{1}", GetAppSetting("UploadDirectory"), myCompany.LogoUrl)

Затемните это изображение как образ = изображение.GetInstance(imageFile) это изображение.Выравнивание = Изображение.LEFT_ALIGN

            Dim newWidth As Integer = myCompany.LogoWidth
            Dim newHeight As Integer = myCompany.LogoHeight
            ResizeImageToMaxValues(newWidth, newHeight)
            thisImage.ScaleAbsolute(newWidth, newHeight)

            para.Add(thisImage)

            pdf.PdfDocument.Add(para)

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

Пожалуйста, дайте мне знать, если мне понадобится дополнительная информация. СПАСИБО
8 11

8 ответов:

У меня также есть хороший опыт работы с iTextSharp рендеринга очень резкие и четкие изображения. Я попытался как добавить изображение непосредственно в документ, так и сначала добавить его в абзац. Оба дают очень четкие результаты.

Dim document As Document = New Document(pSize, 20, 20, 20, 20)
PdfWriter.GetInstance(document, New FileStream(myPath & "Test.pdf", FileMode.Create))
document.Open()

Dim png As Image = Image.GetInstance(myPath & "myImageFile.png")
document.Add(png)

Dim pgr As New Paragraph
pgr.Add(png)
document.Add(pgr)
document.Close()

Я обычно использую .png-изображения, но у меня был такой же успех с jpeg, gif и т. д.

Уверены ли вы, что когда вы получаете изображение в iTextSharp, это точное то же самое изображение, которое вы получаете, когда находитесь в Acrobat? Я спрашиваю, потому что это непонятно. что именно происходит в вашем коде:

Dim imageFile As String=String.Format(.....

EDIT

Кроме того, чтобы убедиться, что изображение отображается в том размере, который вы ожидаете, сохраните изображения на 72dpi. 72 dpi-это то, что iTextSharp использует для всего (изображения, поля и т. д..). Таким образом, изображение 100px x 100px будет отображаться как 100x100 в вашем pdf-документе. Тогда вам не придется беспокоиться о масштабировании или изменении размера. Каждый раз, когда вы масштабируете изображение (вверх или вниз), вы рискуете ввести артефакты сглаживания (размытость).

Помимо проблемы с принтером (см. выше), Совет 3 X от вашего друга был окончательным решением.

Итак, перефразируя, если вы хотите, чтобы изображение было 100 X 100 в PDF, то убедитесь, что ваше изображение 300px X 300px или больше.

Я стараюсь также использовать изображения 300dpi, и я не тестировал с изображениями более низкого качества.

Это мой образ, добавляющий код:

try
{
    string uri = Environment.CurrentDirectory + "/" + "pdfwithimage_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
    string strImgJpg = Environment.CurrentDirectory + "/HeaderImage.jpg";

    Image imgJpg = Image.GetInstance(System.Drawing.Image.FromFile(strImgJpg), new BaseColor(System.Drawing.Color.White));

    using (Document pdf = new Document(PageSize.A4, 20, 20, 20, 20))
    {
        if (pdf == null)
        {
            throw new NullReferenceException("PDF has not been instanciated");
        }

        if (File.Exists(uri))
        {
            File.Delete(uri);
        }

        using (PdfWriter pdfwriter = PdfWriter.GetInstance(pdf, new FileStream(uri, FileMode.Create)))
        {
            pdf.Open();

            imgJpg.SetDpi(300, 300);

            imgJpg.ScaleToFit(100f, 100f);

            pdf.Add(imgJpg);

            pdf.Close();
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
    Console.ReadLine();
}

Чтобы сделать рендеринг четким, попробуйте сделать изображение в 3 раза больше исходного изображения, затем вы можете применить ScalePercent или ScaleToFit для изменения размера до определенного размера.

Пример:

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);

Это странно. Я получаю супер-четкие изображения в моих pdf-файлах. Есть небольшая разница между тем, что я делаю, и тем, что есть у тебя. Например, я создаю такой образ:

Image instance = Image.GetInstance(System.Drawing.Image.FromFile(pathToImage), Color.WHITE);

Кроме того, поскольку мой образ слишком велик, чтобы поместиться, я называю:

instance.ScalePercent(90f);
Другое отличие состоит в том, что я добавляю изображение непосредственно к Document, а не к Paragraph, хотя я сомневаюсь, что это так.

Edit:

И, наконец, мои изображения-это jpeg.

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

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

Пример уменьшения размера до 7 процентов (высокое качество):

var logo = Image.GetInstance(RImages.logo_600_icon, BaseColor.WHITE);
logo.ScalePercent(7);
var cell = new PdfPCell(logo);
cell.Border = 0;
table.AddCell(cell);

С моей стороны это оказалось настройкой принтера!

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

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

Мы используем RICOH Aficio MP C2050 PCL 6.

Используйте большие png изображения и чем с iTextSharp измените размер.

logoImage.ScalePercent(24f);

Я столкнулся с той же проблемой. Я смог исправить это, отключив сжатие. Мои pdf-файлы, которые я генерирую, не очень большие, поэтому размер файла не был слишком дорогим.

var writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, stream);
writer.SetPdfVersion(iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_7);
writer.CompressionLevel = PdfStream.NO_COMPRESSION;