gpt4 book ai didi

java - pdf 合并期间出现 OutOfMemoryError

转载 作者:行者123 更新时间:2023-11-29 04:01:58 25 4
gpt4 key购买 nike

以下代码合并 pdf 文件并返回合并后的 pdf 数据。当此代码运行时,我尝试将 100 个文件与每个大约 500kb 的文件组合,我在 document.close(); 行出现内存不足错误。此代码在 web 环境中运行,webspehere 服务器可用的内存是否有问题?我在一篇文章中读到使用 freeReader 方法,但我不知道如何在我的场景中使用它。

protected ByteArrayOutputStream joinPDFs(List<InputStream> pdfStreams,
boolean paginate) {

Document document = new Document();

ByteArrayOutputStream mergedPdfStream = new ByteArrayOutputStream();

try {
//List<InputStream> pdfs = pdfStreams;
List<PdfReader> readers = new ArrayList<PdfReader>();
int totalPages = 0;
//Iterator<InputStream> iteratorPDFs = pdfs.iterator();
Iterator<InputStream> iteratorPDFs = pdfStreams.iterator();

// Create Readers for the pdfs.
while (iteratorPDFs.hasNext()) {
InputStream pdf = iteratorPDFs.next();
if (pdf == null)
continue;
PdfReader pdfReader = new PdfReader(pdf);
readers.add(pdfReader);
totalPages += pdfReader.getNumberOfPages();
}

//clear this
pdfStreams = null;

//WeakReference ref = new WeakReference(pdfs);
//ref.clear();

// Create a writer for the outputstream
PdfWriter writer = PdfWriter.getInstance(document, mergedPdfStream);
writer.setFullCompression();

document.open();
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,
BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
PdfContentByte cb = writer.getDirectContent(); // Holds the PDF
// data

PdfImportedPage page;
int currentPageNumber = 0;
int pageOfCurrentReaderPDF = 0;
Iterator<PdfReader> iteratorPDFReader = readers.iterator();

// Loop through the PDF files and add to the output.
while (iteratorPDFReader.hasNext()) {
PdfReader pdfReader = iteratorPDFReader.next();

// Create a new page in the target for each source page.
while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
pageOfCurrentReaderPDF++;
document.setPageSize(pdfReader
.getPageSizeWithRotation(pageOfCurrentReaderPDF));
document.newPage();
// pageOfCurrentReaderPDF++;
currentPageNumber++;
page = writer.getImportedPage(pdfReader,
pageOfCurrentReaderPDF);
cb.addTemplate(page, 0, 0);

// Code for pagination.
if (paginate) {
cb.beginText();
cb.setFontAndSize(bf, 9);
cb.showTextAligned(PdfContentByte.ALIGN_CENTER, ""
+ currentPageNumber + " of " + totalPages, 520,
5, 0);
cb.endText();
}
}
pageOfCurrentReaderPDF = 0;
System.out.println("now the size is: "+pdfReader.getFileLength());
}
mergedPdfStream.flush();
document.close();
mergedPdfStream.close();
return mergedPdfStream;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document.isOpen())
document.close();
try {
if (mergedPdfStream != null)
mergedPdfStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
return mergedPdfStream;
}

谢谢V

最佳答案

此代码将所有 PDF 合并到内存(堆)中的一个数组中,所以是的,内存使用量将随着合并的文件数量线性增长。

我不知道 freeReader 方法,但也许您可以尝试将合并的 PDF 写入临时文件而不是字节数组? mergedPdfStream 将是 FileOutputStream 而不是 ByteArrayOutputStream。然后你返回例如对客户端代码的 File 引用。

或者您可以增加 Java 可以使用的内存量(-Xmx JVM 参数),但是如果要合并的文件数量最终增加,您会发现自己遇到了同样的问题。

关于java - pdf 合并期间出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2880851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com