public void initialize() throws BirtException { createRoot(); Color backgroundColor = PropertyUtil.getColor( pageContent.getComputedStyle().getProperty(StyleConstants.STYLE_BACKGROUND_COLOR)); ReportDesignHandle designHandle = pageContent.getReportContent().getDesign().getReportDesign(); IStyle style = pageContent.getStyle(); String imageUrl = EmitterUtil.getBackgroundImageUrl( style, designHandle, pageContent.getReportContent().getReportContext() == null ? null : pageContent.getReportContent().getReportContext().getAppContext()); if (backgroundColor != null || imageUrl != null) { boxStyle = new BoxStyle(); boxStyle.setBackgroundColor(backgroundColor); if (imageUrl != null) { boxStyle.setBackgroundImage(createBackgroundImage(imageUrl)); } } context.setMaxHeight(root.getHeight()); context.setMaxWidth(root.getWidth()); context.setMaxBP(root.getHeight()); layoutHeader(); layoutFooter(); updateBodySize(); context.setMaxHeight(body.getHeight()); context.setMaxWidth(body.getWidth()); context.setMaxBP(body.getHeight()); maxAvaWidth = context.getMaxWidth(); context.resetUnresolvedRowHints(); }
// support page border on root area protected BoxStyle buildRootStyle() { IStyle style = pageContent.getStyle(); if ((style != null) && !style.isEmpty()) { BoxStyle boxStyle = new BoxStyle(); IStyle cs = pageContent.getComputedStyle(); int borderWidth = getDimensionValue(cs.getProperty(IStyle.STYLE_BORDER_LEFT_WIDTH), width); if (borderWidth > 0) { boxStyle.setLeftBorder( new BorderInfo( cs.getProperty(IStyle.STYLE_BORDER_LEFT_COLOR), cs.getProperty(IStyle.STYLE_BORDER_LEFT_STYLE), borderWidth)); } borderWidth = getDimensionValue(cs.getProperty(IStyle.STYLE_BORDER_RIGHT_WIDTH), width); if (borderWidth > 0) { boxStyle.setRightBorder( new BorderInfo( cs.getProperty(IStyle.STYLE_BORDER_RIGHT_COLOR), cs.getProperty(IStyle.STYLE_BORDER_RIGHT_STYLE), borderWidth)); } borderWidth = getDimensionValue(cs.getProperty(IStyle.STYLE_BORDER_TOP_WIDTH), width); if (borderWidth > 0) { boxStyle.setTopBorder( new BorderInfo( cs.getProperty(IStyle.STYLE_BORDER_TOP_COLOR), cs.getProperty(IStyle.STYLE_BORDER_TOP_STYLE), borderWidth)); } borderWidth = getDimensionValue(cs.getProperty(IStyle.STYLE_BORDER_BOTTOM_WIDTH), width); if (borderWidth > 0) { boxStyle.setBottomBorder( new BorderInfo( cs.getProperty(IStyle.STYLE_BORDER_BOTTOM_COLOR), cs.getProperty(IStyle.STYLE_BORDER_BOTTOM_STYLE), borderWidth)); } return boxStyle; } return boxStyle.DEFAULT; }
/** layout page footer area */ protected void layoutFooter() { IContent footerContent = pageContent.getPageFooter(); if (footerContent != null) { DimensionType h = pageContent.getFooterHeight(); if (h == null) { h = new DimensionType(0.5f, DimensionType.UNITS_IN); } footerContent.setHeight(h); footer.content = footerContent; boolean autoPageBreak = context.isAutoPageBreak(); context.setAutoPageBreak(false); RegionLayoutEngine rle = new RegionLayoutEngine(footer, context); try { rle.layout(footerContent); } catch (BirtException e) { logger.log(Level.WARNING, e.getMessage(), e); } context.setAutoPageBreak(autoPageBreak); } }
public void close() throws BirtException { int overFlowType = context.getPageOverflow(); if (overFlowType == IPDFRenderOption.FIT_TO_PAGE_SIZE) { float scale = calculatePageScale(this); if (1f == scale) { pageContent.setExtension(IContent.LAYOUT_EXTENSION, this); outputPage(pageContent); return; } this.setScale(scale); getBody().setNeedClip(false); updatePageDimension(scale, this); } else if (overFlowType == IPDFRenderOption.ENLARGE_PAGE_SIZE) { getBody().setNeedClip(false); updatePageDimension(this); } pageContent.setExtension(IContent.LAYOUT_EXTENSION, this); outputPage(pageContent); finished = true; }
protected void createRoot() { int overFlowType = context.getPageOverflow(); if (overFlowType == IPDFRenderOption.OUTPUT_TO_MULTIPLE_PAGES) { // page.setExtendToMultiplePages( true ); } pageContentWidth = getDimensionValue(pageContent, pageContent.getPageWidth()) - boxStyle.getLeftBorderWidth() - boxStyle.getRightBorderWidth(); pageContentHeight = getDimensionValue(pageContent, pageContent.getPageHeight()) - boxStyle.getTopBorderWidth() - boxStyle.getBottomBorderWidth(); // validate page width if (pageContentWidth <= 0) { pageContentWidth = DEFAULT_PAGE_WIDTH; } // validate page height if (pageContentHeight <= 0) { pageContentHeight = DEFAULT_PAGE_HEIGHT; } setWidth(pageContentWidth); setHeight(pageContentHeight); /** set position and dimension for root */ ContainerArea pageRoot = new BlockContainerArea(); BoxStyle boxStyle = buildRootStyle(); if (boxStyle != BoxStyle.DEFAULT) { pageRoot.hasStyle = true; } pageRoot.setBoxStyle(boxStyle); rootLeft = getDimensionValue(pageContent, pageContent.getMarginLeft(), pageContentWidth); rootTop = getDimensionValue(pageContent, pageContent.getMarginTop(), pageContentWidth); rootLeft = Math.max(0, rootLeft); rootLeft = Math.min(pageContentWidth, rootLeft); rootTop = Math.max(0, rootTop); rootTop = Math.min(pageContentHeight, rootTop); pageRoot.setPosition(rootLeft, rootTop); int rootRight = getDimensionValue(pageContent, pageContent.getMarginRight(), pageContentWidth); int rootBottom = getDimensionValue(pageContent, pageContent.getMarginBottom(), pageContentWidth); rootRight = Math.max(0, rootRight); rootBottom = Math.max(0, rootBottom); if (rootLeft + rootRight > pageContentWidth) { rootRight = 0; } if (rootTop + rootBottom > pageContentHeight) { rootBottom = 0; } rootWidth = pageContentWidth - rootLeft - rootRight; rootHeight = pageContentHeight - rootTop - rootBottom; pageRoot.setWidth(rootWidth); pageRoot.setHeight(rootHeight); setRoot(pageRoot); pageRoot.setParent(this); /** set position and dimension for header */ int headerHeight = getDimensionValue(pageContent, pageContent.getHeaderHeight(), pageRoot.getHeight()); int headerWidth = pageRoot.getWidth() - boxStyle.getLeftBorderWidth() - boxStyle.getRightBorderWidth(); headerHeight = Math.max(0, headerHeight); headerHeight = Math.min(pageRoot.getHeight(), headerHeight); RegionArea header = new RegionArea(); header.setHeight(headerHeight); header.setWidth(headerWidth); header.context = context; header.needClip = true; header.setPosition(boxStyle.getLeftBorderWidth(), boxStyle.getTopBorderWidth()); pageRoot.addChild(header); setHeader(header); header.setParent(pageRoot); /** set position and dimension for footer */ int footerHeight = getDimensionValue(pageContent, pageContent.getFooterHeight(), pageRoot.getHeight()); int footerWidth = pageRoot.getWidth() - boxStyle.getLeftBorderWidth() - boxStyle.getRightBorderWidth(); footerHeight = Math.max(0, footerHeight); footerHeight = Math.min(pageRoot.getHeight() - headerHeight, footerHeight); RegionArea footer = new RegionArea(); footer.setHeight(footerHeight); footer.setWidth(footerWidth); footer.context = context; footer.needClip = true; footer.setPosition( boxStyle.getLeftBorderWidth(), pageRoot.getHeight() - boxStyle.getBottomBorderWidth() - footerHeight); pageRoot.addChild(footer); setFooter(footer); footer.setParent(pageRoot); /** set position and dimension for body */ ContainerArea body = new BlockContainerArea(); int bodyLeft = getDimensionValue(pageContent, pageContent.getLeftWidth(), pageRoot.getWidth()); bodyLeft = Math.max(0, bodyLeft); bodyLeft = Math.min(pageRoot.getWidth(), bodyLeft); body.setPosition( boxStyle.getLeftBorderWidth() + bodyLeft, headerHeight + boxStyle.getRightBorderWidth()); int bodyRight = getDimensionValue(pageContent, pageContent.getRightWidth(), pageRoot.getWidth()); bodyRight = Math.max(0, bodyRight); bodyRight = Math.min(pageRoot.getWidth() - bodyLeft, bodyRight); body.setWidth( pageRoot.getWidth() - bodyLeft - bodyRight - boxStyle.getLeftBorderWidth() - boxStyle.getRightBorderWidth()); body.setHeight( pageRoot.getHeight() - headerHeight - footerHeight - boxStyle.getTopBorderWidth() - boxStyle.getBottomBorderWidth()); setBody(body); if (overFlowType == IPDFRenderOption.CLIP_CONTENT || overFlowType == IPDFRenderOption.OUTPUT_TO_MULTIPLE_PAGES) { pageRoot.setNeedClip(true); body.setNeedClip(true); } else { pageRoot.setNeedClip(false); } // TODO add left area and right area; }
protected BackgroundImageInfo createBackgroundImage(String url) { ResourceLocatorWrapper rl = null; ExecutionContext exeContext = ((ReportContent) content.getReportContent()).getExecutionContext(); if (exeContext != null) { rl = exeContext.getResourceLocator(); } IStyle cs = pageContent.getComputedStyle(); BackgroundImageInfo backgroundImage = new BackgroundImageInfo( url, cs.getProperty(IStyle.STYLE_BACKGROUND_REPEAT), 0, 0, 0, 0, rl); Image img = backgroundImage.getImageInstance(); IStyle style = pageContent.getStyle(); String widthStr = style.getBackgroundWidth(); String heightStr = style.getBackgroundHeight(); if (img != null) { int resolutionX = img.getDpiX(); int resolutionY = img.getDpiY(); if (0 == resolutionX || 0 == resolutionY) { resolutionX = 96; resolutionY = 96; } float imageWidth = img.getPlainWidth() / resolutionX * 72 * PDFConstants.LAYOUT_TO_PDF_RATIO; float imageHeight = img.getPlainHeight() / resolutionY * 72 * PDFConstants.LAYOUT_TO_PDF_RATIO; int actualWidth = (int) imageWidth; int actualHeight = (int) imageHeight; if (widthStr != null && widthStr.length() > 0 || heightStr != null && heightStr.length() > 0) { if ("contain".equals(widthStr) || "contain".equals(heightStr)) { float rh = imageHeight / height; float rw = imageWidth / width; if (rh > rw) { actualHeight = height; actualWidth = (int) (imageWidth * height / imageHeight); } else { actualWidth = width; actualHeight = (int) (imageHeight * width / imageWidth); } } else if ("cover".equals(widthStr) || "cover".equals(heightStr)) { float rh = imageHeight / height; float rw = imageWidth / width; if (rh > rw) { actualWidth = width; actualHeight = (int) (imageHeight * width / imageWidth); } else { actualHeight = height; actualWidth = (int) (imageWidth * height / imageHeight); } } else { DimensionType widthDim = DimensionType.parserUnit(widthStr); DimensionType heightDim = DimensionType.parserUnit(heightStr); if (widthDim != null) { actualWidth = PropertyUtil.getDimensionValue(content, widthDim); if (heightDim == null) { actualHeight = (int) (imageHeight * actualWidth / imageWidth); } else { actualHeight = PropertyUtil.getDimensionValue(content, heightDim); } } else if (heightDim != null) { actualHeight = PropertyUtil.getDimensionValue(content, heightDim); if (widthDim == null) { actualWidth = (int) (imageWidth * actualHeight / imageHeight); } else { actualWidth = PropertyUtil.getDimensionValue(content, widthDim); } } else { actualHeight = (int) imageHeight; actualWidth = (int) imageWidth; } } } backgroundImage.setXOffset( getDimensionValue( cs.getProperty(IStyle.STYLE_BACKGROUND_POSITION_X), width - actualWidth)); backgroundImage.setYOffset( getDimensionValue( cs.getProperty(IStyle.STYLE_BACKGROUND_POSITION_Y), height - actualHeight)); backgroundImage.setHeight(actualHeight); backgroundImage.setWidth(actualWidth); return backgroundImage; } return null; }