- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我们尝试导出为 PDF 时,我们遇到了 Java 堆空间错误。下面是堆栈跟踪错误,
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.<init>(HashMap.java:203)
at com.lowagie.text.pdf.PdfChunk.<init>(Unknown Source)
at com.lowagie.text.pdf.PdfChunk.split(Unknown Source)
at com.lowagie.text.pdf.PdfLine.add(Unknown Source)
at com.lowagie.text.pdf.PdfCell.<init>(Unknown Source)
at com.lowagie.text.pdf.PdfTable.updateRowAdditionsInternal(Unknown Source)
at com.lowagie.text.pdf.PdfTable.<init>(Unknown Source)
at com.lowagie.text.pdf.PdfDocument.addPdfTable(Unknown Source)
at com.lowagie.text.pdf.PdfDocument.add(Unknown Source)
at com.lowagie.text.Document.add(Unknown Source)
We are using itext-1.4.4.jar to Export PDF file. There are 30 columns and around 20000 rows. Also we have tried with com.lowagie.text-2.1.7.jar, there also same issue.
Below find the configuration details,
RAM : 8GB
Heap Size : -Xms256m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=512m
下面找到将返回字节数组的示例代码片段。将表添加到文档时,我们从 itext pdf 中收到 Java 堆空间错误。
**Sample Code snippet:**
public static byte[] convertToPdf(ResultSet argResultSet,String argReportName) throws Exception {
ResultSetMetaData metaData = null;
ByteArrayOutputStream outputStream = null;
Document document = null;
byte[] byteArray = null;
try {
metaData = argResultSet.getMetaData();
int columnCount = metaData.getColumnCount();
outputStream = new ByteArrayOutputStream();
document = new Document(PageSize.A4, 25, 25, 25, 25);
PdfWriter.getInstance(document, outputStream);
document.open();
Font reportNameFont = FontFactory.getFont(FontFactory.HELVETICA, 14, Font.BOLD, Color.BLUE);
document.add(new Paragraph("Report Name: " + argReportName, reportNameFont));
// add a line break
document.add(new Paragraph(""));
Table table = new Table(columnCount);
table.setWidth(100);
table.setPadding(2);
table.setSpacing(0);
table.setCellsFitPage(true);
table.setBorder(Rectangle.NO_BORDER);
String columnNameHeader = null;
Chunk chunkHeader = null;
Cell cellHeader = null;
float[] widths = new float[columnCount];
//Preparing the column headers
for (int i = 0; i < columnCount; i++) {
columnNameHeader = metaData.getColumnLabel(i + 1);
if(CsdcUtility.isBlank(columnNameHeader, true)) {
columnNameHeader = "NoColumnName"+ i;
}
widths[i] = columnNameHeader.length();
chunkHeader = new Chunk(columnNameHeader, new Font(Font.HELVETICA, 10, Font.BOLD));
cellHeader = new Cell(chunkHeader);
cellHeader.setHorizontalAlignment(Element.ALIGN_CENTER);
cellHeader.setHeader(true);
table.addCell(cellHeader);
}
table.endHeaders();
int rowCount = 0;
int columnType;
String columnValue = "";
Chunk chunk = null;
Cell cell = null;
Log.log("Preparing the column values");
while (argResultSet.next()) {
rowCount++;
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
columnType = metaData.getColumnType(columnIndex + 1);
columnValue = "";
if(columnType == Types.BLOB || columnType == Types.CLOB || columnType == Types.LONGVARBINARY || columnType == Types.BINARY || columnType == Types.VARBINARY) {
columnValue = new String(CSDCEncodeDecodeUtility.base64Encode(ExportExcel.getAsByteArray(argResultSet.getBlob(columnIndex + 1))));
} else {
columnValue = argResultSet.getString(columnIndex + 1);
}
if(CsdcUtility.isBlank(columnValue, true)) {
columnValue = "";
}
if (widths[columnIndex] < columnValue.length()) {
widths[columnIndex] = columnValue.length();
}
chunk = new Chunk(columnValue, new Font(Font.HELVETICA, 10));
cell = new Cell(chunk);
cell.setVerticalAlignment(Element.ALIGN_TOP);
cell.setLeading(8);
table.addCell(cell);
}
}
//Table Prepared - Adding it to Document
document.add(table); // **while adding the table to the document, throwing java heap space error**
document.close();
byteArray = outputStream.toByteArray();
outputStream = null;
} catch(Exception e) {
System.out.println(e.getStackTrace());
}
finally {
if(document.isOpen()) {
document.close();
}
try{
if(argResultSet!=null){
argResultSet.close();
argResultSet=null;
}
if (outputStream != null)
{
outputStream.close();
outputStream = null;
}
}catch (Exception e) {
System.out.println(e.getStackTrace());
}
}
return byteArray;
}
最佳答案
您应该直接写入 HttpServletResponse
的输出流,而不是尝试在内存中创建字节数组。
关于java - 下载 PDF 文件时从 itext 获取 Java 堆空间错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36686965/
NHibernate version: 3.3.2. 我有一个包含多个操作的 NHibernate 事务。作为事务中的中间步骤之一,我尝试通过 Session.Save 插入一个具有自动增量 PK 的
请参阅我有一个具有多个值的 HashSet,该值可以包含例如 4141234567 、 4241234567 _0x10456790719 4141234567 _0x104567907907 和 _
我有一个 javafx 应用程序,我有一个主界面,我可以在其中设置我的舞台并启动该应用程序。我还有一个 Controller 类: public class Controller { @
我正在编写一个与 Web 服务集成的 iPhone 应用程序。我将从网络服务获取数据并用它填充表格 View 。我的问题:当用户滚动表格 View 时,我希望从 Web 服务动态加载更多数据并填充表格
我有以下结构: PreProd > Variables.tf 具有: variable "vms" { default = [ { "hostname" : "Monitor0
我下面有一个 Shiny 的应用程序,它显示绘图或表格。我对表格不感兴趣,我的问题只涉及 plotly 部分。当我使用此 javascript solution 在浏览器中打开应用程序时,我尝试下载该
我目前正在学习如何在 Java 中使用 Swing。将 JTextFields、JLabels 或 JButtons 添加到 JPanel 时,我通常用 4 行来完成,如下所示: gbc.gridx
我有一个名为 TabView 的自定义 UIView 类。每个 TabView 中都有 2 个标签以及一些其他元素。我使用界面生成器将这些标签添加到 TabView 中。在将 TabViews 作为
class A{ private List list; // getter setter public class B{ @command public void dele
当计时器达到零时,我试图从 Pane 中删除元素,更具体地说是标签和文本区域。但是,当计时器达到 0 并且我调用此方法时,我收到此异常。 Exception in thread "AWT-EventQ
使用 LINQ 时我应该从 WCF 服务返回什么?例如: var res = from q in context.cust select q; LINQ 遵循延迟执行,因此语句在运
我有一个计时器,可以在 GameScene.swift 文件中启动/重置,但是当应用程序在通话期间最小化或按下主页按钮时,它会继续运行。如何停止计时器并在应用程序再次处于事件状态时继续计时器? if
我有以下 Java 程序,但我不想在最后一个元素之后分配“,”,怎么办? String range = "400-450"; Integer startRange = null;
我正在使用 SAX 来解析一些 XML。在我的处理程序中 startElement()方法我正在尝试读取名为 xsi:type 的属性的值,例如: String type = attributes.g
我正在从事一个项目,该项目必须将数据从 Excel 文件导入和导出到数据库等。我必须从数据库获取数据,然后。但是如何根据 id、电话号码、用户名检查 excel 文件中的数据是否不重复。这是读取exc
我需要 Hook 程序的日志记录功能并获取它的日志记录参数,它使用 sqlite3_prepare_v2 -> sqlite3_bind_xxx -> sqlite3_step 函数。我想知道是否有可
您好,我正在尝试创建一个画笔,但我在使用 SelectObject 这行代码时遇到了问题: Brush_C = SelectObject(hdc_TS, hBrush); 错误是这样的: line 2
我正在尝试制作一个用户可以登录并将其用户数据保存到 mysql-db 的应用程序。我正在使用 PreferenceActivity 和 PreferenceFragment 来处理这个问题。通常这工作
我们使用自定义标签代码在 Google map 中添加带有标签的标记,还使用 MarkerCluster 库对标记进行聚类。 我们的问题是标记隐藏了,但标签仍然显示。我们需要修改http://go
我有一个包含 3 列的 CSV 文件;文本,整数,文本。当我导入这些时,所有数据都包含在双括号中。我不确定为什么。是否可以使用 COPY 在导入时删除这些内容?或者我应该导入为文本,然后使用 sele
我是一名优秀的程序员,十分优秀!