使用ColumnText会导致“文档没有页面”异常

时间:2014-09-23 09:48:08

标签: itext

我想将文字换成图像下方(或左侧或右侧)的矩形,如下所示:

请参阅链接:http://upanh.in/SLk/

我使用ColumnText在我的代码中包装文本:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("application/pdf");
    try {
        // step 1
        Document document = new Document(PageSize.A4.rotate());
        // step 2
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter writer = PdfWriter.getInstance(document, baos);
        // step 3
        document.open();
        // step 4
        ColumnText column = new ColumnText(writer.getDirectContent());
        column.setSimpleColumn(new Phrase("text is very long ..."), 10, 10, 20, 20, 18, Element.ALIGN_CENTER);
        column.go();

        // step 5
        document.close();
        ServletOutputStream os = response.getOutputStream();
        baos.writeTo(os);
        os.flush();
        os.close();
    } catch (DocumentException e) {
        throw new IOException(e.getMessage());
    }
}

结果:

  

ExceptionConverter:java.io.IOException:文档没有页面。

您对如何解决这个问题有什么建议吗?

问题2

我尝试用下面的代码在rect中显示文本(中间和中间),但它没有成功。文本只是矩形的中心。

ColumnText column = new ColumnText(writer.getDirectContent());
column.setSimpleColumn(RectImg1[0], RectImg1[1], RectImg1[0] + squareHeight, RectImg1[1] + squareHeight
                        * 1 / 4);
Paragraph p = new Paragraph(imgr.getText(), fontH);
p.setAlignment(Element.ALIGN_CENTER | Element.ALIGN_MIDDLE);
p.setLeading(18);
column.addElement(p);
column.go();

我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

我已经编辑了你的问题的标题,因为它有误导性:你遇到的例外情况也会发生在一个独立的应用程序中。你在Servlet中使用代码的事实是无关紧要的。

我看到你有以下一行:

column.go();

你没有使用这样的东西:

int status = column.go();

如果你这样做了,如果你检查过status,你会注意到column对象仍然包含一些文字。

什么文字? 全部文字。

这一行存在严重错误:

column.setSimpleColumn(new Phrase("text is very long ..."), 10, 10, 20, 20, 18, Element.ALIGN_CENTER);

您正尝试将文本"text is very long ..."添加到具有以下坐标的矩形中:

float llx = 10;
float lly = 10;
float urx = 20;
float ury = 20;

您没有定义字体,因此字体为Helvetica,字体大小为12pt,您定义了18pt的前导。

这意味着您正在尝试将12pt高的文本与额外的6pt相匹配,以便进入一个尺寸为10乘10 pt的正方形。当然你明白这不起作用!

因此,没有任何内容添加到PDF而不是显示空白页面,iText会抛出一个异常说:没有页面! 您没有向文档中添加任何内容!

您可以解决此问题,例如将错误的行更改为以下内容:

column.setSimpleColumn(new Phrase("text is very long ..."), 36, 36, 559, 806, 18, Element.ALIGN_CENTER);

另一种选择是:

column.setSimpleColumn(rect);
column.addElement(paragraph);

在这两行中rect是一个Rectangle对象。前导和对齐将在Paragraph对象的级别定义(在这种情况下,您不使用Phrase)。