Изображение PNG испорчено в Itext7 - PullRequest
0 голосов
/ 02 апреля 2020
import static com.itextpdf.kernel.xmp.XMPUtils.decodeBase64;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;

public  void testPngImage() throws XMPException {
    String orignalImage =  https://gist.github.com/nil96/d9d54200e5329211d2d7455492716500;
    String base64Image = orignalImage.replaceFirst("data:image/png;base64,","");
    byte[] decodedBytes = decodeBase64(base64Image);
    ImageData imageData = ImageDataFactory.create(decodedBytes,true);
    imageData.getData();
}

когда я печатаю imageData.getData(), я получаю байтовый массив, содержащий только -1. В то время как ожидаемый байтовый массив png должен начинаться с {-119, 80, 78, 71}. Это происходит только для изображений PNG. Я могу успешно создавать изображения в формате JPEG. Я приложил png в gist https://gist.github.com/nil96/d9d54200e5329211d2d7455492716500

Я что-то упустил для инициализации Image или это ошибка?

Зависимость

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.0.7</version>
    <!--<version>7.1.8</version>-->
    <type>pom</type>
</dependency>

1 Ответ

0 голосов
/ 03 апреля 2020

Вы неправильно понимаете формат данных, возвращаемых imageData.getData(). Вы говорите,

ожидаемый байтовый массив png должен начинаться с {-119, 80, 78, 71};

, но imageData больше не содержит PNG, он содержит данные в формате необработанного растрового изображения PDF.

Кроме того, вы очень поверхностно проверяли данные, возвращаемые imageData.getData(), вы заявляете

, когда я печатаю imageData.getData (), я получаю байтовый массив содержит только -1

, что неверно: он действительно содержит очень много записей -1, но также некоторые другие байтовые значения:

  • 255898 раз -1
  • 12838 раз -2
  • 3126 раз -3

et c et c

И это на самом деле не очень удивительно, после все ваше изображение почти чисто белое с небольшим количеством каракулей:

the image

преобладающий белый (RGB: 255, 255, 255) и почти белый (значения RGB немного меньше 255) является причиной множества -1 (или байтов без знака: 255), '-2' / '254', -3 / 253, ... value В то время как набросок вводит несколько (беззнаковых) меньших байтов.

Я что-то упускаю для инициализации Image или это ошибка?

Прежде всего это это не ошибка iText, а именно то, что и следовало ожидать.

Вопрос в том, что вы хотите делать с теми данными изображений, которые просто предназначены для встраивания в PDF после сжатия. Поэтому обычно пользователи iText сами не вызывают getData() здесь, а вместо этого создают объект изображения iText из данных изображения и добавляют его в PDF:

ImageData data = ImageDataFactory.create(...);
Image img = new Image(data);

, а затем

Document document = ...;
document.add(img);

или

Canvas canvas = ...;
canvas.add(img);

или даже

PdfCanvas pdfCanvas = ...;
pdfCanvas.addImage(data, ...);

, и iText обрабатывает фактические данные изображения под колпаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...