Lowagie iText-内存不足异常-将表添加到文档时的Java堆空间

时间:2019-03-13 16:41:26

标签: java itext

我正在使用iText 2.1.7在Web应用程序中生成PDF报告。对于大多数报告来说,它运行良好。在将表添加到文档实例的一种特殊情况下,代码执行会挂起相当长的时间,然后在线程thread_name:java.lang.OutOfMemoryError:Java堆空间中抛出 Exception。

try {
    Document document = new Document(PageSize.A4.rotate());
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(destinationPath));
    document.addTitle("CONTINGENT PAYBILL");
    document.open();

    PdfContentByte content = writer.getDirectContent();

    Table table;
    Cell cell;
    table = new Table(8);
    table.setPadding(2);
    table.setWidths(new int[] { 12, 13, 12, 13, 12, 13, 12, 13 });
    table.setWidth(100);
    table.setCellsFitPage(true);

    StringBuilder temp = new StringBuilder();

    for (PaybillContingencyBeneficiary beneficiary : contingencyBenfList) {         
            beneficiaryName.delete(0, beneficiaryName.length());
            bankStatement = new BankAccnt();

            beneficiaryAllowanceTotal = 0d;
            beneficiaryDeductionTotal = 0d;

            // *****CONTINGENT-BENEFICIARY-DATA*****//
            if (beneficiary.getUserType().equals("V")) {
                beneficiary.setVendorData(
                        (PaybillVendor) billsService.getBeanById(PaybillVendor.class, beneficiary.getUserId()));
                beneficiaryName.append(beneficiary.getVendorData().getVendorName());
                beneficiaryName.append("\n" + beneficiary.getVendorData().getVendorAddress());
                beneficiaryName.append("\n" + beneficiary.getVendorData().getVendorGstin());

                bankStatement.setEmployeeName(beneficiary.getVendorData().getVendorName());
                bankStatement.setIfscCode(beneficiary.getVendorData().getVendorIfsc());
                bankStatement.setAccountNo(beneficiary.getVendorData().getVendorAccount());
            } else if (beneficiary.getUserType().equals("E")) {
                beneficiary.setEisData(billsService.getEmployeeDetails(beneficiary.getUserId()));
                beneficiaryName.append(beneficiary.getEisData().getFullName());
                beneficiaryName.append("\n" + beneficiary.getEisData().getGpfOrPpanNo());
                beneficiaryName.append("\n" + beneficiary.getEisData().getPanNo());

                bankStatement.setEmployeeName(beneficiary.getEisData().getFullName());
                bankStatement.setIfscCode(beneficiary.getEisData().getIfscCode());
                bankStatement.setAccountNo(beneficiary.getEisData().getAccountNo());
            }
            // *****CONTINGENT-DETAILS-LIST*****//
            beneficiary
                    .setContingencyDetails(billsService.getContingencyDetailsList(beneficiary.getBeneficiaryId()));
            if (beneficiary.getContingencyDetails() != null)
                beneficiary.setNumOfVoucher(beneficiary.getContingencyDetails().size());

            // *****CONTINGENT-BUDGET-DATA*****//
            beneficiary.setBudgetDetail(billsService.getContingentBudget(beneficiary.getBeneficiaryId()));
            if (beneficiary.getBudgetDetail() != null && beneficiary.getBudgetDetail().getDetailId() != null) {
                beneficiary.getBudgetDetail()
                        .setHeadName(billsService.getHoaName(beneficiary.getBudgetDetail().getHeadId(), true));
            }

            cell = new Cell(new Phrase(i.toString(), FontFactory.getFont(FontFactory.HELVETICA, 8)));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setRowspan(beneficiary.getNumOfVoucher());
            table.addCell(cell);

            temp.delete(0, temp.length());
            temp.append("--NA--");
            if (beneficiary.getBudgetDetail() != null && beneficiary.getBudgetDetail().getHeadName() != null
                    && !beneficiary.getBudgetDetail().getHeadName().isEmpty()) {
                try {
                    temp.delete(0, temp.length());

                    temp.append(beneficiary.getBudgetDetail().getHeadName().split("-", 6)[5]);
                    temp.delete(5, temp.length());
                } catch (ArrayIndexOutOfBoundsException e) {
                }
            }
            cell = new Cell(new Phrase(temp.toString(), FontFactory.getFont(FontFactory.HELVETICA, 8)));
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setRowspan(beneficiary.getNumOfVoucher());
            table.addCell(cell);

            temp.delete(0, temp.length());
            temp.append(beneficiaryName.toString());
            cell = new Cell(new Phrase(temp.toString(), FontFactory.getFont(FontFactory.HELVETICA, 8)));
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell.setRowspan(beneficiary.getNumOfVoucher());
            table.addCell(cell);

            for (PaybillContingencyDetails details : beneficiary.getContingencyDetails()) {
                elementAmount = 0d;
                netAmount = 0d;

                temp.delete(0, temp.length());
                temp.append(details.getInvoiceNo());
                temp.append(" dated " + sdf1.format(details.getInvoiceDate()));
                cell = new Cell(new Phrase(temp.toString(), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                temp.delete(0, temp.length());
                temp.append((details.getDetailDescription() != null) ? details.getDetailDescription() : "--NA--");
                cell = new Cell(new Phrase(temp.toString(), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getBillAmount() != null) ? details.getBillAmount() : 0d;
                beneficiaryAllowanceTotal += elementAmount;
                netAmount += elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getBillCgst() != null) ? details.getBillCgst() : 0d;
                beneficiaryDeductionTotal += elementAmount;
                deductionColTotal[0] += elementAmount;
                netAmount -= elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getBillSgst() != null) ? details.getBillSgst() : 0d;
                beneficiaryDeductionTotal += elementAmount;
                deductionColTotal[1] += elementAmount;
                netAmount -= elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getBillIgst() != null) ? details.getBillIgst() : 0d;
                beneficiaryDeductionTotal += elementAmount;
                deductionColTotal[2] += elementAmount;
                netAmount -= elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getCentralSales() != null) ? details.getCentralSales() : 0d;
                beneficiaryDeductionTotal += elementAmount;
                deductionColTotal[3] += elementAmount;
                netAmount -= elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getForestRoyalty() != null) ? details.getForestRoyalty() : 0d;
                beneficiaryDeductionTotal += elementAmount;
                deductionColTotal[4] += elementAmount;
                netAmount -= elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getIncomeTax() != null) ? details.getIncomeTax() : 0d;
                beneficiaryDeductionTotal += elementAmount;
                deductionColTotal[5] += elementAmount;
                netAmount -= elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getStateSales() != null) ? details.getStateSales() : 0d;
                beneficiaryDeductionTotal += elementAmount;
                deductionColTotal[6] += elementAmount;
                netAmount -= elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getVat() != null) ? details.getVat() : 0d;
                beneficiaryDeductionTotal += elementAmount;
                deductionColTotal[7] += elementAmount;
                netAmount -= elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                elementAmount = (details.getSecurityDeposit() != null) ? details.getSecurityDeposit() : 0d;
                beneficiaryDeductionTotal += elementAmount;
                deductionColTotal[8] += elementAmount;
                netAmount -= elementAmount;
                cell = new Cell(new Phrase(df.format(elementAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);

                netAmountTotal += netAmount;
                cell = new Cell(new Phrase(df.format(netAmount), FontFactory.getFont(FontFactory.HELVETICA, 8)));
                cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                table.addCell(cell);
            }

            allowanceTotal += beneficiaryAllowanceTotal;
            deductionTotal += beneficiaryDeductionTotal;

            beneficiary.setVoucherAmount(beneficiaryAllowanceTotal);
            beneficiary.setVoucherDeduction(beneficiaryDeductionTotal);

            bankStatement.setAmount(beneficiaryAllowanceTotal - beneficiaryDeductionTotal);
            bankStmtList.add(bankStatement);
            i++;
        }

        document.add(table);

到达document.add(table);时抛出异常

有人可以找出这里出了什么问题吗?

0 个答案:

没有答案