Apache pdfbox将TIFF转换为PDF-多线程还是顺序方法?

时间:2018-07-30 15:01:56

标签: java multithreading optimization pdfbox executorservice

我正在尝试在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端点?

任何更好的解决方案都会受到赞赏,渲染时间是关键因素。

谢谢

0 个答案:

没有答案