我有以下示例代码,该示例代码使用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对象而不是内容(页面上的内容)呈现文档结构(页面)。 这可能是您遇到的情况:您正在破坏内容流中的字节。