java - 使用 iText : java. lang.OutOfMemoryError:请求的数组大小超出 VM 限制

标签 java pdf out-of-memory itext

我一直在使用 iText 4.2.1 和 java 1.6 生成 PDF 文件。我的任务是使用模板 pdf 添加两个具有一些随机内容的字段。即使是 1GB 的大 PDF,它也能正常工作。但是现在环境需要 java 7,我遇到了内存不足的问题。 我已经将 iText 升级到 5.5.3,但仍然是同样的问题。 代码很简单:

public final class PdfHelper
{
    public static void randomizePDFStream(InputStream in, OutputStream out)
    {
        try
        {
            PdfReader ReadInputPDF;
            ReadInputPDF = new PdfReader(in);
-> crash            PdfStamper stamper = new PdfStamper(ReadInputPDF, out);
            HashMap<String, String> hMap = ReadInputPDF.getInfo();
            hMap.put("Title", "RANDOM PDF TITLE: " + System.nanoTime() + ", " + System.currentTimeMillis());
            hMap.put("Subject", "RANDOM PDF SUBJECT: " + System.currentTimeMillis() + ", " + System.nanoTime());
            stamper.setMoreInfo(hMap);
            stamper.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

当使用 1GB 的大 pdf 文件时,这会给出以下堆栈转储:

Caught: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
        at java_util_concurrent_Future$get.call(Unknown Source)
        at Main.awaitCompletion(Main.groovy:222)
        at Main$awaitCompletion.callCurrent(Unknown Source)
        at Main.run(Main.groovy:113)
Caused by: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
        at com.itextpdf.text.io.StreamUtil.inputStreamToArray(StreamUtil.java:74)
        at com.itextpdf.text.io.RandomAccessSourceFactory.createSource(RandomAccessSourceFactory.java:146)
        at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:351)
        at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:371)
        at PdfHelper.randomizePDFStream(PdfHelper.java:65)

这是从具有以下基本代码的 groovy 脚本调用的:

mPDFFiles[i] = new java.io.File(getTempDirectory(), String.format("temp_file_%s_%s.pdf", System.nanoTime(), i));
mPDFFiles[i].createNewFile();

input = new BufferedInputStream(new FileInputStream(mTemplateFiles[i]));
output = new BufferedOutputStream(new FileOutputStream(mPDFFiles[i]));

long start=System.currentTimeMillis();
PdfHelper.randomizePDFStream(input, output);
output.flush();
println "Conversion time: " + (System.currentTimeMillis()-start) + " ms."

有人知道如何让它工作吗?

最佳答案

您可以使用命令行参数来增加 Java 可用的内存量。这是我使用的命令行参数的示例 - 您应该根据需要和系统内存容量更改适当的数字:

Xms256m -Xmx1024m -XX:+DisableExplicitGC -Dcom.sun.management.jmxremote
-XX:PermSize=256m -XX:MaxPermSize=512m

关于java - 使用 iText : java. lang.OutOfMemoryError:请求的数组大小超出 VM 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256061/

相关文章:

java - 返回 ?扩展类型

php - 无法使用 TCPDF 从 MySQL 查询生成 PDF

java - XML 字符 <Unicode : 0xc> was found in the element content of the document

将图像加载到recyclerview时Android picasso内存不足

C - 为包含字符串的表动态分配内存

java - 无法在 NetBeans 中构建我的项目,我正在使用 Glassfish Server。每次运行时都会出现错误,模块尚未部署

java - 使用itext库在pdf文档中添加内联图像

java - 使用 Mapbox Android SDK 绘制圆形红色标记

javascript - 如何在 Adob​​e-JS 自定义对话框中使用多个“确定”按钮?

c# - 'System.OutOfMemoryException' : Error creating window handle