У меня есть контроллер, который создает много изображений из pdf (pdfBox). Я сохраняю все изображения в List. И мне нужно отправлять одно изображение для каждого просмотра, когда я нажимаю кнопку. или введите значение
public class Pdf{
public byte[] PDFCREATE(){
byte[] pdf = ...;
//Code for creating pdf using Itext
return pdf;
}
}
public List<byte[]> getImage(byte[] pdf) throws Exception{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
List<byte> listImg = new List()<>;
try (final PDDocument document = PDDocument.load(file)){
PDFRenderer pdfRenderer = new PDFRenderer(document);
for (int page = 0; page < document.getNumberOfPages(); ++page)
{
BufferedImage bim = pdfRenderer.renderImage(page)
ImageIO.write(bim, "png",baos);
listImg.add(baos)
}
document.close();
} catch (IOException e){
System.err.println("Exception while trying to create pdf document - " + e);
}
return baos.toByteArray();
С видом я Почта:
public ResponseEntity<?> CreateFont(int pictureNumber ) {
PDF pdf= new PDF();
PdfToImg pdfToImg = new PdfToImg();
List<byte []> fileBytes = pdfToImg.getImage(pdf.PDFCREATE());
byte[] encoded= Base64.encodeBase64(fileBytes.get(pictureNumber ));
String encodedString = new String(encoded);
return new ResponseEntity<String>(
"<img src='data:image/jpeg;base64," + encodedString + "' alt='' width='420' height='580'>",
HttpStatus.OK);
Но здесь мне каждый раз приходится создавать pdf. Можно ли просто сохранить значения из getImage в список?. И когда пользователь вводит значение (pictureNumber) или нажимает кнопку каждый раз, чтобы не создавать новый pdf. И вместо этого принимать значения из List.И создайте новый список после обновления страницыI нужно где-то хранить Список fileBytes, а где?
Извините за мой английский
@ Andy Brown Просто эта информация нужна только перед обновлением страницы .. В db будет много мусора (
@ Энди Браун Или просто каждый раз переписывать информацию в BD?




Это может помочь вам:
private static Map<Integer, String> pictureMap = new HashMap<>();
private static PDF pdf;
public ResponseEntity<?> CreateFont(int pictureNumber) {
if (pictureMap.containsKey(pictureNumber))
return response(pictureMap.get(pictureNumber));
if (pdf == null)
pdf = new PDF();
PdfToImg pdfToImg = new PdfToImg();
List<byte[]> fileBytes = pdfToImg.getImage(pdf.PDFCREATE());
byte[] encoded = Base64.encodeBase64(fileBytes.get(pictureNumber));
String encodedString = new String(encoded);
pictureMap.put(pictureNumber, encodedString);
return response(encodedString);
}
private ResponseEntity response(String encodedString){
return new ResponseEntity<String>(
"<img src='data:image/jpeg;base64," + encodedString + "' alt='' width='420' height='580'>",
HttpStatus.OK);
}
Разве это не называется для каждого поста: PDF pdf = new PDF (); ?
@crazy_deviL в верхней части метода он проверит, вычислена ли кодированная строка ранее и сохранена ли на карте, он будет извлекать данные и не вычислять PDF pdf = new PDF(); снова
@Spara Но сначала pictureNumber не будет в Map, он будет сохранен только после того, как пользователь отправит данные. И каждый раз присылает 0.1.2 ... 100. И все это время все классы будут вызываться (
Ага PDF pdf = new PDF(); всегда одинаковый для всех номеров картинок? Вы можете сделать его статичным. Я обновлю свой ответ, чтобы рассказать об этом
@crazy_deviL, пожалуйста, проверьте мой ответ
@SparaBut Спасибо, а как обновлять статику, при перезагрузке страницы?
@crazy_deviL, почему вы хотите снова создать PDF-файл при перезагрузке страницы? Может быть, если я знаю причину, я смогу помочь тебе принять лучшее решение
@SparaBut Будет очень сложно объяснить, что я делаю). Я очень плохо говорю по-английски .. Если без описания всех деталей: 1 Пользователь вводит данные, и PDF создается на основе их данных, 2. Появляется изображение первой страницы их PDF (окно PDF)
3. Если PDF-файл содержит более одной страницы, пользователь может переключать страницы с помощью стрелок (<- ->). И поэтому написал свою проблему, из-за переключения между стрелками. 4. Когда пользователь обновляет страницу, стираются все данные (в том числе статические).
Позвольте нам продолжить обсуждение в чате.
Когда пользователь перезагружает страницу, он должен вызвать другой запрос на отдых. там можно установить pdf = null.
Делайте это правильно - используйте базу данных. MySQL бесплатен, как и MongoDB. Если вы когда-либо масштабируете более чем на один сервер, списки в памяти не будут работать, когда ваш пользователь будет перенаправлен на другой сервер. Даже если это просто игрушечное приложение для школьников, научитесь делать это правильно. Этот опыт пригодится вам на собеседовании.