我想将文字换成图像下方(或左侧或右侧)的矩形,如下所示:
请参阅链接: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();
我的错误在哪里?
答案 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
)。