由iText生成的PDF - >将PDF保存到本地驱动器后文本丢失

时间:2015-05-25 09:16:36

标签: java pdf pdf-generation itext

我正在使用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();

对于那个或这个某种错误,有没有合理的解释?有什么方法可以解决这个问题吗?

2 个答案:

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