Itext 生成的 pdf 无法在 Adobe reader 中打开?
Itext generated pdf not opening in Adobe reader?
我正在使用 itext(版本 5.5.4)在服务器中创建 pdf 文件。当我在客户端下载文件并尝试在 adobe reader 中打开它时,它打不开并弹出一条消息说 "There was an error processing a page. There was a problem reading this document(129)".
此 pdf 文件在其他应用程序(如 evince、foxit 和 google chrome)中打开很好。以下是我正在使用的部分代码。
public static String genPdfAsBase64(String orientation, JSONObject data)
throws IOException, DocumentException {
if(orientation.equals("landscape")) {
doc = new Document(PageSize.A4.rotate(), 10f, 10f, 50f, 5f);
} else {
doc = new Document();
}
JSONArray header = (JSONArray)data.get("header");
JSONArray body = (JSONArray)data.get("body");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(doc, baos);
TableHeader evt = new TableHeader();
evt.setOrientation(orientation);
writer.setPageEvent(evt);
doc.addAuthor(AUTHOR);
doc.open();
Image img = Image.getInstance(Base64.decode(BASE_64_IMG));
img.setAlignment(Image.ALIGN_MIDDLE);
img.setBorder(Rectangle.NO_BORDER);
img.scaleToFit(20f,20f);
doc.add(img);
Paragraph par = new Paragraph("Report", new Font(FontFamily.HELVETICA, 10));
par.setAlignment(Element.ALIGN_CENTER);
doc.add(par);
doc.add(new Paragraph(" "));
PdfPTable table = new PdfPTable(header.size());
table.setTotalWidth(1500);
table.setHeaderRows(1);
/*Header*/
for(Object obj : header) {
String text = (String)obj;
PdfPCell cell = new PdfPCell(new Phrase(text));
cell.setBackgroundColor(headerCol);
table.addCell(cell);
}
/*Body*/
for(int i=0; i<body.size(); i++) {
JSONArray row = (JSONArray)body.get(i);
for(Object obj : row) {
String text = String.valueOf(obj);
PdfPCell cell = new PdfPCell(new Phrase(text, sansFont));
if(i%2 != 0) {
cell.setBackgroundColor(evenCol);
}
table.addCell(cell);
}
}
doc.add(table);
doc.close();
byte[] bytes = baos.toByteArray();
baos.close();
String base64 = Base64.encodeBytes(bytes);
return base64;
}
有人可以帮忙吗?
谢谢
p.s。我创建了一个 sample 文件 .
您好,您可以用这个替换最后 4 行。它不需要在编码前关闭 ByteArrayOutputStream。
byte[] bytes = baos.toByteArray();
String base64 = Base64.getEncoder().encodeToString(bytes);
return base64;
上面@mkl说的原因就是问题所在。我使用了错误的字体。我从 here 下载了字体,现在可以使用了。
我正在使用 itext(版本 5.5.4)在服务器中创建 pdf 文件。当我在客户端下载文件并尝试在 adobe reader 中打开它时,它打不开并弹出一条消息说 "There was an error processing a page. There was a problem reading this document(129)".
此 pdf 文件在其他应用程序(如 evince、foxit 和 google chrome)中打开很好。以下是我正在使用的部分代码。
public static String genPdfAsBase64(String orientation, JSONObject data)
throws IOException, DocumentException {
if(orientation.equals("landscape")) {
doc = new Document(PageSize.A4.rotate(), 10f, 10f, 50f, 5f);
} else {
doc = new Document();
}
JSONArray header = (JSONArray)data.get("header");
JSONArray body = (JSONArray)data.get("body");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(doc, baos);
TableHeader evt = new TableHeader();
evt.setOrientation(orientation);
writer.setPageEvent(evt);
doc.addAuthor(AUTHOR);
doc.open();
Image img = Image.getInstance(Base64.decode(BASE_64_IMG));
img.setAlignment(Image.ALIGN_MIDDLE);
img.setBorder(Rectangle.NO_BORDER);
img.scaleToFit(20f,20f);
doc.add(img);
Paragraph par = new Paragraph("Report", new Font(FontFamily.HELVETICA, 10));
par.setAlignment(Element.ALIGN_CENTER);
doc.add(par);
doc.add(new Paragraph(" "));
PdfPTable table = new PdfPTable(header.size());
table.setTotalWidth(1500);
table.setHeaderRows(1);
/*Header*/
for(Object obj : header) {
String text = (String)obj;
PdfPCell cell = new PdfPCell(new Phrase(text));
cell.setBackgroundColor(headerCol);
table.addCell(cell);
}
/*Body*/
for(int i=0; i<body.size(); i++) {
JSONArray row = (JSONArray)body.get(i);
for(Object obj : row) {
String text = String.valueOf(obj);
PdfPCell cell = new PdfPCell(new Phrase(text, sansFont));
if(i%2 != 0) {
cell.setBackgroundColor(evenCol);
}
table.addCell(cell);
}
}
doc.add(table);
doc.close();
byte[] bytes = baos.toByteArray();
baos.close();
String base64 = Base64.encodeBytes(bytes);
return base64;
}
有人可以帮忙吗? 谢谢
p.s。我创建了一个 sample 文件 .
您好,您可以用这个替换最后 4 行。它不需要在编码前关闭 ByteArrayOutputStream。
byte[] bytes = baos.toByteArray();
String base64 = Base64.getEncoder().encodeToString(bytes);
return base64;
上面@mkl说的原因就是问题所在。我使用了错误的字体。我从 here 下载了字体,现在可以使用了。