package com.common.util;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import net.sf.jasperreports.engine.JRElement;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignElement;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignImage;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import org.apache.commons.beanutils.BeanUtils;
public class ReportJasperPrint {
public static List nomoveflagTextKey = new ArrayList();
private static String flagTextKey = "customFlagText";
private static int columnwidth = 0;
private static int pageheight = 555;
public static boolean alreadySetcolumnheight = false;
public static List<Integer> width=new ArrayList<Integer>();//自定义每列width
public static boolean pinjunwidth = true;//平均分配width
public static List leftSizeGroup=new ArrayList(); //过页数据
public static JasperDesign curJasperDesign=new JasperDesign() ; //当前JasperDesign
public static List jasperPrintList = new ArrayList();
public static String filePath="";
public static HashMap parameters=new HashMap();
public static List objects=new ArrayList();
public static List sizegroups=new ArrayList();
public static List flagTextKeys=new ArrayList();
public static List pinjunwidths=new ArrayList();
public static List widths=new ArrayList();
public static List alreadySetcolumnheights=new ArrayList();
public static List allDesign=new ArrayList();//所有要打印的design
public static void reset()
{
ReportJasperPrint.nomoveflagTextKey = new ArrayList();
ReportJasperPrint.flagTextKey = "customFlagText";
ReportJasperPrint.columnwidth = 0;
ReportJasperPrint. pageheight = 555;
ReportJasperPrint. alreadySetcolumnheight = false;
ReportJasperPrint. width=new ArrayList<Integer>();//自定义每列width
ReportJasperPrint. pinjunwidth = true;//平均分配width
ReportJasperPrint.leftSizeGroup=new ArrayList(); //过页数据
ReportJasperPrint.curJasperDesign=new JasperDesign() ; //当前JasperDesign
ReportJasperPrint.jasperPrintList = new ArrayList();
ReportJasperPrint.filePath="";
ReportJasperPrint.parameters=new HashMap();
ReportJasperPrint.objects=new ArrayList();
ReportJasperPrint.sizegroups=new ArrayList();
ReportJasperPrint.flagTextKeys=new ArrayList();
ReportJasperPrint.pinjunwidths=new ArrayList();
ReportJasperPrint. widths=new ArrayList();
ReportJasperPrint.alreadySetcolumnheights=new ArrayList();
ReportJasperPrint.allDesign=new ArrayList();//所有要打印的design
}
//针对design进行设置
public static void setJasperDesign(JasperDesign design,
List sizeGroup, String flagTextKey) throws JRException {
ReportJasperPrint.flagTextKey = flagTextKey;// 初始化
JRDesignBand columnHeader = (JRDesignBand) design.getColumnHeader();
design.setTopMargin(0);
design.setBottomMargin(0);
//sizeGroup允许的最大行数(每页最大高度除掉title,pageheader,columnheader当前element上面高度,element自身高度)
int maxrow=1+(555-design.getColumnFooter().getHeight()-design.getTitle().getHeight()-design.getPageHeader().getHeight()-columnHeader.getElementByKey(flagTextKey).getY()-columnHeader.getElementByKey(flagTextKey).getHeight())/columnHeader.getElementByKey(flagTextKey).getHeight();
int rowread=sizeGroup.size();
int rows=0;
rows=sizeGroup.size();
curJasperDesign=design;
if(rows>maxrow)
{
rows=maxrow;
List newlist=new ArrayList();
for(int i=maxrow;i<sizeGroup.size();i++)
{
newlist.add(sizeGroup.get(i));
}
ReportJasperPrint.leftSizeGroup=newlist;
curJasperDesign=makeJasperDesign(design,flagTextKey);
ReportJasperPrint.allDesign.add(curJasperDesign);
}
List newsizeGroup=new ArrayList();
for(int i=0;i<rows;i++)
{
if(sizeGroup.size()==0)continue;
newsizeGroup.add(sizeGroup.get(i));
}
reSetFlagTextWidth(getFlagTextInDesign(columnHeader), newsizeGroup);
reSetColumnHeaderHeight(design,columnHeader, newsizeGroup);
reSetOtherPosition(columnHeader, newsizeGroup);
addElementToColumnHeader(columnHeader, newsizeGroup);
if(rowread<=maxrow)
{
ReportJasperPrint.leftSizeGroup.clear();//没有留下
}
}
//创造出一个新的design ,这个动作必须在操作design之前,否则在操作完design之后,一但过页,flagTextKey下面的元素将不复存在
private static JasperDesign makeJasperDesign(JasperDesign design,
String flagTextKey) throws JRException {
// TODO Auto-generated method stub
JasperDesign newdesign= getJasperDesign(ReportJasperPrint.filePath);;
try {
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*newdesign.setName("liyousoft");
JRDesignField createman = new JRDesignField();
createman.setName("createman");
createman.setValueClass(java.lang.String.class);
newdesign.addField(createman);*/
//复制未经操作过的columnheader
//newdesign.setColumnHeader(design.getColumnHeader());
/*for(int i=0;i<design.getFields().length;i++)
{ newdesign.addField((JRField)design.getFields()[i]) ;
}*/
/* JRDesignBand title = new JRDesignBand();title.setHeight(0);
newdesign.setTitle(title);
JRDesignBand pageheader = new JRDesignBand();pageheader.setHeight(0);
newdesign.setPageHeader(pageheader);*/
//清除flagtextkey上面已经处理的元素
JRElement element= newdesign.getColumnHeader().getElementByKey(flagTextKey);
clearTopElement(newdesign,flagTextKey);
JRDesignBand columnHeader=(JRDesignBand) newdesign.getColumnHeader();
newdesign.setTopMargin(0);
newdesign.setBottomMargin(0);
columnHeader.setHeight(555-design.getColumnFooter().getHeight()-design.getTitle().getHeight()-design.getPageHeader().getHeight());
JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);
flagText.setY(0);
return newdesign;
}
private static void clearTopElement(JasperDesign design,String flagTextKey) {
// TODO Auto-generated method stub
JRDesignBand columnHeader=(JRDesignBand) design.getColumnHeader();
JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);
Iterator children = columnHeader.getChildren().iterator();
JRDesignElement element;
List elements=new ArrayList();
while (children.hasNext()) {
element = (JRDesignElement) children.next();
if(!element.getKey().equals(flagTextKey)&&element.getY()+element.getHeight()<=flagText.getY())
{
elements.add(element);
}
}
for(int i=0;i<elements.size();i++)
{
columnHeader.removeElement((JRDesignElement)elements.get(i));
}
}
//针对design进行编译,返回
public static JasperReport getJasperReport(JasperDesign design)
throws JRException {
design.setTopMargin(0);
design.setBottomMargin(0);
System.out.print(design.getColumnHeader().getHeight()+":"+design.getTitle().getHeight()+":"+design.getColumnFooter().getHeight());
return JasperCompileManager.compileReport(design);
}
public static JasperReport getJasperReport(String xmlFilePath,
List sizeGroup,int totalwidth) throws JRException {
JasperDesign design = getJasperDesign(xmlFilePath);
JRDesignBand columnHeader = (JRDesignBand) design.getColumnHeader();
reSetFlagTextWidth( getFlagTextInDesign(columnHeader), sizeGroup);
reSetColumnHeaderHeight(design,columnHeader, sizeGroup);
reSetshapeAndPosition(columnHeader, sizeGroup);
addElementToColumnHeader(columnHeader, sizeGroup);
return JasperCompileManager.compileReport(design);
}
public static JasperDesign getJasperDesign(String filePath)
throws JRException {
JasperDesign design = JRXmlLoader.load(new File(filePath));
columnwidth = design.getColumnWidth();
return design;
}
private static void reSetFlagTextWidth( JRDesignStaticText flagText,
List sizeGroup) {
if(sizeGroup.size()==0)return;
flagText.setWidth((flagText.getWidth()) / ((List) sizeGroup.get(0)).size());
}
private static void reSetOtherPosition(JRDesignBand columnHeader,
List sizeGroup) {
if( ReportJasperPrint.alreadySetcolumnheight==true) return;
JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);
Iterator children = columnHeader.getChildren().iterator();
JRDesignElement element;
List mustdeleteElement=new ArrayList();越界的元素
while (children.hasNext()) {
element = (JRDesignElement) children.next();
/* if (element.getX() > flagText.getX()) {//与flagtext同行的其它element才需要调整
element.setX(flagText.getX() + flagText.getWidth()
* ((List) sizeGroup.get(0)).size());
}*/
if (element.getY() > flagText.getY()&&!flagTextKey.equals(element.getKey())&&ReportJasperPrint.nomoveflagTextKey.indexOf(element.getKey())==-1) {//其它所有在flagtext下方的element
//element.setHeight(element.getHeight() * sizeGroup.size());
int newheight=element.getY()+flagText.getHeight() * sizeGroup.size()-1;
if(newheight+element.getHeight()>columnHeader.getHeight())//越界
{
mustdeleteElement.add(element);
}
else{
element.setY(newheight);
}
}
}
for(int i=0;i<mustdeleteElement.size();i++)
{
columnHeader.removeElement((JRDesignElement)mustdeleteElement.get(i));
}
}
private static void reSetColumnHeaderHeight(JasperDesign design ,JRDesignBand columnHeader,
List sizeGroup) {
if( ReportJasperPrint.alreadySetcolumnheight==true) return;
int newheight=columnHeader.getHeight()+columnHeader.getElementByKey(flagTextKey).getHeight() * sizeGroup.size()-1;
if(newheight<=pageheight)
{
columnHeader.setHeight(newheight);
}
int maxheight=555-design.getColumnFooter().getHeight()-design.getTitle().getHeight()-design.getPageHeader().getHeight();
if(newheight>maxheight)
{
columnHeader.setHeight(maxheight);
}
}
private static JRDesignStaticText getFlagTextInDesign(
JRDesignBand columnHeader) {
return (JRDesignStaticText) columnHeader.getElementByKey(flagTextKey);
}
private static void reSetshapeAndPosition(JRDesignBand columnHeader,
List sizeGroup) {
if( ReportJasperPrint.alreadySetcolumnheight==true) return;
JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);
Iterator children = columnHeader.getChildren().iterator();
JRDesignStaticText element;
while (children.hasNext()) {
element = (JRDesignStaticText) children.next();
if (element.getX() > flagText.getX()) {
element.setX(flagText.getX() + flagText.getWidth()
* ((List) sizeGroup.get(0)).size());
}
if (!flagTextKey.equals(element.getKey())) {
element.setHeight(element.getHeight() * sizeGroup.size());
}
}
}
private static int getBeforeWidth(int num)
{
int width=0;
for(int i=0;i<num;i++)
{
width+=ReportJasperPrint.width.get(i);
}
return width;
}
private static void addElementToColumnHeader(JRDesignBand columnHeader,
List sizeGroup) {
JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);
columnHeader.removeElement(flagText);
for (int i = 0; i < sizeGroup.size(); i++) {
for (int j = 0; j < ((List) sizeGroup.get(i)).size(); j++) {
try {
JRDesignStaticText newElement = (JRDesignStaticText) BeanUtils
.cloneBean(flagText);
newElement.setText((String) ((List) sizeGroup.get(i))
.get(j));
newElement.setX(flagText.getX() + flagText.getWidth() * j);
newElement.setY(flagText.getY() + flagText.getHeight() * i);
if(ReportJasperPrint.pinjunwidth==false)
{
newElement.setX(flagText.getX()+getBeforeWidth(j)) ;
newElement.setWidth(ReportJasperPrint.width.get(j));
}
columnHeader.addElement(newElement);
ReportJasperPrint.nomoveflagTextKey.add(newElement.getKey());
if(newElement.getText()!=null&&newElement.getText().endsWith(".jpg"))
{
try {
JRDesignImage image=new JRDesignImage(null);
image.setX(newElement.getX());
image.setY(newElement.getY());
image.setHeight(newElement.getHeight());
image.setWidth(newElement.getWidth());
JRDesignExpression expression = new JRDesignExpression();
expression.setValueClass(String.class);
String imagesrc=newElement.getText();
expression.setText("/""+imagesrc+"/"");
image.setExpression(expression);
columnHeader.removeElement(newElement);
columnHeader.addElement(image);
ReportJasperPrint.nomoveflagTextKey.add(image.getKey());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
}
public static List getJasperPrintList(String filePath,HashMap parameters,List objects,List sizegroups,List flagTextkeys,List pinjunwidths,List widths,List alreadySetcolumnheights)
{
try {
ReportJasperPrint.reset();
//设置相关参数
ReportJasperPrint.filePath=filePath;//xml文件路径
ReportJasperPrint.parameters=parameters;//可能用到的参数
ReportJasperPrint.objects=objects;//可能用到的数据
ReportJasperPrint.sizegroups=sizegroups;//多个二维数据
ReportJasperPrint.flagTextKeys=flagTextkeys ;//对应多个二维数据的key
ReportJasperPrint.pinjunwidths=pinjunwidths;//每个二维数据是否平均分配
ReportJasperPrint.widths=widths;//每个二维数据对应width,如果是平均分配,则width=new ArrayList()。否则,List list=new ArrayList();list.add(10);list.add(20); width=list;
ReportJasperPrint.alreadySetcolumnheights=alreadySetcolumnheights;
//进行报表处理
ReportDesignProcess();
for(int i=0;i<ReportJasperPrint.allDesign.size();i++)
{
JasperPrint jasperPrint = JasperFillManager.fillReport(ReportJasperPrint.getJasperReport((JasperDesign)ReportJasperPrint.allDesign.get(i)), parameters, new JRBeanCollectionDataSource(objects ));
ReportJasperPrint.jasperPrintList.add(jasperPrint);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//返回最终结果
return ReportJasperPrint.jasperPrintList;
}
//处理报表
public static void ReportDesignProcess() throws JRException
{
JasperDesign design=ReportJasperPrint.getJasperDesign(ReportJasperPrint.filePath);//最初design
ReportJasperPrint.curJasperDesign=design;
ReportJasperPrint.allDesign.add(design);
for(int i=0;i<ReportJasperPrint.sizegroups.size();i++)//sizegroups必须按照从上到下,从左到右顺序排列
{
List sizegroup=(List)ReportJasperPrint.sizegroups.get(i);//当前sizegroup
String flagTextKey=(String)ReportJasperPrint.flagTextKeys.get(i);//当前flagTextKey
ReportJasperPrint.pinjunwidth= (Boolean)ReportJasperPrint.pinjunwidths.get(i);//当前是否平均width
ReportJasperPrint.width=(List)ReportJasperPrint.widths.get(i);//当前二维数据使用width
ReportJasperPrint.alreadySetcolumnheight=(Boolean)ReportJasperPrint.alreadySetcolumnheights.get(i);//是否已设置好高度
while(ReportJasperPrint.leftSizeGroup.size()>0)//还有未处理的sizegroup
{
setJasperDesign(ReportJasperPrint.curJasperDesign,ReportJasperPrint.leftSizeGroup,flagTextKey);
}
ReportJasperPrint.setJasperDesign(ReportJasperPrint.curJasperDesign, sizegroup, flagTextKey);
}
while(ReportJasperPrint.leftSizeGroup.size()>0)//还有未处理的sizegroup
{
ReportJasperPrint.flagTextKey=(String)ReportJasperPrint.flagTextKeys.get(ReportJasperPrint.flagTextKeys.size()-1);
setJasperDesign(ReportJasperPrint.curJasperDesign,ReportJasperPrint.leftSizeGroup,flagTextKey);
}
}
}
jasperPrintList= ReportJasperPrint.getJasperPrintList(request.getRealPath("/")+"/dd.jrxml",parameters,objects,sizegroups, flagTextkeys, pinjunwidths, widths, alreadySetcolumnheights);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JRPdfExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST,jasperPrintList);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
exporter.exportReport();
byte[] bytes= baos.toByteArray();
response.setContentType("application/pdf");
ServletOutputStream outputStream = response.getOutputStream();
response.addHeader("Content-Disposition", "attachment;filename=/""
+ URLEncoder.encode("单.pdf", "utf-8") + "/"");
response.addHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
outputStream.write(bytes, 0, bytes.length);
outputStream.flush();
outputStream.close();