我需要将超过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这样的工具会更好吗?
感谢您的见解。