Quellcode durchsuchen

修复在非windows环境下因字体不存在导致换行计算不正确的BUG

master
youseries vor 6 Jahren
Ursprung
Commit
39ad10df42
  1. 13
      ureport2-core/src/main/java/com/bstek/ureport/definition/CellStyle.java
  2. 39
      ureport2-core/src/main/java/com/bstek/ureport/export/pdf/font/FontBuilder.java

13
ureport2-core/src/main/java/com/bstek/ureport/definition/CellStyle.java

@ -17,11 +17,11 @@ package com.bstek.ureport.definition;
import java.awt.Font;
import java.io.Serializable;
import java.math.BigDecimal;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.annotate.JsonIgnore;
import com.bstek.ureport.Utils;
import com.bstek.ureport.export.pdf.font.FontBuilder;
/**
@ -192,10 +192,11 @@ public class CellStyle implements Serializable{
}else if(italic!=null && italic){
fontStyle=Font.ITALIC;
}
double size=fontSize * 1.1;
BigDecimal bigData=Utils.toBigDecimal(size);
int s=bigData.setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
this.font=new Font(fontFamily,fontStyle,s);
String fontName=fontFamily;
if(StringUtils.isBlank(fontName)){
fontName="宋体";
}
this.font=FontBuilder.getAwtFont(fontName, fontStyle, new Float(fontSize));
}
return this.font;
}

39
ureport2-core/src/main/java/com/bstek/ureport/export/pdf/font/FontBuilder.java

@ -15,10 +15,13 @@
******************************************************************************/
package com.bstek.ureport.export.pdf.font;
import java.awt.GraphicsEnvironment;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.IOUtils;
@ -28,6 +31,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import com.bstek.ureport.exception.ReportComputeException;
import com.bstek.ureport.exception.ReportException;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
@ -38,7 +42,10 @@ import com.itextpdf.text.pdf.BaseFont;
* @since 2014年4月22日
*/
public class FontBuilder implements ApplicationContextAware{
private static ApplicationContext applicationContext;
private static final Map<String,BaseFont> fontMap=new HashMap<String,BaseFont>();
public static final Map<String,String> fontPathMap=new HashMap<String,String>();
private static List<String> systemFontNameList=new ArrayList<String>();
public static Font getFont(String fontName,int fontSize,boolean fontBold,boolean fontItalic,boolean underLine){
BaseFont baseFont=fontMap.get(fontName);
Font font=null;
@ -73,7 +80,34 @@ public class FontBuilder implements ApplicationContextAware{
font.setStyle(fontStyle);
return font;
}
public static java.awt.Font getAwtFont(String fontName,int fontStyle,float size){
if(systemFontNameList.contains(fontName)){
return new java.awt.Font(fontName,fontStyle,new Float(size).intValue());
}
String fontPath=fontPathMap.get(fontName);
if(fontPath==null){
return null;
}
InputStream inputStream=null;
try {
inputStream=applicationContext.getResource(fontPath).getInputStream();
java.awt.Font font=java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, inputStream);
return font.deriveFont(fontStyle,size);
} catch (Exception e) {
throw new ReportException(e);
}finally{
IOUtils.closeQuietly(inputStream);
}
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
FontBuilder.applicationContext=applicationContext;
GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontNames=environment.getAvailableFontFamilyNames();
for(String name:fontNames){
systemFontNameList.add(name);
}
Collection<FontRegister> fontRegisters=applicationContext.getBeansOfType(FontRegister.class).values();
for(FontRegister fontReg:fontRegisters){
String fontName=fontReg.getFontName();
@ -82,7 +116,7 @@ public class FontBuilder implements ApplicationContextAware{
continue;
}
try {
BaseFont baseFont=getIdentityFont(fontPath,applicationContext);
BaseFont baseFont=getIdentityFont(fontName,fontPath,applicationContext);
if(baseFont==null){
throw new ReportComputeException("Font " + fontPath + " does not exist");
}
@ -94,7 +128,7 @@ public class FontBuilder implements ApplicationContextAware{
}
}
private BaseFont getIdentityFont(String fontPath,ApplicationContext applicationContext) throws DocumentException,IOException {
private BaseFont getIdentityFont(String fontFamily,String fontPath,ApplicationContext applicationContext) throws DocumentException,IOException {
if(!fontPath.startsWith(ApplicationContext.CLASSPATH_URL_PREFIX)){
fontPath=ApplicationContext.CLASSPATH_URL_PREFIX+fontPath;
}
@ -108,6 +142,7 @@ public class FontBuilder implements ApplicationContextAware{
}
InputStream inputStream=null;
try{
fontPathMap.put(fontFamily, fontPath);
inputStream=applicationContext.getResource(fontPath).getInputStream();
byte[] bytes = IOUtils.toByteArray(inputStream);
BaseFont baseFont = BaseFont.createFont(fontName, BaseFont.IDENTITY_H,BaseFont.EMBEDDED,true,bytes,null);

Laden…
Abbrechen
Speichern