package ru.ulstu.paper.service; import org.springframework.stereotype.Service; import ru.ulstu.file.service.FileService; import ru.ulstu.paper.model.PaperDto; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.nio.file.Files; @Service public class LatexService { private final String pdfLatexError = "Errors occurred while executing pdfLaTeX."; private final String bibtexError = "Errors occurred while executing bibtex."; private String errorMessage; private File pdfFile; private FileService fileService; public LatexService(FileService fileService) { this.fileService = fileService; } public byte[] generatePdfFromLatexFile(PaperDto paper) throws IOException, InterruptedException { fileService.createLatexAttachs(paper); File tex = fileService.createLatexFile(paper); if (!generate(paper.getTitle(), tex.getParentFile())) { throw new IOException(errorMessage); } return Files.readAllBytes(pdfFile.toPath()); } private int startProcess(String[] args, File dir, String message) throws IOException, InterruptedException { ProcessBuilder processBuilder = new ProcessBuilder(args); processBuilder.redirectErrorStream(true); processBuilder.directory(dir); Process process = processBuilder.start(); InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream()); try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { String line = bufferedReader.readLine(); while (line != null) { line = bufferedReader.readLine(); } } int exitCode = process.waitFor(); if (exitCode != 0) { errorMessage = message + " Exit value of the process: " + exitCode; } return exitCode; } private boolean generate(String filename, File dir) throws IOException, InterruptedException { startProcess(new String[]{"pdflatex", filename, "--interaction=nonstopmode"}, dir, pdfLatexError); startProcess(new String[]{"bibtex", filename}, dir, bibtexError); if (startProcess(new String[]{"pdflatex", filename, "--interaction=nonstopmode"}, dir, pdfLatexError) != 0) { return false; } return checkPdf(filename, dir); } private boolean checkPdf(String filename, File dir) { pdfFile = new File(dir.getAbsolutePath() + File.separator + filename + ".pdf"); if (pdfFile.isFile()) { return true; } else { errorMessage = "The pdf file could not be created."; return false; } } }