如何在DynamicJasper同一页眉行渲染文本与ImageBanner?
解决DynamicJasper页眉同一行显示文本和图片的问题
默认的addAutoText和addFirstPageImageBanner方法会将元素垂直排列在页眉的不同行,要实现同一行显示,需要手动自定义页眉带(Header Band)并控制元素的布局位置,以下是两种可行方案:
方案一:使用HorizontalBand实现横向布局
HorizontalBand专门用于横向排列元素,适合将文本和图片放在同一行:
- 创建封装页眉数据的实体类
public class HeaderData { private String headerText; private Image headerImage; public HeaderData(String headerText, Image headerImage) { this.headerText = headerText; this.headerImage = headerImage; } // Getter方法 public String getHeaderText() { return headerText; } public Image getHeaderImage() { return headerImage; } }
- 构建自定义页眉并添加到报表
// 创建横向布局的页眉带,高度与图片一致 HorizontalBand headerBand = new HorizontalBand(); headerBand.setHeight(60); // 添加文本列 AbstractColumn textColumn = ColumnBuilder.getNew() .setColumnProperty("headerText", String.class.getName()) .setTitle("") .setWidth(ReportGeneratorConstants.TITLE_CELL_WIDTH) .setStyle(style) .build(); headerBand.addColumn(textColumn); // 添加图片列 ImageColumn imageColumn = ImageColumnBuilder.getNew() .setColumnProperty("headerImage", Image.class.getName()) .setTitle("") .setWidth(197) .build(); headerBand.addColumn(imageColumn); // 将自定义页眉绑定到报表构建器 dynamicReportBuilder.setHeaderBand(headerBand); // 准备数据源,传入文本和图片 try { Image headerImage = ImageIO.read(new File( getPropertyDir() + File.separator + REPORTING_FOLDER + File.separator + PDF_EXPORT_FOLDER + File.separator + LOGO_FOLDER_NAME + File.separator + SUFFIX )); JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource( Collections.singletonList(new HeaderData("kjasdlkf", headerImage)) ); } catch (IOException e) { e.printStackTrace(); }
方案二:手动设置元素坐标实现同行布局
直接创建普通Band,通过设置元素的X/Y坐标让文本和图片处于同一行:
// 创建高度为60的页眉带 Band headerBand = new Band(60); // 添加文本元素 TextField textField = new TextField(); textField.setX(0); // 左侧起始位置 textField.setY(0); // 顶部对齐 textField.setWidth(ReportGeneratorConstants.TITLE_CELL_WIDTH); textField.setHeight(60); textField.setStyle(style); textField.setExpression(new JRDesignExpression("$P{headerText}")); headerBand.addElement(textField); // 添加图片元素,X坐标接在文本元素之后 Image image = new Image(); image.setX(ReportGeneratorConstants.TITLE_CELL_WIDTH); image.setY(0); // 顶部对齐 image.setWidth(197); image.setHeight(60); image.setExpression(new JRDesignExpression("$P{headerImage}")); headerBand.addElement(image); // 绑定页眉到报表构建器 dynamicReportBuilder.setHeaderBand(headerBand); // 准备参数传入文本和图片 Map<String, Object> parameters = new HashMap<>(); parameters.put("headerText", "kjasdlkf"); try { parameters.put("headerImage", ImageIO.read(new File( getPropertyDir() + File.separator + REPORTING_FOLDER + File.separator + PDF_EXPORT_FOLDER + File.separator + LOGO_FOLDER_NAME + File.separator + SUFFIX ))); } catch (IOException e) { e.printStackTrace(); } // 报表填充时传入参数和数据源 JasperPrint jasperPrint = DynamicJasperHelper.generateJasperPrint( dynamicReport, new ClassicLayoutManager(), dataSource, parameters );
核心原因说明
addAutoText和addFirstPageImageBanner是DynamicJasper提供的快捷方法,默认会将元素添加到页眉的独立行中。通过自定义Band并手动控制元素的布局位置(横向排列或坐标定位),就能实现文本和图片在同一行显示的需求。
内容的提问来源于stack exchange,提问作者prashant.kr.mod
相关产品推荐
相关产品推荐

