Mit iText: java.lang.OutOfMemoryError: Requested array size exceeds VM limit

Ich'vew wurden mit iText 4.2.1 und java 1.6 zum generieren von PDF-Dateien. Meine Aufgabe ist es, fügen Sie zwei Felder mit einigen zufälligen Inhalt einer pdf-Vorlage. Es funktioniert auch mit einem 1 GB großen PDF-Datei. Aber jetzt sind die Umwelt-Anforderungen von java 7 und ich mit diesem Out of memory-problem.
I ' V aktualisiert die iText zu 5.5.3, aber immer noch das gleiche Problem.
Der code ist trivial:

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();
        }
    }
}

Dieser gibt die folgende stack dump wird bei Verwendung einer 1 GB großen pdf-Datei :

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)

Dieser wird von einem groovy-Skript mit diesem basic-code:

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."

Jemand eine Idee, wie man diese zu arbeiten?

haben Sie versucht, erhöhen Sie die JVM-heap-Größe? viralpatel.net/blogs/...
Gut, natürlich habe ich versucht, die Erhöhung Xmx und MaxHeapSize noch ein wenig, aber immer noch das gleiche problem. Ich bin jetzt mit -Xms=8192m -Xmx16g -XX:MaxPermSize=8192m. Und wie ich bereits erwähnt, mit jdk1.6 alles läuft gut.
PdfStamper stamper = new PdfStamper(ReadInputPDF, out, true); im Anhängen-Modus. Aber ich bezweifle. Scheint ein Daten-Fehler. Versuchen Sie einen anderen PDF-Datei, schreiben Sie die PDF-Datei in eine temp-Datei, und verwenden Sie diese neue temp-PDF.
Die genaue JRE verwenden Sie? Ich fühle mich wie fast an etwas zu denken über einige memory-handling Fehler in einigen JRE update.
Ich habe versucht, sowohl die 1.7.0_40 und 1.7.0_51 mit dem gleichen Ergebnis.

InformationsquelleAutor Bo Öberg | 2014-10-08

Schreibe einen Kommentar