我正在使用itText在HttpServlet中生成PDF文件。在画布上添加文本。如果我打开网址,PDF会正确显示文字。此外,如果我从浏览器中打印出来,则可以在打印的纸张上看到该文本。如果我下载PDF,另一方面,文本不再显示(图像仍然是)。可在此处查看PDF:http://www.vegantastic.de/pdfTest
我的代码如下所示:
Document document = new Document();
// step 2
ByteArrayOutputStream baos = new ByteArrayOutputStream();
private PdfWriter writer = PdfWriter.getInstance(document, baos);
// step 3
document.open();
Font helvetica = new Font(FontFamily.TIMES_ROMAN, 12);
BaseFont bf_helv = helvetica.getCalculatedBaseFont(false);
PdfContentByte canvas = writer.getDirectContentUnder();
canvas.setFontAndSize(bf_helv, 12);
canvas.showTextAligned(Element.ALIGN_LEFT, "Test TEXT - Why is it missing after download?", 100, 800,0);
document.close();
// setting some response headers
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
// setting the content type
response.setContentType("application/pdf");
// the contentlength
response.setContentLength(baos.size());
// write ByteArrayOutputStream to the ServletOutputStream
OutputStream os = response.getOutputStream();
baos.writeTo(os);
os.flush();
os.close();
对于那个或这个某种错误,有没有合理的解释?有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
您没有正确添加文字。您正在创建的PDF包含严重的语法错误。一些PDF查看器将忽略此语法错误并显示文本(这可能是您可以从浏览器打印PDF的原因);其他人不会显示任何内容,因为您正在显示文本 文本对象。
在绝对位置添加文本有多种方法。一种方法是自己创建一个文本对象:
canvas.beginText();
canvas.setFontAndSize(bf_helv, 12);
canvas.showTextAligned(Element.ALIGN_LEFT, "Test TEXT - Why is it missing after download?", 100, 800,0);
canvas.endText();
在这种情况下,您需要手动开始并结束文本对象。你的代码中缺少这个。
另一种方法是让iText创建文本对象:
ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT,
new Phrase("Test TEXT - Why is it missing after download?", new Font(bf_helv, 12)),
100, 800,0);
这一行相当于上面四行。
重要提示:
您正在使用此canvas
:
PdfContentByte canvas = writer.getDirectContentUnder();
但是:如果您的文档包含不透明元素(图像,彩色矩形......),那么您添加的任何文本都将被这些不透明元素覆盖。你确定你不想要:
PdfContentByte canvas = writer.getDirectContent();
答案 1 :(得分:1)
试试这个
PdfContentByte canvas = writer.getDirectContentUnder();
canvas.saveState();
canvas.beginText();
canvas.setFontAndSize(bf_helv, 12);
canvas.showTextAligned(Element.ALIGN_LEFT, "Test TEXT - Why is it missing after download?", 100, 800,0);
canvas.endText();
canvas.restoreState();