Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Itext 使用ColumnText会导致出现“;文件没有页数”;例外_Itext - Fatal编程技术网

Itext 使用ColumnText会导致出现“;文件没有页数”;例外

Itext 使用ColumnText会导致出现“;文件没有页数”;例外,itext,Itext,我想将文本包装在图像下方(或左侧或右侧)的矩形中,如下所示: 请参阅链接: 我在代码中使用ColumnText包装文本: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/pdf"); try { // st

我想将文本包装在图像下方(或左侧或右侧)的矩形中,如下所示:

请参阅链接:

我在代码中使用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

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

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();

我的错误在哪里?

我编辑了您问题的标题,因为它具有误导性:您遇到的异常也将发生在独立应用程序中。在Servlet中使用代码这一事实与此无关

我看到你有以下几行:

column.go();
您没有使用这样的内容:

int status = column.go();
column.setSimpleColumn(new Phrase("text is very long ..."), 36, 36, 559, 806, 18, Element.ALIGN_CENTER);
如果您这样做了,并且检查了
状态
,您会注意到
对象仍然包含一些文本

什么文本?所有文本

这一行有一个严重错误:

column.setSimpleColumn(new Phrase("text is very long ..."), 10, 10, 20, 20, 18, Element.ALIGN_CENTER);
您正在尝试将文本
“文本很长…”
添加到具有以下坐标的矩形中:

float llx = 10;
float lly = 10;
float urx = 20;
float ury = 20;
您没有定义字体,因此字体为Helvetica,字体大小为12pt,您定义的前导为18pt

这意味着您正试图将12磅高的文本与额外6磅的前导匹配到一个10×10磅的正方形中。你当然明白这是行不通的

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

例如,您可以通过将不正确的行更改为以下内容来解决此问题:

int status = column.go();
column.setSimpleColumn(new Phrase("text is very long ..."), 36, 36, 559, 806, 18, Element.ALIGN_CENTER);
另一种选择是:

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

在这两行中,
rect
是一个
Rectangle
对象。前导和对齐将在
段落
对象级别定义(在本例中,您不使用
短语
)。

这非常有用。谢谢布鲁诺·洛瓦吉!!但是,我想将文本包装到一个rect中,然后如何操作?使用坐标
llx
lly
urx
ury
定义rect
ll
表示左下角
ur
表示右上角。这两个角定义了矩形。我还用另一种方法更新了我的问题。我还在google.com上搜索,并在链接“”中找到了这个主题。但文本在矩形中不居中,如示例图像:“”。你能给我一些建议吗?是的,你必须结合垂直居中文本的例子和水平居中文本的代码。我想水平居中和垂直居中的区别让我们困惑;-):(如果我使用VerticalText如下:VerticalText vt=new VerticalText(writer.getDirectContent());vt.setVerticalLayout(marginLeft+squareHeight,1191.0f-marginTop,squareHeight,3,20);vt.setAlignment(Element.ALIGN_CENTER);段落p=新段落(imgr.getText(),fontV);p.setLeading(10);vt.addText(p);vt.go();文本向右对齐。如何在垂直文本中显示文本中心?