В моем счете-фактуре мне нужно получить изображение в счете-фактуре, который хранится в базе данных 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 не распознает файл.
(1) Не соединяйте их вместе для тестирования. (2) Сначала проверьте, правильно ли полученное вами изображение. Извлеките файл изображения из базы данных (прочитайте BLOB), а затем сохраните его в каталоге, чтобы проверить, правильно ли вы видите изображение ( 3). Если оно прочитано правильно, вы можете перейти к следующему шагу. (4) Кроме того, будьте осторожны, имеет ли изображение, первоначально сохраненное в базе данных, ограниченный фиксированный формат: только .png или PNG, jpg, gif и т. д.
Вот ошибка: com.itextpdf.io.IOException: формат изображения не распознан. в com.itextpdf.io.image.ImageDataFactory.createImageInstance(ImageDataFactory.java:582) в com.itextpdf.io.image.ImageDataFactory.create(ImageDataFactory.java:82)
Хм, похоже, ImageDataFile.getImageData()
возвращает изображения в каком-то нестандартном формате. Вся загрузка изображений проходит через одно и то же распознавание формата изображения, заданного строкой пути, URL-адресом или массивом байтов. Единственным другим случаем являются изображения, загруженные как изображения awt.
(1) Вообще говоря, изображение извлекается из базы данных и архивируется следующим образом (byte[] imageBytes = resultSet.getBytes("imageFiled"); try (FileOutputStream fos = new FileOutputStream("/Downloads/xyz.jpg" )) { fos.write(imageBytes); ) Наконец, проверьте, можно ли нормально открыть файл xyz.jpg в каталоге. (2) В вашем примере кажется, что изображение, считанное из базы данных, это (imageRepos.findByName("goldencarrotImagekleinste.jpg")). Рекомендуется сохранить прочитанный образ в каталог и проверить, можно ли его нормально открыть.
ох, ох, моя вина, глупый, первый план теперь работает, потому что я забыл знак "!" войдите в цикл 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();
}
новичкиошибка хаха простите меня, ребята, спасибо
«не распознает файл». - Какую именно ошибку вы получаете?