Плохое качество изображения в itext

Я использую itext7 для создания файла PDF, а в нижнем колонтитуле я пытаюсь добавить изображения PNG следующим образом:

PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
PdfPage page = documentEvent.getPage();
PdfCanvas canvas = new PdfCanvas(page);
byte[] signature = null; // retrieved from database
PngImageData imageData = (PngImageData) ImageDataFactory.createPng(signature);
canvas.addImageAt(imageData, 5f, 25f, false);

само исходное изображение имеет хорошее разрешение, но когда изображение добавляется в pdf, оно появляется с плохим качеством, хотя я добавляю изображение без каких-либо изменений или масштабирования.

как я могу улучшить качество изображения в окончательном PDF?


person Mahmoud Saleh    schedule 04.11.2020    source источник
comment
Много раз у меня возникала проблема со средством просмотра PDF, которое создавало изображение низкого качества при рендеринге полной страницы. Попробуйте увеличить масштаб в просмотрщике и проверьте, стало ли изображение лучше. Если это так, то ваша проблема не в коде.   -  person Matjaz    schedule 04.11.2020
comment
увеличение масштаба не делает изображение лучше, но копирование того же изображения из pdf в программы для рисования Windows делает его лучше!   -  person Mahmoud Saleh    schedule 04.11.2020
comment
Тогда это проблема со средством просмотра, а не в вашем коде. У меня нет проекта с itext на этом компьютере, но, если я правильно помню, я использую тот же код, что и вы.   -  person Matjaz    schedule 04.11.2020
comment
Как вы думаете, может быть, разные форматы изображений могут выглядеть лучше в itext?   -  person Mahmoud Saleh    schedule 04.11.2020


Ответы (1)


Это фрагмент моего кода для добавления изображения в PDF:

PdfContentByte cbLogo = writer.getDirectContent();

if (instanceSettings.getDocumentHeaderImageLocation() != null) {
    try {
        String encodedString = instanceSettings.getDocumentHeaderImageLocation();
        byte[] decodedBytes = Base64
                .getDecoder()
                .decode(encodedString);
        Image imgLogo = Image.getInstance(decodedBytes);
        imgLogo.scaleToFit(220f, 150f);
        imgLogo.setAbsolutePosition((writer.getPageSize().getWidth() / 4) - (imgLogo.getScaledWidth() / 2),
                writer.getPageSize().getHeight() - imgLogo.getScaledHeight() - 30);
        cbLogo.addImage(imgLogo);
    } catch (Exception e){
        ErrorHandler.handle(e);
    }
}

А вот еще:

    Image qr = Image.getInstance(file.getAbsolutePath());
    qr.scaleToFit(70f, 70f);
    qr.setSpacingBefore(0);
    qr.setSpacingAfter(0);
    qr.setPaddingTop(0);
    PdfPCell cell = new PdfPCell();
    cell.setPadding(0f);
    cell.setUseAscender(true);
    cell.setUseDescender(true);
    cell.addElement(qr);

Изображение типа:

import com.itextpdf.text.Image;

Вы можете попробовать это с этим кодом. Для меня оба работают так, как ожидалось, но, как я уже сказал в комментариях, у меня иногда возникают трудности с просмотром в приложении PDF. Насколько я знаю, itext тут ни при чем.

person Matjaz    schedule 04.11.2020