diff --git a/src/main/java/kz/konturai/parser/service/ReportSynthesisService.java b/src/main/java/kz/konturai/parser/service/ReportSynthesisService.java index a829159..3b6653f 100644 --- a/src/main/java/kz/konturai/parser/service/ReportSynthesisService.java +++ b/src/main/java/kz/konturai/parser/service/ReportSynthesisService.java @@ -40,7 +40,7 @@ public class ReportSynthesisService { return new ArrayList(); } String svg = ollamaAnalyticsService.generateWithInstruction(json, buildSvgPrompt(json)); - byte[] png = SvgToPngConverter.convertSvgToPng(svg); + byte[] png = SvgToPngConverter.convert(svg); List list = new ArrayList<>(); if (png != null && png.length > 0) { list.add(png); diff --git a/src/main/java/kz/konturai/parser/util/SvgToPngConverter.java b/src/main/java/kz/konturai/parser/util/SvgToPngConverter.java index 003ff5e..d53382c 100644 --- a/src/main/java/kz/konturai/parser/util/SvgToPngConverter.java +++ b/src/main/java/kz/konturai/parser/util/SvgToPngConverter.java @@ -2,40 +2,50 @@ package kz.konturai.parser.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.PNGTranscoder; + +import java.io.InputStream; + public class SvgToPngConverter { - public static byte[] convertSvgToPng(String svg) { - if (svg == null || svg.isBlank()) { + /** + * Преобразует строку с SVG-кодом в массив байт PNG-изображения. + * + * @param svgCode Строка, содержащая валидный SVG. + * @return Массив байт PNG или null в случае ошибки. + */ + public static byte[] convert(String svgCode) { + if (svgCode == null || svgCode.isBlank()) { return null; } + try { - Class pngTranscoderClass = Class.forName("org.apache.batik.transcoder.image.PNGTranscoder"); - Object transcoder = pngTranscoderClass.getDeclaredConstructor().newInstance(); + // 1. Создаем транскодер для PNG + PNGTranscoder transcoder = new PNGTranscoder(); - Class transcoderInputClass = Class.forName("org.apache.batik.transcoder.TranscoderInput"); - Class transcoderOutputClass = Class.forName("org.apache.batik.transcoder.TranscoderOutput"); + // 2. Устанавливаем входные данные (наш SVG-код) + InputStream inputStream = new ByteArrayInputStream(svgCode.getBytes(StandardCharsets.UTF_8)); + TranscoderInput input = new TranscoderInput(inputStream); - ByteArrayInputStream in = new ByteArrayInputStream(svg.getBytes(StandardCharsets.UTF_8)); - Constructor inputCtor = transcoderInputClass.getConstructor(java.io.InputStream.class); - Object input = inputCtor.newInstance(in); + // 3. Устанавливаем, куда будет записан результат (в байтовый массив в памяти) + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + TranscoderOutput output = new TranscoderOutput(outputStream); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - Constructor outputCtor = transcoderOutputClass.getConstructor(java.io.OutputStream.class); - Object output = outputCtor.newInstance(out); + // 4. Запускаем процесс конвертации + transcoder.transcode(input, output); - Method transcode = pngTranscoderClass.getMethod("transcode", transcoderInputClass, transcoderOutputClass); - transcode.invoke(transcoder, input, output); + // 5. Получаем результат + outputStream.flush(); + return outputStream.toByteArray(); - out.flush(); - return out.toByteArray(); - } catch (ClassNotFoundException e) { - return null; } catch (Exception e) { + System.err.println("Ошибка при конвертации SVG в PNG: " + e.getMessage()); + e.printStackTrace(); // Очень полезно для отладки return null; } } -} +} \ No newline at end of file