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()
开始,但没有任何要关闭的路径。这就好像你只是在不知道自己在做什么的情况下输入了一堆代码。还有:你不听我说的。您正在文本块中添加图像!不要那样做!