本章节介绍OFD文件怎么添加文字。
与图形和图形一样,直接利用Page对象的addText方法就可以添加文字,该基本方法只需要三个参数,需要展示的文字text,x轴和y轴坐标(baseline)。
public CTPageBlock.TextObject addText(java.lang.String text, double x, double y)
text
- 展示的文本x
- 第一个字型绘制点在对象坐标系下的 X 坐标。计算后都是相对于Boundary的x。y
- 注意是baseline的地方 ;第一个字型绘制点在对象坐标系下的 y 坐标。计算后都是相对于Boundary的y。样例代码如下:
/*默认字体*/
page.addText("默认字体:宋体",20.0,20.0);
文字的大小可以调用另外一个方法,该方法的fontSize可以指定文字的大小(单位:MM)。也可利用1.1的方法利用返回的CTPageBlock.TextObject对象在设置文字的大小。
public CTPageBlock.TextObject addText(java.lang.String text, double x, double y, double fontSize)
text
- 展示的文本x
- 第一个字型绘制点在对象坐标系下的 X 坐标。计算后都是相对于Boundary的x。y
- 注意是baseline的地方 ;第一个字型绘制点在对象坐标系下的 y 坐标。计算后都是相对于Boundary的y。fontSize
- 字体大小样例代码如下:
page.addText("默认字体:宋体,5MM大小",20,30,5);
文字的填充颜色可设置fillColor参数。
public CTPageBlock.TextObject addText(java.lang.String text, double x, double y, double fontSize, CTColor fillColor, CTColor strokeColor)
text
- 展示的文本x
- 第一个字型绘制点在对象坐标系下的 X 坐标。计算后都是相对于Boundary的x。y
- 注意是baseline的地方 ;第一个字型绘制点在对象坐标系下的 y 坐标。计算后都是相对于Boundary的y。fontSize
- 字体大小fillColor
- 字体填充颜色strokeColor
- 字体勾边颜色样例代码如下:
CTColor color=new CTColor();
color.setValue("255 0 0");
page.addText("字体颜色",100,40,8,color,null);
文字的勾边颜色可设置strokeColor参数。方法同1.4文字颜色
样例代码如下:
CTColor color=new CTColor();
color.setValue("255 0 0");
CTColor color3=new CTColor();
color3.setValue("0 255 0");
page.addText("字体勾边颜色",80,100,18,color3,color);
文字方向可以设置 readDirection参数。
public CTPageBlock.TextObject addText(java.lang.String text, double x, double y, double fontSize, java.lang.Integer readDirection)
text
- 展示的文本x
- 第一个字型绘制点在对象坐标系下的 X 坐标。计算后都是相对于Boundary的x。y
- 注意是baseline的地方 ;第一个字型绘制点在对象坐标系下的 y 坐标。计算后都是相对于Boundary的y。fontSize
- 字体大小readDirection
- 阅读方向,指定了文字排列的方向, 默认值为0 目前只支持 0 90样例代码如下:
/*阅读方向设定*/
page.addText("阅读方向",20,40,5,90);
readDirection的参数可以参考:wiki.easyofd.cn/OFD标准/文字的表47 文字排列方向、阅读方向说明
OFD软件展示结果如下图:
注意:不建议通过注册字体方式使用字体,在第七小结(关于字体的一些说明)会详细说明。
与图片一样,通过OFDocument类的getOfdCommonData()就可以获取功OFD公共资源存储的管理类。该类除了字体存储功能外,还有其他指定该文档页面区域的默认大小和位置、模版页序列等功能,具体见OFD标准指南-7.5.1 文档公共数据结构
public int registerFont(java.lang.String FontName, java.lang.String fontPath)
FontName
- 字体的文件,注意是字体的名称,建议字体文件名称和字体名称一致fontPath
- 字体的存放路径样例代码如下:
/**
* 注册字体,该字体文件会被打包到ofd文件内
*/
int fontcalibriID=ofDocument.getOfdCommonData().registerFont("Calibri","font/Calibri.ttf");
样例代码如下:
int fontcalibriID=ofDocument.getOfdCommonData().registerFont("Calibri","font/Calibri.ttf");
/*设置默认字体*/
double fontSize=5;
Font font=new Font("Calibri",Font.PLAIN,(int) Util.mmToPoints((float)fontSize));
page.addText("Calibri:abcdefghijklmnopqrstuvwxyz",20,30,fontSize,fontcalibriID,font,null,null,null,null,null,null,null);
page.addText("Calibri:中文展示情况",110,30,fontSize,fontcalibriID,font,null,null,null,null,null,null,null);
public int addFont(java.lang.String fontName)
fontName
- 字型名 eg:楷体样例代码如下:
//ofd生成操作系统和展示系统都已经有的字体情况
int fontyaheiID=ofDocument.getOfdCommonData().addFont("微软雅黑");
Font font3=new Font("微软雅黑",Font.PLAIN,(int) Util.mmToPoints((float)fontSize));
page.addText("微软雅黑:abcdefghijklmnopqrstuvwxyz",20,60,fontSize,fontyaheiID,font3,null,null,null,null,null,null,null);
page.addText("微软雅黑:中文展示情况",110,60,fontSize,fontyaheiID,font3,null,null,null,null,null,null,null);
OFD软件展示结果如下图:
字体和图元的制作可以通过市面流行的字体工具进行,主要有FontCreator、Glyphs等。通过字体设计软件保留部分图元。例如湖北省的增值税发票就利用这种模式。
该字体文件的的结果如图:
与一般字体注册类似,我们也通过公共资源注册字体。同2.1注册字体。
样例代码如下:
/**
* 注册字体,该字体文件会被打包到ofd文件内
*/
int fontKaiTiID=ofDocument.getOfdCommonData().registerFont("KaiTi","font/KaiTi.ttf");
/*设置字体*/
double fontSize=5;
File file = new File("font/KaiTi.ttf");
Font font2 = Font.createFont(Font.TRUETYPE_FONT, file);
int size=(int) Util.mmToPoints((float)fontSize);
font2 = font2.deriveFont((float)size); // 设置字体大小
图元相关的字体文件注册完成后,我们就可以使用该字体下的图元了。
需要注意的是,我们不能在text参数内输入自己想要的文字了,必须把对应字体图元的Unicode值码给下面参数:
例如3.1 字体/图元制作的图片中“01234”的Unicode值对应的中文分别是“开日期校验”。
在传入参数是使用“01234”。
public CTPageBlock.TextObject addTextGlyph(java.lang.String text, double x, double y, double fontSize, long fontID, java.awt.Font font)
text
- 展示的文本x
- 第一个字型绘制点在对象坐标系下的 X 坐标。y
- 注意是baseline的地方 ;第一个字型绘制点在对象坐标系下的 y 坐标。fontSize
- 字号,单位为毫米fontID
- 引用资源文件中定义的字型的标识font
- 字体样例代码如下:
CTPageBlock.TextObject textObject= page.addTextGlyph("\uE001\uE00A !\"#$%&'()*+,-./0123456789:<=>?@",20,30,fontSize,fontKaiTiID,font2);
通过设置fillColor和strokeColor来设置图元的填充、勾边颜色。
public CTPageBlock.TextObject addTextGlyph(java.lang.String text, double x, double y, double fontSize, long fontID, java.awt.Font font, CTColor fillColor, CTColor strokeColor)
text
- 展示的文本x
- 第一个字型绘制点在对象坐标系下的 X 坐标。y
- 注意是baseline的地方 ;第一个字型绘制点在对象坐标系下的 y 坐标。fontSize
- 字号,单位为毫米fontID
- 引用资源文件中定义的字型的标识font
- 字体fillColor
- 填充颜色strokeColor
- 勾边颜色样例代码如下:
CTColor color=new CTColor();
color.setValue("255 0 0");
CTPageBlock.TextObject textObject2= page.addTextGlyph("ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abc;",20,50,fontSize,fontKaiTiID,font2,color,null);
在OFD文件中增加圆形文字,只需要使用addTextCircleAndTrans方法。该方法的参数如下:
public CTPageBlock.TextObject[] addTextCircleAndTrans(java.lang.String text, double x, double y, double r, double startAngle, double endAnagel, int direction)
text
- 文字x
- 圆形X坐标y
- 圆形Y坐标r
- 园的半径startAngle
- 开始角度 eg:90endAnagel
- 结束角度,结束角度必须大于开始角度 ,如果开始度数为180度 结束可以为360+90度 direction
- 绘制方向 1-顺时针绘制 2逆时针绘制样例代码如下:
page.addTextCircleAndTrans("某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某",140,50,24,90,440,1);
上述代码是圆心在(140,50),圆半径为24的圆线上绘制文字,开始度数是90度,结束度数是360+80 =440度。
只需要设置上述参数的 direction为2就可以逆时针绘制文字。
样例代码如下:
page.addTextCircleAndTrans("0123456789",140,120,24,45,135,2);
emsp; 设置文字大小、字体、颜色都可以通过一下参数来设置。
public CTPageBlock.TextObject[] addTextCircleAndTrans(java.lang.String text, double x, double y, double r, double startAngle, double endAnagel, int direction, float fontSize, int fontID, java.awt.Font font, CTColor fillColor, CTColor strokeColor, java.lang.Integer weight, java.lang.Boolean italic)
text
- 文字x
- 圆形X坐标y
- 圆形Y坐标r
- 园的半径startAngle
- 开始角度endAnagel
- 结束角度,结束角度必须大于开始角度direction
- 绘制方向 1-顺时针绘制 2逆时针绘制fontSize
- 字体大小fontID
- 资源中的字形IDfont
- java中的字体fillColor
- 填充颜色strokeColor
- 勾边颜色weight
- 文字对象的粗细值;可选取值为100,200,300,100,500,600,700,800,900 默认值为400italic
- 是否是斜体样式 默认fasle样例代码如下:
CTColor color=new CTColor();
color.setValue("255 0 0");
float fontSize= Util.FontSize ;
Font font=new Font("宋体",Font.PLAIN,(int)Util.mmToPoints((float)fontSize));
int fontID = ofDocument.getOfdCommonData().getDefaultFontid();
page.addTextCircleAndTrans("某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某",70,50,24,90,440,1,fontSize,fontID,font,color,null,null,null);
emsp; 参考4.3 文字大小设置文字大小、字体、颜色。
样例代码如下:
CTColor color=new CTColor();
color.setValue("255 0 0");
float fontSize= Util.FontSize ;
Font font=new Font("宋体",Font.PLAIN,(int)Util.mmToPoints((float)fontSize));
int fontID = ofDocument.getOfdCommonData().getDefaultFontid();
page.addTextCircleAndTrans("某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某",70,50,24,90,440,1,fontSize,fontID,font,color,null,null,null);
在OFD文件中增加椭圆文字,只需要使用addTextEllipseAndTrans方法。该方法的参数如下:
public CTPageBlock.TextObject[] addTextEllipseAndTrans(java.lang.String text, double x, double y, double a, double b, double startAngle, double endAnagel, int direction)
text
- 绘制的文本x
- 椭圆的心X坐标y
- 椭圆的心Y坐标a
- 椭圆的长轴b
- 椭圆的短轴startAngle
- 开始角度endAnagel
- 结束角度,结束角度必须大于开始角度direction
- 绘制方向 1-顺时针绘制 2逆时针绘制样例代码如下:
float fontSize= Util.FontSize ;
Font font=new Font("宋体",Font.PLAIN,(int)Util.mmToPoints((float)fontSize));
int fontID = ofDocument.getOfdCommonData().getDefaultFontid();
page.addTextEllipseAndTrans("某某某某某某某某某某某某某某某",40,30,20,15,90,450,1,fontSize,fontID,font,color2,null,null,null);
只需要设置上述参数的 direction为2就可以逆时针绘制文字
emsp; 设置文字大小、字体、颜色都可以通过一下参数来设置。
public CTPageBlock.TextObject[] addTextEllipseAndTrans(java.lang.String text, double x, double y, double a, double b, double startAngle, double endAnagel, int direction, double fontSize, long fontID, java.awt.Font font, CTColor fillColor, CTColor strokeColor, java.lang.Integer weight, java.lang.Boolean italic)
text
- 绘制的文本x
- 椭圆的心X坐标y
- 椭圆的心Y坐标a
- 椭圆的长轴b
- 椭圆的短轴startAngle
- 开始角度endAnagel
- 结束角度,结束角度必须大于开始角度direction
- 绘制方向 1-顺时针绘制 2逆时针绘制fontSize
- 字体大小fontID
- 资源中的字形IDfont
- java中的字体fillColor
- 填充颜色strokeColor
- 勾边颜色weight
- 文字对象的粗细值;可选取值为100,200,300,100,500,600,700,800,900 默认值为400italic
- 是否是斜体样式 默认fasle样例代码如下:
float fontSize= Util.FontSize ;
Font font=new Font("宋体",Font.PLAIN,(int)Util.mmToPoints((float)fontSize));
int fontID = ofDocument.getOfdCommonData().getDefaultFontid();
page.addTextEllipseAndTrans("某某某某某某某某某某某某某某某",40,30,20,15,90,450,1,fontSize,fontID,font,color2,null,null,null);
emsp; 参考5.3 文字大小设置文字大小、字体、颜色。
样例代码如下:
float fontSize= Util.FontSize ;
Font font=new Font("宋体",Font.PLAIN,(int)Util.mmToPoints((float)fontSize));
int fontID = ofDocument.getOfdCommonData().getDefaultFontid();
page.addTextEllipseAndTrans("某某某某某某某某某某某某某某某",40,30,20,15,90,450,1,fontSize,fontID,font,color2,null,null,null);
默认字体的配置在Util类的静态变量中。默认代码如下:
/**
* 默认字体大小五号,单位3.7MM 14像素
*/
public static float FontSize= 3.70f;
/**
* 默认字体 宋体
*/
public static String FontName="宋体";
/**
* 默认的字体 宋体 五号,单位3.7MM 14像素
*/
public static Font font=new Font(FontName,Font.PLAIN,14);
注意:一定要再使用文字前设置好你的默认字体。
字体文件ttf或ttc文件的中文字体一般情况下都是有点大的。如果把相应的字体文件也打包到OFD文件中,就会增加OFD文件的大小,因此是不建议这么操作的。
建议方式是在产生OFD文件的系统和查看的客户端都安装要使用的字体。如果不想在客户端安装字体,可以考虑通过图元方式,减少字体文件的大小,只把固定使用的字保存在字体ttf或ttc文件中,不过该方式支持的字体数量是有限的。
注意一:本软件默认字体为宋体,大小为14PT,3.70MM。请确保你使用的系统是有该字体。
注意二:本文中所有的单位除特殊说明外都MM。
系统支持的字体清单可以通过一下程序获取。
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font[] allFonts = ge.getAllFonts();
List<String> chineseFonts = new ArrayList<>();
for (Font font : allFonts) {
System.out.println(font.getFontName());
// // 检查字体名称是否包含中文字符
// if (font.getName().matches(".*[\u4e00-\u9fa5]+.*")) {
// chineseFonts.add(font.getFontName());
// }
}
// 输出所有找到的中文字体名称
for (String fontName : chineseFonts) {
System.out.println(fontName);
}
这里本文就不在熬述了,无论是windows系统还是其他unix系统都有相应的文章。无论如何,要正确使用和度量字体都要确保你使用的系统是注册且可以正确使用你要使用的字体。