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 ответов:
У меня также есть хороший опыт работы с 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;