Java Adobe reader在mac上尝试打开使用iText库创建的pdf时显示错误
我使用动态文档大小的Java Adobe reader在mac上尝试打开使用iText库创建的pdf时显示错误,java,pdf,pdf-generation,itext,Java,Pdf,Pdf Generation,Itext,我使用动态文档大小的iText库创建了PDF。 文档大小取决于内容。 在windows中可以正常打开,但在MAC中尝试打开时,其显示错误“此页面上存在消息错误。acrobat可能无法正确显示页面。请与创建PDF文档的人员联系。” 我用绝对位置在标题中添加了图像。 当我删除此图像时,它工作正常。 我检查了每个像素,没有任何像素相互重叠。 我不知道这段代码到底出了什么问题 在下面找到我的代码 PdfContentByte cb = writer.getDirectContent();
iText
库创建了PDF。
文档大小取决于内容。
在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看起来像这样。我已经在onedpage()
事件中添加了上述代码。此代码用于生成页眉和页脚部分
< p>使用“代码> pdfCordNoTys添加内容,这意味着你认为自己精通PDF。但是,我看到您有以下行:
cb.beginText();
这将打开一个文本对象。在文本对象内部,您需要遵循一些严格的规则。例如:在开始文本对象后,您添加到直接内容的第一件事是图像。那是不对的,是吗
此外,如果没有endText()
,则不能使用beginText()
这是代码中最明显的错误。您可能还有其他错误。一些PDF查看器可能会容忍违反PDF规范的人,而另一些则更为严格。已经使用iText创建了数十亿个PDF,其中大多数都能在所有可能的PDF查看器上正确打开。也许您没有正确地创建PDF,但是由于您没有显示导致问题的任何代码或PDF,因此您不应该期望得到答案。在StackOverflow上发布问题时,仅说“它不起作用”是不够的。如果你想让别人帮助你,你必须解释你的尝试,展示结果并提供足够的信息。感谢你的快速回复,但相同的PDF在windows中正确打开。请给我任何建议。是的,我添加了endtext()方法,但我并没有添加整个代码,只是添加了出现错误的代码。当我删除此图像时,它也在MAC上工作。请再次查看生成PDF页眉和页脚的代码。如果有任何解决方案,请告诉我。这并不能解释为什么在实际需要添加图像时创建文本对象。我已经看过你的更新代码,它看起来很难维护。您应该简化它。我在页眉和页脚部分添加了一些文本,这就是为什么要添加begin text。例如:您以
closePath()
开始,但没有任何要关闭的路径。这就好像你只是在不知道自己在做什么的情况下输入了一堆代码。还有:你不听我说的。您正在文本块中添加图像!不要那样做!