Itext PDF显示空白页面

时间:2014-01-02 19:26:27

标签: java pdf base64 itext

我有以下示例代码,它使用iText生成PDF文件。

我遇到的问题是当我通过DatatypeConverter.printBase64Binary方法创建base64Binary时.. 我试图复制" base64Binary"的Sysem.out.println。 使用在线base64在线解码器工具解码内容并将其输出保存为sample.pdf和 当我尝试打开sample.pdf时,它显示为空。我不确定为什么它的行为方式和帮助将非常感激。 但是当我使用java直接解码并将其写入磁盘文件时,它会显示上下文。

当我尝试保存" base64Binary"有人可以帮助我理解为什么它显示为空白输出为sample.pdf。

感谢。

以下是代码段:

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.bind.DatatypeConverter;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;

/**
 * Creates a PDF file in memory.
 */
public class HelloWorldMemory {

    /** Path to the resulting PDF file. */
    public static final String RESULT = "C:////hello_memory.pdf";

    public static void main(final String[] args) throws DocumentException, IOException {
        // step 1
        final Document document = new Document();

        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        final PdfWriter writer = PdfWriter.getInstance(document, baos);

        document.open();
        final PdfContentByte cb = writer.getDirectContent();

        cb.beginText();
        cb.setFontAndSize(getBaseFont(Font.NORMAL), 24);
        final float exPosition = (PageSize.A4.getWidth()) / 2;
        cb.showTextAligned(Element.ALIGN_CENTER, "Test No", exPosition, 670, 0);
        cb.endText();
        document.add(new Paragraph("Hello World!"));

        document.close();
        System.out.println("baos.toByteArray():" + baos.toByteArray());
        final String base64Binary = DatatypeConverter.printBase64Binary(baos.toByteArray());
        System.out.println("base64Binary:" + base64Binary);
        final byte[] txt = DatatypeConverter.parseBase64Binary(base64Binary);

        final FileOutputStream fos = new FileOutputStream(RESULT);
        fos.write(txt);

        fos.close();
    }

    private static BaseFont getBaseFont(final int fontType) {
        final Font f = new Font(FontFamily.HELVETICA, 0, fontType);
        final BaseFont baseFont = f.getCalculatedBaseFont(true);
        return baseFont;
    }
}

2 个答案:

答案 0 :(得分:3)

此问题与iText或PDF无关。对于任何base64编码的二进制数据,您都会遇到同样的问题。使用在线base64解码器时,您的二进制数据会以某种方式损坏。布鲁诺在他的回答中已经解释了为什么在PDF的情况下这不能完全使文件无效。

由于编码问题,数据可能已损坏。也许在线base64解码器在textarea或其他东西中显示解码数据并将其复制/粘贴到文件中?如果您使用解码器为您提供二进制文件供下载,结果应该没问题。

我使用http://www.opinionatedgeek.com/dotnet/tools/base64decode/进行了测试(Google搜索的第一个版本)。当我保存.bin文件并将其重命名为.pdf时,它会在PDF查看器中按预期显示。

答案 1 :(得分:2)

PDF是基于Carousel对象系统(COS)语法和AIM(Adobe Imaging Model)的二进制文件格式。 COS对象使用ASCII作为文件结构,但图像流和AIM语法通常是二进制的。当您复制PDF文件而不考虑文件的二进制方面时,PDF查看器可以基于ASCII COS对象呈现文档结构(页面),但不能呈现内容(页面上的内容)。这可能就是你的情况:你正在破坏内容流中的字节。