在java中使用jMagick时无法处理大型pdf文件(100M以上)

时间:2012-12-14 20:08:43

标签: java performance image-processing imagemagick jmagick

我正在使用jMagick for java来处理上传的文件(图像和pdf文件)。大多数图像工作正常但是当我尝试将大型多页pdf文件转换为不同大小的图像时,它会消耗大量的系统内存(对于200M pdf文件大约20G物理内存),并最终失败。我将密度设置为200,否则图像质量非常糟糕,甚至无法读取输出图像中的单词。以下是我的代码:

  ImageInfo info = new ImageInfo(inputFilePath);
  info.setDensity(200);
  MagickImage image = new MagickImage(info);
  MagickImage[] imageFrames = image.breakFrames();
  for (MagickImage frame : imageFrames) {
    ImageInfo frameInfo = new ImageInfo();
    MagickImage frameDisplay = frame;
    frameDisplay.setFileName(outputFile);
    frameDisplay.writeImage(frameInfo);
  }

我的java日志中没有错误或异常,我只是看到该进程已经死亡。我曾尝试在/usr/share/ImageMagick-6.5.4/config/中使用policy.xml来限制内存使用情况,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policymap [
<!ELEMENT policymap (policy)+>
<!ELEMENT policy (#PCDATA)>
<!ATTLIST policy domain (delegate|coder|filter|path|resource) #IMPLIED>
<!ATTLIST policy name CDATA #IMPLIED>
<!ATTLIST policy rights CDATA #IMPLIED>
<!ATTLIST policy pattern CDATA #IMPLIED>
<!ATTLIST policy value CDATA #IMPLIED>
]>

<policymap>
    <policy domain="resource" name="memory" value="256MB"/>
</policymap>

但不知怎的,它似乎没有用。我正在使用ImageMagick-6.5.4。真的很感激任何建议!

1 个答案:

答案 0 :(得分:2)

<policymap>
    <policy domain="resource" name="memory" value="256MB"/>
</policymap>

尝试将此部分更新为:

<policymap>
    <policy domain="resource" name="memory" value="1000MB"/>
</policymap>

然后再试一次。我假设当你说'JVM重启'时,你的意思是它崩溃了。可能是OutOfMemory例外。没有人可以肯定地说出你提供的信息。