【问题标题】:Stackoverflow error in OnstartPage methodOnstartPage 方法中的 Stackoverflow 错误
【发布时间】:2013-05-08 10:13:33
【问题描述】:

我打算根据我从另一个文件中读取的值,为每个页首设置不同的字符串。我已将它放在我的 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)

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

【问题讨论】:

  • “Statements final”文件夹的大小是多少?
  • 还有什么是“for (int i = 0; i
  • 如果我理解正确,您是在将我们软件的过时版本引入弗吉尼亚商业银行的软件中?弗吉尼亚商业银行是否知道您正在这样做?为什么不使用最新版本的 iText? lowagie.com/itext2
  • @BrunoLowagie 那个弗吉尼亚是什么 不,我不知道那是什么。请指教。
  • 请参阅stackoverflow.com/posts/16438048/revisions 和对 VCB 银行对账单的参考。您正在为一家银行工作,并且您正在引入一个非常旧的 iText 版本,该版本被认为已过时。

标签: java itext stack-overflow


【解决方案1】:

onStartPage 如果您尝试更改其中的文档内容,则非常脆弱,参见。 PdfPageEvent.onStartPage 的 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:此外,iText in Action — 2nd Edition 的第 150 页上还有一个关于使用 onStartPage()FAQ

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

【讨论】:

    【解决方案2】:

    您需要在对onStartPage(writer,output) 的调用中添加一些条件(例如if)。如果不是,那么每次onStartPage 调用它都会递归调用。无论堆栈的最大大小如何,它都会给出你是无限循环。这会导致StackOverflow 错误。

    如果事先有一些条件,你显然会陷入一种情况,即它一直在评估为真(或导致进行递归调用的任何东西)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      相关资源
      最近更新 更多