代码之家  ›  专栏  ›  技术社区  ›  kiran

Adobe reader在尝试打开使用iText库创建的pdf时在mac上显示错误

  •  -1
  • kiran  · 技术社区  · 10 年前

    我使用 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();
    

    enter image description here

    我的pdf看起来像这样。我在中添加了以上代码 onEndPage() 事件此代码用于生成页眉和页脚部分。

    enter image description here

    1 回复  |  直到 10 年前
        1
  •  2
  •   Bruno Lowagie    10 年前

    您正在使用添加内容 PdfContentByte 这意味着你认为自己精通PDF。但是,我看到您有以下行:

    cb.beginText();
    

    这将打开一个文本对象。在文本对象中,需要遵循一些严格的规则。例如:在开始文本对象之后,您添加到直接内容的第一件事是图像。这不正确,是吗?

    此外,您不能拥有 beginText() 没有 endText() .

    这是代码中最明显的错误。您可能还有其他错误。虽然一些PDF查看器可能会容忍违反PDF规范的人,但其他人则更加严格。

    推荐文章