|
|
@ -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); |
|
|
|