78 lines
2.7 KiB
Java
78 lines
2.7 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|