首页 文章

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

提问于
浏览
0

我正在使用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 回答

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

    这条单线相当于上面的四条线 .

    Important note:

    你正在使用这个 canvas

    PdfContentByte canvas = writer.getDirectContentUnder();
    

    但是:如果您的文档包含不透明元素(图像,彩色矩形......),那么您添加的任何文本都将被这些不透明元素覆盖 . 你确定你不想要:

    PdfContentByte canvas = writer.getDirectContent();
    
  • 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();
    

相关问题