OnstartPage方法中的Stackoverflow错误

时间:2013-05-08 10:13:34

标签: java itext stack-overflow

根据我从另一个文件中读取的值,我打算为每个Start of Page都有一个不同的String。我把它放在我的onStartPage方法中就像这样:

@Override
    public void onStartPage(PdfWriter writer, Document output) {
        try {
            File finish = new File("C:/Statements final/");
            File[] finf = finish.listFiles();
            Font f1 = new Font(Font.NORMAL, 12);
            f1.setColor(Color.BLACK);            
            String firstline = "";
            for (int k = 0; k < filenames1.length; k++) {
                FileInputStream fs = new FileInputStream("C:/Statements final/" + filenames1[k]);
                BufferedReader br = new BufferedReader(new InputStreamReader(fs));
                for (int i = 0; i < 0; i++) {
                    br.readLine();
                }
                firstline = br.readLine();          

            System.out.println(firstline);

            output.add(new Paragraph(new Phrase(new Chunk(firstline, f1))));
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }

我收到此StackOverflow错误:

Exception in thread "main" java.lang.StackOverflowError
    at java.lang.String.toLowerCase(String.java:2524)
    at com.lowagie.text.pdf.PdfEncodings.convertToBytes(PdfEncodings.java:149)
    at com.lowagie.text.pdf.BaseFont.convertToBytes(BaseFont.java:795)
    at com.lowagie.text.pdf.FontDetails.convertToBytes(FontDetails.java:160)
    at com.lowagie.text.pdf.PdfContentByte.showText2(PdfContentByte.java:1386)
    at com.lowagie.text.pdf.PdfContentByte.showText(PdfContentByte.java:1396)
    at com.lowagie.text.pdf.PdfDocument.writeLineToContent(PdfDocument.java:1587)
    at com.lowagie.text.pdf.ColumnText.go(ColumnText.java:841)
    at com.lowagie.text.pdf.ColumnText.go(ColumnText.java:752)
    at com.lowagie.text.pdf.PdfPRow.writeCells(PdfPRow.java:513)
    at com.lowagie.text.pdf.PdfPTable.writeSelectedRows(PdfPTable.java:511)
    at com.lowagie.text.pdf.PdfPTable.writeSelectedRows(PdfPTable.java:587)
    at com.lowagie.text.pdf.PdfPTable.writeSelectedRows(PdfPTable.java:543)
    at com.lowagie.text.pdf.PdfDocument.newPage(PdfDocument.java:830)
    at com.lowagie.text.pdf.PdfDocument.carriageReturn(PdfDocument.java:1192)
    at com.lowagie.text.pdf.PdfDocument.add(PdfDocument.java:482)
    at estatement.Border.onStartPage(Border.java:112)

任何知道我应该做什么的人。

2 个答案:

答案 0 :(得分:5)

如果您尝试更改其中的文档内容,

onStartPage非常脆弱,参见关于无限循环的<{3}}警告的JavaDoc评论:

/**
 * Called when a page is initialized.
 * <P>
 * Note that if even if a page is not written this method is still
 * called. It is preferable to use <CODE>onEndPage</CODE> to avoid
 * infinite loops.
 *
 * @param writer the <CODE>PdfWriter</CODE> for this document
 * @param document the document
 */
public void onStartPage(PdfWriter writer, Document document);

原因是onStartPage在页面初始化期间被称为 ,但是文档的添加要求页面初始化已经完成。

因此,@ VigneshVino的提议(如果正确实施)将阻止无限循环但仍可能导致页面初始化的某些部分被执行两次。这可能是无害的(将相同的变量设置为相同的值两次似乎无害)但它也可能具有不期望的副作用(两次递增相同的变量并非无害)。特别是如果多个页面事件监听器处于活动状态,则效果可能会令人恼火。

因此,我建议您通过边距在页面顶部留出一些额外的空间,并在onEndPage中填充该空格。

PS:此外,PdfPageEvent.onStartPage第150页onStartPage()的使用还有常见问题解答

  

常见问题解答 为什么不建议在 onStartPage() 方法中添加内容?您会记得第5.2节。 4当当前页面为空时,iText忽略newPage()次调用。当您从代码中显式调用此方法时,会执行或忽略此方法,但它也会在多个场合从iText中隐式调用。空页被忽略是很重要的;否则你最终会有大量不必要的新页面无意中留空。如果您使用onStartPage()方法添加内容,则始终存在包含不需要的网页的风险。考虑保留添加内容的onEndPage()方法更安全。

答案 1 :(得分:0)

你需要在调用if时添加一些条件(例如。onStartPage(writer,output))。如果不是,那么每当onStartPage调用它时,它将递归调用。无论最大大小是什么堆栈,它会给你无限循环。导致StackOverflow错误。

如果事先有一些条件,你显然会遇到一直在评估一个真实的情况(或者导致正在进行递归调用的任何情况)。