将大量小PDF文件转换为PNG

时间:2016-08-17 18:52:20

标签: java windows multithreading pdf imagemagick

我需要将超过500k的pdf文件转换为png(具有足够的密度)tpo能够稍后处理它(读取嵌入在pdf中的QR码)。文件通常不超过200kb

我尝试使用magick转换它(首先使用转换然后mogrify),但是认为它需要几天才能完成并且认为可能用线程做得更好。所以我在java中实现了一个小应用程序,它创建了n个线程并在windows shell中执行(Runtime.getRuntime(。。exec())一个带有文件和目标的构建命令以及所有这些。

问题是它杀了我的电脑。显然magick使用多线程来处理每个图像,并且由于其中一些是由我所做的脚本拍摄的,因此需要更长时间并且需要jvm通常不需要的资源。这是我的代码:

public class SuperPdfToPngConverter {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    System.out.println("Setting Up Environment...");

    System.out.println("Reading existing files...");

    // To change according to our needs
    String targetFolder = "D:\\Digest";

    // Execution parameters


    ArrayList<String> myList = getTodoList(targetFolder);
    ArrayList<String> rejected = new ArrayList<String>();
    System.out.println("I've found " + myList.size() + " documents pending to be converted.");

    System.out.println(" Treating files... ");
    int count = 1;

    ExecutorService executor = Executors.newFixedThreadPool(16);

    for (String fileId : myList) {

        System.out.println("Queueing file " + count + ", " + fileId);

        Runnable worker = new WorkerThread(fileId, targetFolder, true, 150);
        executor.execute(worker);

        //rejected.add(fileId);
        count++;
    }

    executor.shutdown();
    while (!executor.isTerminated()) {
    }

    System.out.println("Finished");
    System.out.println(
            "Treated " + (count - 1) + " documents; ");

}

每个线程的工作部分都是这样的:

 @Override
public void run() {
    System.out.println(Thread.currentThread().getName()+" Start. File = "+ fileName);
    processCommand();
    System.out.println(Thread.currentThread().getName()+" End.");
}

private void processCommand() {

    String fileNamePng = fileName.replace(".pdf", ".png");


    String cmd = "magick convert -density " + density + "x" + density + " " + fileName + " " + fileNamePng;
    System.out.println(cmd);


    try {
        Runtime.getRuntime().exec(cmd, null, new File(targetPath));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Document " +  fileName + " processed.");        
}

我想知道我能做些什么来让这次跑步更快更稳定。我不关心需要多长时间(只要合理)。

你认为我的做法好吗?如果我使用库而不是像magick这样的工具会更好吗?

感谢您的见解。

0 个答案:

没有答案