Как получить изображение из базы данных в <Image> в itext7?

В моем счете-фактуре мне нужно получить изображение в счете-фактуре, который хранится в базе данных postgres в виде байта []

поскольку я изменил этот ввод изображения с локального пути, жестко закодированного в методе, на объект ImageDataFile в базе данных, у меня возникли проблемы с распознаванием файла itext7.

 try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            PdfWriter writer = new PdfWriter(outputStream);

            PdfDocument pdfDocument = new PdfDocument(writer);
            pdfDocument.setDefaultPageSize(PageSize.A4);
            Document document = new Document(pdfDocument);

            float twocol1 = 280f;
            float[] twocolwidth1 = {twocol1, twocol1};
            float twocol = 200f;
            float[] twoColumnWidth = {twocol, twocol};


            ImageDataFile imageDataFileTopPage = imageRepos.findByName("goldencarrotImagekleinste.jpg")
                                .orElseThrow(() -> new ResourceNotFoundException("image                       not found")); 

            ImageData imageTopPageData = ImageDataFactory.create(imageDataFileTopPage.getImageData());

            Image imageTopPage = new Image(imageTopPageData);
   

как переменная byte[] она также не работала, потому что imageDataFactory.create из itext7 не распознает файл.

«не распознает файл». - Какую именно ошибку вы получаете?

mkl 21.05.2024 07:22

(1) Не соединяйте их вместе для тестирования. (2) Сначала проверьте, правильно ли полученное вами изображение. Извлеките файл изображения из базы данных (прочитайте BLOB), а затем сохраните его в каталоге, чтобы проверить, правильно ли вы видите изображение ( 3). Если оно прочитано правильно, вы можете перейти к следующему шагу. (4) Кроме того, будьте осторожны, имеет ли изображение, первоначально сохраненное в базе данных, ограниченный фиксированный формат: только .png или PNG, jpg, gif и т. д.

life888888 21.05.2024 09:10

Вот ошибка: com.itextpdf.io.IOException: формат изображения не распознан. в com.itextpdf.io.image.ImageDataFactory.createImageInstance(I‌​mageDataFactory.java‌​:582) в com.itextpdf.io.image.ImageDataFactory.create(ImageDataFacto‌​ry.java:82)

mjCode 21.05.2024 12:12

Хм, похоже, ImageDataFile.getImageData() возвращает изображения в каком-то нестандартном формате. Вся загрузка изображений проходит через одно и то же распознавание формата изображения, заданного строкой пути, URL-адресом или массивом байтов. Единственным другим случаем являются изображения, загруженные как изображения awt.

mkl 21.05.2024 15:35

(1) Вообще говоря, изображение извлекается из базы данных и архивируется следующим образом (byte[] imageBytes = resultSet.getBytes("imageFiled"); try (FileOutputStream fos = new FileOutputStream("/Downloads/xyz.jpg" )) { fos.write(imageBytes); ) Наконец, проверьте, можно ли нормально открыть файл xyz.jpg в каталоге. (2) В вашем примере кажется, что изображение, считанное из базы данных, это (imageRepos.findByName("goldencarrotImagekleinste.jpg")). Рекомендуется сохранить прочитанный образ в каталог и проверить, можно ли его нормально открыть.

life888888 22.05.2024 02:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ох, ох, моя вина, глупый, первый план теперь работает, потому что я забыл знак "!" войдите в цикл while imageUtils.decompress. это объясняет, почему byte[] не был распознан, он был сжат....``

byte[] imageTopPageBytes = imageService.getImage("goldencarrotImagekleinste.jpg");
        ImageData imageTopPageData = ImageDataFactory.create(imageTopPageBytes);
        Image imageTopPage = new Image(imageTopPageData);


ImageService{

    public byte[] getImage(String name){

     ImageDataFile imageData = imageRepos.findByName(name).orElseThrow(() ->
                new ResourceNotFoundException("Image not found"));

     return ImageUtil.decompressImage(imageData.getImageData());
    }
}




ImageUtils{

    public static byte[] decompressImage(byte[] data) {
        Inflater inflater = new Inflater();
        inflater.setInput(data);

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);

        byte[] tmp = new byte[4 * 1024];
        try {
            while (inflater.finished()) {   // <-- must be (!inflater.fisished())
                int count = inflater.inflate(tmp);
                outputStream.write(tmp, 0, count);
            }
            outputStream.close();
        } catch (DataFormatException | IOException e) {
            throw new RuntimeException(e);
        }
        return outputStream.toByteArray();
    }

новичкиошибка хаха простите меня, ребята, спасибо

Другие вопросы по теме