4

基本的に、itext を使用して tiff ファイルを pdf に変換しようとしていますが、これはかなり単純です。しかし、私が見ることができるTiffImage.getTiffImageのは、より大きなファイルの実行に多くの時間がかかっていることです。

私の要件は、マルチスレッドソリューションを使用FutureTaskして提供することです。ExecutorServiceこれが私の現在のコードです:

import java.util.concurrent.Callable;

import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.RandomAccessFileOrArray;
import com.itextpdf.text.pdf.codec.TiffImage;

public class ProcessTiffImage implements Callable<Image>{

    RandomAccessFileOrArray tiffFile;
    int pageNo;

    public ProcessTiffImage(RandomAccessFileOrArray tiffFile, int pageNo){
        this.tiffFile = tiffFile;
        this.pageNo = pageNo;
    }

    public Image call() throws Exception {
        Image image = TiffImage.getTiffImage(tiffFile, pageNo);

        return image;

    }

}

そして変換方法は

public boolean convert(Document document) {

        int numOfThreads = Runtime.getRuntime().availableProcessors()  ;
        ExecutorService service = Executors.newFixedThreadPool(numOfThreads );
        List<FutureTask<Image>> taskList = new ArrayList<FutureTask<Image>>();
        List<Image> imageList = new ArrayList<Image>();

        for (int page = 1; page <= numOfPages; page++) {
            FutureTask<Image> futureTask = new FutureTask<Image>(new ProcessTiffImage(tiffFile, page));
            taskList.add(futureTask);
            service.execute(futureTask);
        }

        try {
            // Wait until all results are available
            for (FutureTask<Image> future : taskList) {

                imageList.add(future.get());
            }

        } catch (InterruptedException ex) {
            ex.printStackTrace();
        } catch (ExecutionException ex) {
            ex.printStackTrace();
        }

        service.shutdown();


        boolean success = generatePdf(document, imageList);
        return success;
    }

しかし、私はで取得してNullPointerExceptionfuture.get()ます。問題は、実行が TiffImage.getTiffImage(tiffFile, pageNo) の終了を待っていないことです。したがって、イメージ リストを作成できません。どんな助けでも大歓迎です。

スタックトレース

java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:188)
    at com.app.convertor.TiffParser.convert(TiffParser.java:107)
    at com.app.start.TiffToPdf.main(TiffToPdf.java:40)
Caused by: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
    at com.itextpdf.text.pdf.codec.TIFFDirectory.getFieldAsLong(TIFFDirectory.java:467)
    at com.itextpdf.text.pdf.codec.TIFFDirectory.getFieldAsLong(TIFFDirectory.java:477)
    at com.itextpdf.text.pdf.codec.TiffImage.getTiffImage(TiffImage.java:124)
    at com.itextpdf.text.pdf.codec.TiffImage.getTiffImage(TiffImage.java:106)
    at com.app.processor.ProcessTiffImage.call(ProcessTiffImage.java:20)
    at com.app.processor.ProcessTiffImage.call(ProcessTiffImage.java:1)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
4

2 に答える 2

3

自分で作成せずFuture、遺言執行者に作成を依頼してください (例: を送信しますCallable) 。

List<Future<Image>> taskList = new ArrayList<Future<Image>>();

 for (int page = 1; page <= numOfPages; page++) {
     Future<Image> futureTask = service.submit(new ProcessTiffImage(tiffFile, page));
     taskList.add(futureTask);
 }

for (Future<Image> future : taskList) {
   imageList.add(future.get());
}

注:代わりにExecutorCompletionServiceの使用を検討してください。

于 2015-10-20T11:47:57.017 に答える
1

RandomAccessFileOrArray スレッドセーフではないため、これが発生しているようです。

呼び出しで取得しているfuture.get()例外は、呼び出しの基になる例外であり、TiffImage.getTiffImage()そのメソッドが渡された TIFF データに満足していないために発生しているようです。特に、いくつかの分野を開拓しようとしていますが、そこにはないようです。おそらく画像の高さまたは幅?

しかし、それRandomAccessFileOrArrayは複数のスレッドで消費されているために発生しています。1 つのスレッドがファイル内のポインターを移動するたびに、他のスレッドが行っていることを台無しにします。

RandomAccessFileOrArray.createView()各スレッドに渡すファイルの新しいビューを取得するために使用する必要があります。

Image image = TiffImage.getTiffImage(tiffFile.createView(), pageNo);
于 2015-10-20T12:08:40.607 に答える