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)

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

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

сопроводительный текст http://img231.imageshack.us/img231/3610/sshot1z.png

Изображение отредактировано и распечатано с Acrobat 8

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

            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 тянул больше, чем это было, неважно, масштабирование, которое я поместил там. Таким образом, я пытался сохранить изображение, как это было первоначально, предотвращая пользователя для не загрузки изображений, больше, чем 200K и изменяя размер изображения, таким образом, я мог поддержать соотношение сторон и использование, что изменение размеров с iTextSharp Объектом изображения, прежде чем это было распечатано. Это решило мою проблему изображения, распечатанного с низким качеством для этих больших изображений, но заставило документ PDF иметь разрыв страницы или просто не поместиться в страницу, странная вещь, потому что изображение выглядит хорошим в размере, но это ведет себя как он, было больше. Это - снимок экрана нового изображения: сопроводительный текст http://img38.imageshack.us/img38/5756/sshot3tc.png

РЕДАКТИРОВАНИЕ 2:

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

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

Тусклый thisImage Как Изображение = Изображение. GetInstance (файл изображения) thisImage. Выравнивание = Изображение. 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 () делают изменение размеров ширины и высоты, уважая соотношение сторон и сохраняя в макс. ширине и макс. высоте, ограничивает.

Сообщите мне, должен ли я обеспечить больше информации.Спасибо

13
задан Sebastian 26 March 2010 в 19:30
поделиться

2 ответа

У меня также есть хороший опыт работы с 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 будет отображаться в документе pdf как 100x100. Вам не придется беспокоиться о масштабировании или изменении размера. При любом масштабировании изображения (вверх или вниз) есть риск появления артефактов алиасинга (размытости).

6
ответ дан 1 December 2019 в 23:31
поделиться

Странно. Я получаю сверхчеткие изображения в моих файлах PDF. Есть несколько различий между тем, что я делаю, и тем, что есть у вас. Например, я создаю изображение следующим образом:

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

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

instance.ScalePercent(90f);

Еще одно отличие состоит в том, что я добавляю изображение непосредственно в Документ , а не в Пункт , хотя сомневаюсь, что на этом все.

Править :

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

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

1
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: