我正在尝试在Spring Boot Rest项目中完成以下要求:
给定n个tiff图像,请在最短的时间内将其转换为PDF。
最大文件大小:200 MB
到目前为止,我的解决方案:
解决方案1::创建n个线程来渲染PDF并将其保存。 花费时间: 6分钟。 缺点:使用的CPU很多,接近90-95%。
解决方案2::依次执行创建一个PDF的操作 花费时间::13分钟。 缺点:渲染200 MB的tiff图像所花费的时间很多。
以下是实现多线程的解决方案2 代码:
/*
* Converts a mimetype to a pdf format and saves in the output location
*/
public void PDFConvert(String fileName, String dirName, String mimeType, boolean lastProcessed) {
ExecutorService executor = Executors.newFixedThreadPool(30);
Runnable worker = new MyRunnable(fileName, dirName, mimeType, rootDir);
Future<?> f = executor.submit(worker);
futures.add(f);
// Check if all runnables are done (non-blocking)
if (lastProcessed) {
for(Future<?> future : futures)
try {
future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
boolean allDone;
for(Future<?> future : futures){
allDone &= future.isDone(); // check if future is done
}
}
}
public static class MyRunnable implements Runnable {
private String fileName;
private String dirName;
private String mimeType;
private String rootDir;
MyRunnable(String fileName, String dirName, String mimeType, String rootDir) {
this.fileName = fileName;
this.dirName = dirName;
this.mimeType = mimeType;
this.rootDir = rootDir;
}
@Override
public void run() {
String fileToSave = getOutputDir(dirName, rootDir) + fileName.replaceAll(mimeType, DownloadConstants.FILE_EXTENSION);
boolean status = true;
PDDocument doc = new PDDocument();
try (SeekableStream seekableStream = new FileSeekableStream(new File(getOutputDir(dirName, rootDir) + fileName))) {
// Gain seekable access to the file
ImageDecoder imageDecoder = ImageCodec.createImageDecoder(mimeType, seekableStream, (TIFFDecodeParam) null);
for (int i = 0; i < imageDecoder.getNumPages(); i++) {
RenderedImage renderedImage = imageDecoder.decodeAsRenderedImage(i);
doc.setAllSecurityToBeRemoved(true);
PDPage page = new PDPage();
doc.addPage(page);
try (PDPageContentStream contentStream = new PDPageContentStream(doc, page)) {
PDImageXObject image = LosslessFactory.createFromImage(doc, convertRenderedImage(renderedImage));
contentStream.drawImage(image, 1, 1, 600, 750);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
doc.save(fileToSave);
doc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//From a Service class, the following code invokes the threads
for (int i=0; i<tiffConvertList.size(); i++) {
convertToPDF(fileName, dirName, mimeType, lastProcessed)
}
问题: 1)我应该使用解决方案2并在生产中创建更多CPU吗?这会改变文件转换的更好运行时间吗?
2)我应该限制文件大小并告知这是一个瓶颈。也许为大于50MB的文件创建另一个Rest端点?
任何更好的解决方案都会受到赞赏,渲染时间是关键因素。
谢谢