Я использую PDFBox для создания PDF-файлов, однако, когда я пытаюсь нарисовать изображение, которое я получаю из массива байтов, которые я получаю следующую ошибку:Недостаточно данных для изображения (PDF-файл поколение)
Insufficient data for an image
Это основная структура моего кода:
public ByteArrayOutputStream generatePDF() {
.. Variable Declaration
// Creating Document
document = new PDDocument();
// Creating Pages
for(int i = 0; i < arrayVar.length; i++) {
// Adding page to document
page = new PDPage();
// Creating FONT Attributes
fontNormal = PDType1Font.HELVETICA;
fontBold = PDType1Font.HELVETICA_BOLD;
// Building Front & Back Invoice Images
singleImageMap = // Getting Map With Array Of Bytes from Web Service Call;
if(singleImageMap != null && !singleImageMap.isEmpty()) {
arrayFront = Utils.readImage((byte[]) singleImageMap.get(Constants.WS_IMAGE_FRONT));
arrayBack = Utils.readImage((byte[]) singleImageMap.get(Constants.WS_IMAGE_BACK));
fileFront = new ByteArrayInputStream(arrayFront);
fileBack = new ByteArrayInputStream(arrayBack);
bufferedImageFront = ImageIO.read(fileFront);
bufferedImageBack = ImageIO.read(fileBack);
rescaledFrontImg = Scalr.resize(bufferedImageFront, 500);
rescaledBackImg = Scalr.resize(bufferedImageBack, 500);
front = new PDJpeg(document, rescaledFrontImg);
back = new PDJpeg(document, rescaledBackImg);
}
// Next we start a new content stream which will "hold" the to be created content.
contentStream = new PDPageContentStream(document, page);
// Let's define the content stream
contentStream.beginText();
contentStream.setFont(fontNormal, 8);
contentStream.moveTextPositionByAmount(200, 740);
contentStream.drawString("NAME: " + arrayVar[i].getParameter(Constants.NAME));
contentStream.endText();
if(front != null && back != null) {
contentStream.drawImage(front, 55, 500);
contentStream.drawImage(back, 55, 260);
}
// Add Page
document.addPage(page);
// Let's close the content stream
contentStream.close();
}
// Let's create OutputStream object
output = new ByteArrayOutputStream();
// Finally Let's save the PDF
document.save(output);
document.close();
return output;
}
Since I receive a PNG file from the Web Service I do the conversion to JPG with the following method:
public static byte[] readImage(byte[] file) throws Exception {
ImageInputStream is = ImageIO.createImageInputStream(new ByteArrayInputStream(file));
BufferedImage originalImage = ImageIO.read(is);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(originalImage, "jpg", baos);
byte[] imageInByte = baos.toByteArray();
return imageInByte;
}
в ре г ссылку:
Это указывает на то, что ошибка происходит потому, что объект PDJepg должен быть создан до создания contentStream, но это то, что я в моем коде.
Я не уверен, есть ли проблема со структурой моего кода или что, возможно, есть ошибка в том, как я обрабатываю байты изображений, которые получаю от вызова веб-службы.
У кого-нибудь есть идея, что может быть проблемой?
UPDATE
Я сделал то, что Цельтер Ади да и образ, который я получаю от веб-службы является действительным, так как я был в состоянии генерировать физический файл с ним, так что проблема должна быть где-то около манипуляции с изображением, дело в том, что я не знаю, чего мне не хватает.
Ok. Я сделал это, и я подтвердил, что получаю правильный массив байтов, так как мне удалось создать изображения в физической папке. Итак, теперь, когда я уверен, что проблема связана не с ответом на вызов веб-службы, я не уверен, где лежит проблема, я не знаю, не может ли PDFBox обрабатывать файл. –