繁体   English   中英

itext PDF显示空白页

[英]Itext PDF shows blank page

我有以下示例代码,该示例代码使用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;
    }
}

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

数据可能由于编码问题而损坏。 也许在线base64解码器在文本区域或其他内容中显示了解码后的数据,然后将其复制/粘贴到了文件中? 如果使用的解码器为您提供二进制文件供下载,则结果应该不错。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM