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