我使用
iText
具有动态文档大小的库。
文档大小取决于内容。
它开得很好
windows
但当试图打开
MAC
其显示错误
“此页面上存在消息错误。页面acrobat可能无法正确显示页面。请与创建PDF文档的人员联系。”
我使用绝对位置在页眉中添加了图像。
当我删除此图像时,它工作正常。
我检查了每个像素,没有任何像素彼此重叠。
我不知道这段代码到底出了什么问题。
在下面查找我的代码
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
try {
//Header and Footer Setting
float textBase = document.bottom();
float textTop = document.top();
String ramboAccounturl = docRoot + RamboConstants.DEFAULT_LOGO_IMAGE_PATH;
Image ramboImage = Image.getInstance(ramboAccounturl);
String reviewName = displayName;//"Review: " + review.getReviewName();
//Header Horizontal Line
cb.setLineWidth(1);
cb.closePath();
//Footer Horizontal Line
float footerY = document.bottom();
footerY += 10;
cb.setColorStroke(BaseColor.BLACK);;
cb.moveTo(document.left(), footerY);
cb.lineTo(document.right(), footerY);
cb.stroke();
cb.setColorFill(BaseColor.BLACK);
Image bkgImage = Image.getInstance(docRoot + RamboConstants.BACKGROUNG_IMAGE);
cb.addImage(bkgImage, document.right() - document.rightMargin() + 35f, 0, 0, RamboConstants.PDF_LOGO_MAX_HEIGHT + 8f,
document.left() - 20, textTop - 18f);
cb.beginText();
//account logo image
account.setDirectS3Download(RamboConstants.TRUE);
Image image = null;
String accountLogoUrl = ramboContext.getFileManager().buildFileUrl(account, RamboConstants.DOCTYPE_LOGO_HEADER_ACCOUNT, null);
if (accountLogoUrl != null) {
try {
image = Image.getInstance(new URL(accountLogoUrl));
} catch(Exception e) {
ramboAccounturl = docRoot + RamboConstants.DEFAULT_LOGO_WHITE_IMAGE_PATH;
image = Image.getInstance(ramboAccounturl);
}
} else {
ramboAccounturl = docRoot + RamboConstants.DEFAULT_LOGO_WHITE_IMAGE_PATH;
image = Image.getInstance(ramboAccounturl);
}
image.setAbsolutePosition(document.left() - 4f, textTop - 12f);
float width = image.getWidth() * RamboConstants.PDF_REVIEW_PIXEL_TO_USER_POINT_CONVERSION_RATE;
float height = image.getHeight() * RamboConstants.PDF_REVIEW_PIXEL_TO_USER_POINT_CONVERSION_RATE;
if (width > RamboConstants.PDF_LOGO_MAX_WIDTH){ // source is wider than target in proportion
float ratio = RamboConstants.PDF_LOGO_MAX_WIDTH / width;
width = width * ratio;
height = height * ratio;
}
if (height > RamboConstants.PDF_LOGO_MAX_HEIGHT){
float ratio = RamboConstants.PDF_LOGO_MAX_HEIGHT / height;
width = width * ratio;
height = height * ratio;
}
image.scaleAbsoluteWidth(width);
image.scaleAbsoluteHeight(height);
cb.addImage(image);
//review name
cb.setColorFill(BaseColor.WHITE);
cb.setFontAndSize(helv , RamboConstants.PDF_REVIEW_NAME_FONT_SIZE);
cb.setTextMatrix(document.right() - helv.getWidthPoint(reviewName, RamboConstants.PDF_REVIEW_NAME_FONT_SIZE) -
40, textTop + 5);
cb.showText(reviewName);
cb.setColorFill(BaseColor.BLACK);
//rambo account logo
ramboImage.setAbsolutePosition(document.left(), textBase - 25);
width = ramboImage.getWidth();
height = ramboImage.getHeight();
if (width > RamboConstants.PDF_ROBOHEAD_LOGO_MAX_WIDTH){ // source is wider than target in proportion
float ratio = RamboConstants.PDF_ROBOHEAD_LOGO_MAX_WIDTH / width;
width = width * ratio;
height = height * ratio;
}
if (height > RamboConstants.PDF_ROBOHEAD_LOGO_MAX_HEIGHT){
float ratio = RamboConstants.PDF_ROBOHEAD_LOGO_MAX_HEIGHT / height;
width = width * ratio;
height = height * ratio;
}
ramboImage.scaleAbsoluteWidth(width);
ramboImage.scaleAbsoluteHeight(height);
cb.addImage(ramboImage);
//powered by text
String poweredByText = ramboContext.getMessageSource().getMessage("msg_footer_powered_by", null, Locale.getDefault());
cb.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA_BOLD, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED),
10);
cb.setTextMatrix(document.left() + 70, 20);
cb.showText(poweredByText);
//Page number
String text = "Page " + writer.getPageNumber() + " of ";
cb.setFontAndSize(helv , RamboConstants.PDF_FOOTER_FONT_SIZE);
cb.setTextMatrix(document.right() - helv.getWidthPoint(text, RamboConstants.PDF_FOOTER_FONT_SIZE) -
RamboConstants.PDF_FOOTER_FONT_SIZE, 20);
cb.showText(text);
cb.endText();
cb.addTemplate(total, document.right() - RamboConstants.PDF_FOOTER_FONT_SIZE, 20);
} catch (Exception e) {
throw new RuntimeException("Failed to add header footer to PDF page ");
}
cb.restoreState();
我的pdf看起来像这样。我在中添加了以上代码
onEndPage()
事件此代码用于生成页眉和页脚部分。