iTextSharp: почему при добавлении изображения на страницу PDF шрифт текста отличается? - PullRequest
0 голосов
/ 12 марта 2012

Я использую шрифт Helvetica и размер 14 px для текста. Проблема в том, что если на странице нет изображения, текст будет очень четким, но на странице, где есть хотя бы одно изображение, текст становится немного жирным. Вы можете видеть, что я имею в виду на изображениях ниже:

Without image on page * Без изображения на странице

With image on page * С изображением на странице

Правильный шрифт - тот, который показан на картинке # 1. Как сделать так, чтобы все страницы имели одинаковый шрифт, даже если страница содержит изображение или нет?

Спасибо.

Пример кода:

Document document = new Document(PageSize.LETTER);
document.SetMargins(docMargin, docMargin, docMargin, 25);
writer = PdfWriter.GetInstance(document, new FileStream(filename, FileMode.Create));
document.Open();

Font defaultFont = FontFactory.GetFont("Helvetica", 7.8, Font.NORMAL, new Color(75, 75, 75));
document.Add(new Paragraph("Lorem ipsum lorem ipsum lorem ipsum", defaultFont));
document.Add(Chunk.NEWLINE);
Image img = Image.GetInstance("my png image path");
document.Add(img);

document.Close();

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Я наконец смог воспроизвести вашу проблему.Первый PNG, который я тестировал и который не воспроизводил вашу проблему, я создал в Photoshop и использовал команду «Сохранить для Web».Второй PNG, который я протестировал и смог воспроизвести вашу проблему, я создал из MSPAINT.EXE.Я пробовал различные комбинации в Save For Web, и ни у одной из них не было такой же проблемы, как у Paint.

Согласно этой теме из официального списка рассылки iText, это похоже на цветовой профиль изображения.

Что вы видите, так этовлияние новой размещенной прозрачности в PDF, который ранее не содержал ее, когда не учитывается цветовое пространство смешивания окончательного выходного документа.

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

Одна вещь, которую они рекомендуют, - это установить следующее свойство на PdfWriter перед добавлениемчто-нибудь:

writer.RgbTransparencyBlending = true;

Когда я делаю это, я все еще вижу очень незначительный сдвиг, но не так близко, как это выражено, как без него.

0 голосов
/ 12 марта 2012

Это не ответ, мне просто нужно иметь возможность отправить код.

Я не могу воспроизвести ваши результаты, но если бы я догадался, что-то естьсделать с вашим рендером PDF.Вы можете подтвердить это, увеличив масштаб текста, выглядит ли он одинаково при увеличении?Если это так, то ваш рендерер пытается применить визуальные подсказки к печатному документу.Если нет, можете ли вы опубликовать упрощенную версию своего кода, которая делает это?Это делает это для всех изображений или только для одного конкретного?Как вы создаете свой текст, с помощью абзацев, таблиц, разбора HTML или чего-то еще?Какую версию iTextSharp вы используете?

Ниже приведен полностью работающий WinForms C # 2010 с таргетингом на iTextSharp 5.1.2.0, который создает двухстраничный PDF.На первой странице есть только текст, а на второй странице - текст, за которым следует изображение, загруженное с рабочего стола.На моем компьютере с использованием Adobe Acrobat Pro 9.1.3 я не вижу разницы в шрифтах при просмотре на экране.

using System;
using System.IO;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            string pdfFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
            string imgFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.png");

            using (FileStream fs = new FileStream(pdfFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
                using (Document doc = new Document(PageSize.LETTER)) {
                    using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
                        doc.Open();

                        BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1250, BaseFont.NOT_EMBEDDED);
                        iTextSharp.text.Font f = new iTextSharp.text.Font(bf, 14);

                        doc.NewPage();
                        doc.Add(new Paragraph("This is a test", f));

                        doc.NewPage();
                        doc.Add(new Paragraph("This is a test", f));
                        iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(imgFile);
                        img.ScaleAbsolute(100, 100);
                        doc.Add(img);


                        doc.Close();
                    }
                }
            }

            this.Close();
        }
    }
}
...