我尝试使用JOD Converter将文档(.docx / .xlsx / .pptx)转换为PDF。我在Centos 7上使用OpenOffice 4.1.2。我的问题是,在我转换文件时,我的CPU使用率一直保持在100%,这会影响整个机器的性能。我在命令行选项中尝试了所有可能的选项,但遗憾的是,还没有能够缓解此问题。我在很多论坛上搜索过,发现很多其他人也面临着同样的问题,但是,没有解决方案。通过我的阅读,我意识到这可能是因为OpenOffice中的内存泄漏问题。有人可以帮我解决或至少减轻这个问题吗?
以下是我用来生成OpenOffice实例的命令。
/opt/openoffice4/program/soffice.bin -accept=socket,host=127.0.0.1,port=8016;urp; -env:UserInstallation=file:///tmp/.jodconverter_socket_host-127.0.0.1_port-8016 -headless -nocrashreport -nodefault -nofirststartwizard -nolockcheck -nologo -norestore
我用来转换文件的代码如下: package org.samples.docxconverters.jodconverter.pdf;
import java.io.File;
import org.apache.commons.io.FilenameUtils;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;
public class Word2PdfJod {
public static void main(String[] args) {
// 1) Start LibreOffice in headless mode.
OfficeManager officeManager = null;
try {
officeManager = new DefaultOfficeManagerConfiguration()
.setOfficeHome(new File("/Applications/OpenOffice.app/Contents/")).buildOfficeManager();
officeManager.start();
// 2) Create JODConverter converter
OfficeDocumentConverter converter = new OfficeDocumentConverter(
officeManager);
// 3) Create PDF
createPDF(converter);
} finally {
// 4) Stop OpenOffice in headless mode.
if (officeManager != null) {
officeManager.stop();
}
}
}
private static void createPDF(OfficeDocumentConverter converter) {
try {
long start = System.currentTimeMillis();
String src_file = "/Users/Aman/Documents/WindowsData/DocumentConversionPoc/Powerpoint2Pdf/JODConverterV3/Sample_pptx_files/AdeemSample2.pptx";
System.out.println(src_file.substring(0, src_file.lastIndexOf(".")) + "_" + FilenameUtils.getExtension(src_file) );
//Actual Conversion
converter.convert( new File(src_file), new File( src_file.substring(0, src_file.lastIndexOf(".")) + "_"
+ FilenameUtils.getExtension(src_file) +"_Jod.pdf") );
System.out.println("Time Taken in conversion - "+ (System.currentTimeMillis() - start) + "ms");
} catch (Throwable e) {
e.printStackTrace();
}
}
}
相关的罐子可以从以下地址下载: https://drive.google.com/file/d/0B4hS5IGxGOh9OE5Ca0RlbTdVclU/view?usp=sharing
答案 0 :(得分:4)
如果CPU空闲,默认情况下进程将占用100%的CPU时间。这是正常的。如果这导致执行其他流程(极不可能)的阻碍,您可以使用nice <your command>
设置优先级。
cpulimit
或者,您可以安装unsigned int const _COMPRESSION_LEVEL = 9;
,这会使您的程序在达到预定义的CPU使用率时休眠。阅读它here。
答案 1 :(得分:0)
通过减少应用程序可以使用的核心数量,可以防止系统被锁定:
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)2;