最近用swing做了个工具,实现TXT到PDF的格式转换,其中有个功能是“封面设计器”,当然要求也不是很高,就是可以添加背景图片,可以添加横向和纵向的文本,文本字体可自定义,并且文本位置可拖动定位。
完成思路:
1.封面背景图片重写JPanel的paintComponent方法。
2.封面中文本使用JLabel组件,纵向增加<html>标签<br>换行
3.JLabel组件拖动使用MouseListener中的mouseDragged和mousePressed方法
4.由于swingJPanel中坐标是在左上角视为0,0,而pdf是左下为00,所以需要坐标转换。
5.PDF页面大小和背景图片大小可能不同,所以要以JLabel文本相对于页面的宽高比例去定位PDF的坐标
6.字体转换,swing字体转换为PDF字体,PDF采用加载本地TrueType 字体文件 (.ttf)的形式生成字体
7.PDF用itext生成(PdfContentByte)
效果图:
PDF效果图:
核心代码:
1.封面背景:
此部分代码来源于网络:
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
//如果设置了背景图片则显示
if(backgroundImage != null)
{
int width = this.getWidth();
int height = this.getHeight();
int imageWidth = backgroundImage.getWidth(this);
int imageHeight = backgroundImage.getHeight(this);
switch(modeIndex)
{
//居中
case 0:
{
int x = (width - imageWidth) / 2;
int y = (height - imageHeight) / 2;
g.drawImage(backgroundImage, x, y, this);
break;
}
//平铺
case 1:
{
for(int ix = 0; ix < width; ix += imageWidth)
{
for(int iy = 0; iy < height; iy += imageHeight)
{
g.drawImage(backgroundImage, ix, iy, this);
}
}
break;
}
//拉伸
case 2:
{
g.drawImage(backgroundImage, 0, 0, width, height, this);
break;
}
}
}
}
配合:backgroundImage.getScaledInstance(width, height, hints);来控制图片显示大小
2.JLabel纵向文本,JLabel大小自动适应
//设置纵向JLabel文本
private String setHtmlLabel(String text) {
if (text == null) {
return "";
}
String str="<html>";
char[] arr = text.toCharArray();
for (char c : arr) {
str=str+c+"<br>";
}
//System.out.println(str);
return str;
}
//设置JLable大小写
private void setVerticalLabelSize(JLabel label, java.awt.Font font) {
String text = label.getText();
if (text == null) {
return;
}
text=text.replaceAll("<html>","").replaceAll("<br>","");
FontMetrics fm = this.getFontMetrics(font);
int w = fm.stringWidth("位");
int y = text.toCharArray().length * (font.getSize()+font.getSize()/4);
label.setSize(w, y);
// System.out.println(text+"--"+y+"--"+font.getSize());
}
3.JLabel拖动功能,来源于网络
//拖动监听器
class DragListener extends MouseInputAdapter {
private JLabel dragComponet;
/** 坐标点 */
Point point = new Point(0, 0);
public DragListener(JLabel dragComponet) {
this.dragComponet = dragComponet;
}
/**
* 当鼠标拖动时触发该事件。 记录下鼠标按下(开始拖动)的位置。
*/
public void mouseDragged(MouseEvent e) {
// 转换坐标系统
Point newPoint = SwingUtilities.convertPoint(dragComponet, e.getPoint(), dragComponet.getParent());
// System.out.println(newPoint.x + " : " + newPoint.y);
// 设置标签的新位置
dragComponet.setLocation(dragComponet.getX()
+ (newPoint.x - point.x), dragComponet.getY()
+ (newPoint.y - point.y));
// 更改坐标点
point = newPoint;
}
/**
* 当鼠标按下时触发该事件。 记录下鼠标按下(开始拖动)的位置。
*/
public void mousePressed(MouseEvent e) {
// 得到当前坐标点
point = SwingUtilities.convertPoint(dragComponet, e.getPoint(),
dragComponet.getParent());
//System.out.println(e.getPoint().x + " : " + e.getPoint().y);
//System.out.println(point.x + " : " + point.y);
}
}
//添加监听
DragListener titleDragListener = new DragListener(titleLabel);
titleLabel.addMouseListener(titleDragListener);
titleLabel.addMouseMotionListener(titleDragListener);
5.获取swing字体对应的TrueType 字体文件 (.ttf)路径
/**
* 获取系统字体对应全路径Map
* @return
*/
public static Map<String, String> getFontPathMap() {
if (fontPathMap == null) {
fontPathMap = new HashMap<String, String>();
GraphicsEnvironment eq = GraphicsEnvironment.getLocalGraphicsEnvironment();
//设置字体路径
java.awt.Font[] fs = eq.getAllFonts();
if (fs != null) {
for (java.awt.Font f : fs) {
//获取TrueType 字体文件 (.ttf)路径
String fontFilePath = FontManager.getFontPath(true) + File.separator + FontManager.getFileNameForFontName(f.getFontName());
fontPathMap.put(f.getFontName(), fontFilePath);
}
}
}
return fontPathMap;
}
/*
* 根据swing字体生成PDF字体
*/
public static BaseFont getPdfBaseFont(java.awt.Font swingFont) {
String fontPath = getFontPathMap().get(swingFont.getFontName());
String defaultFontName = "STSong-Light";
String defaultEcoding = "UniGB-UCS2-H";
if (StringUtil.isNotBlank(fontPath)) {
if (fontPath.toLowerCase().endsWith(".ttf")) {
defaultFontName = fontPath;
defaultEcoding = BaseFont.IDENTITY_H;
}
//字体集
if (fontPath.toLowerCase().endsWith(".ttc")) {
defaultFontName = fontPath + ",1";//指定字体集中的第一个字体
defaultEcoding = BaseFont.IDENTITY_H;
}
}
BaseFont bBaseFont = null;
try {
bBaseFont = BaseFont.createFont(defaultFontName, defaultEcoding, false);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bBaseFont;
}
6.完成后封装成对象,使用itext生成PDF封面
import java.awt.Font;
import java.awt.Point;
/**
*封面显示文本类
* @author changxian
*/
public class CoverShowTextBean {
private String text;//文本内容
private Font font;//文本字体
private Point point;//文本位置(暂无用)
private double x_percent;//文本位置X相对图片宽度百分比
private double y_percent;//文本位置Y相对图片高度百分比
public static int MODEL_HORIZONTAL=0;
public static int MODEL_VERTICAL=1;
private int model=MODEL_HORIZONTAL;
public CoverShowTextBean(String text, Font font, Point point,int model) {
this.text = text;
this.font = font;
this.point = point;
this.model=model;
}
public CoverShowTextBean(String text, Font font, Point point) {
this(text,font,point,MODEL_HORIZONTAL);
}
public CoverShowTextBean() {
}
public Font getFont() {
return font;
}
public void setFont(Font font) {
this.font = font;
}
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public double getX(){
if(point!=null){
return point.getX();
}
return -1d;
}
public double getY(){
if(point!=null){
return point.getY();
}
return -1d;
}
/**
* 获取横坐标占页面宽度的百分比<=1,point.x/wallpaper_width
* @return double
*/
public double getX_percent() {
return x_percent;
}
public void setX_percent(double x_percent) {
this.x_percent = x_percent;
}
/**
* 获取纵坐标占页面高度的百分比<=1,point.y/wallpaper_height
* @return double
*/
public double getY_percent() {
return y_percent;
}
public void setY_percent(double y_percent) {
this.y_percent = y_percent;
}
public void setXPercent(double wallpaper_width){
this.setX_percent(getX()/wallpaper_width);
}
public void setYPercent(double wallpaper_height){
this.setY_percent(getY()/wallpaper_height);
}
public void setPositionPercent(double wallpaper_width,double wallpaper_height){
setXPercent(wallpaper_width);
setYPercent(wallpaper_height);
}
public int getModel() {
return model;
}
public void setModel(int model) {
this.model = model;
}
}
import java.util.ArrayList;
import java.util.List;
/**
*封面类
* @author changxian
*/
public class Cover {
private String imgPath;
private List<CoverShowTextBean> showTextList=new ArrayList<CoverShowTextBean>();
private boolean show;
public boolean isShow() {
return show;
}
public void setShow(boolean show) {
this.show = show;
}
public String getImgPath() {
return imgPath;
}
public void setImgPath(String imgPath) {
this.imgPath = imgPath;
}
public List<CoverShowTextBean> getShowTextList() {
return showTextList;
}
public void setShowTextList(List<CoverShowTextBean> showTextList) {
this.showTextList = showTextList;
}
}
生成PDF封面:
/**
* 生成封面
* @param writer
* @param doc
* @param cover
* @throws IOException
* @throws DocumentException
*/
public void setCover(PdfWriter writer, Document doc, Cover cover) throws IOException, DocumentException {
float doc_height = doc.getPageSize().getHeight();
float doc_width = doc.getPageSize().getWidth();
//封面
Image tImgCover = Image.getInstance(cover.getImgPath());
/* 设置图片的位置 */
tImgCover.setAbsolutePosition(0, 0);
/* 设置图片的大小 */
tImgCover.scaleAbsolute(doc_width, doc_height);
doc.add(tImgCover);//加载图片
PdfContentByte cb = writer.getDirectContent();
List<CoverShowTextBean> showTextList = cover.getShowTextList();
if (showTextList != null && !showTextList.isEmpty()) {
for (CoverShowTextBean show : showTextList) {
Double t_x = doc_width * show.getX_percent();
Double t_y = doc_height * show.getY_percent();
BaseFont bf = CommonUtil.getPdfBaseFont(show.getFont());
if (show.getModel() == CoverShowTextBean.MODEL_HORIZONTAL) {//横向文本
cb.beginText();
cb.setFontAndSize(bf, show.getFont().getSize());
//cb.showTextAligned(PdfContentByte.ALIGN_LEFT,cover.getTitle(), t_x.intValue(),doc_height-t_y.intValue(), 0);
//cb.setTextMatrix(doc_width, doc_width, doc_width, doc_width, doc_width, doc_width);
//System.err.println("X=" + t_x.intValue() + "--Y=" + (doc_height - t_y.intValue()));
cb.setTextMatrix(t_x.intValue(), doc_height - t_y.intValue() - show.getFont().getSize());
cb.showText(show.getText());
cb.endText();
} else {//纵向
String text = CommonUtil.removeHtmlSymbol(show.getText());
char[] textArr = text.toCharArray();
int j=show.getFont().getSize();
for (char c : textArr) {
cb.beginText();
cb.setFontAndSize(bf, show.getFont().getSize());
cb.setTextMatrix(t_x.intValue(),doc_height - t_y.intValue() - j);
cb.showText(c+"");
j = j + show.getFont().getSize();
cb.endText();
}
}
}
}
doc.add(new Paragraph(" "));
doc.newPage();
}
- 大小: 270.1 KB
- 大小: 135.4 KB
分享到:
相关推荐
swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3swing-layout-1.0.3...
在Java Swing中实现PDF阅读器是一项技术挑战,涉及到对PDF文件格式的理解、IO操作、Swing组件的使用以及可能的第三方库集成。 PDF(Portable Document Format)是一种广泛使用的文件格式,用于存储文档,包括文本...
Lucene索引查看工具 Luke。Luke 是查询LUCENE索引文件的工具, 而且用 Luke 的Search可以做查询。Luke is a handy development and diagnostic to Lucene.
基于Swing实现桌面级应用--排序算法器,它以可视化的方式进行八大排序算法的性能分析与图表绘制分析。涉及多线程操作 + 文件读写 + UI线程队列 + 设计模式。源码+文档+全部资料+高分项目.zip 【备注】 1、该项目是...
俄罗斯方块游戏-Java-Swing实现.zip俄罗斯方块游戏-Java-Swing实现.zip 俄罗斯方块游戏-Java-Swing实现.zip俄罗斯方块游戏-Java-Swing实现.zip 俄罗斯方块游戏-Java-Swing实现.zip俄罗斯方块游戏-Java-Swing实现.zip...
基于java+swing计算器设计与实现-课程设计报告.docx
Java课程设计-JavaSwing实现GUI诗词管理系统源码(高分项目),含有代码注释,满分大作业资源,新手也可看懂,期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。该项目可以作为课程设计期末大作业...
在给定的场景中,我们关注的是如何使用Java Swing来实现一个功能,即把Word文档转换为PDF文档。 首先,理解这个任务的背景,我们需要知道Word和PDF是两种常见的文档格式,各有其特点。Word文档通常用于编辑和格式化...
Charles Wilcoxon was best known as a teacher and for his numerous ... His most widely used works are The All American Drummer, Rudimental Swing Solos, Wrist and Finger Control and The Drummer on Parade.
然而,随着应用的复杂度增加,查找特定界面元素的代码变得困难,而Swing-inspector正是为解决这一问题而设计的。 Swing-inspector的工作原理是通过分析运行时的Swing组件树,将界面上的每个元素与源代码中的相应...
课程设计-JavaSwing+mysql-管理系统源码+文档说明(高分项目),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用...
- Swing 遵循MVC设计模式,其中组件(视图)与数据(模型)分离,通过控制器进行通信。例如,JTable组件的模型可以是DefaultTableModel,视图是JTable本身,而控制器则是TableColumnModel和TableListener。 5. **...
深入浅出JAVASwing程序设计.pdf
swing-layout-1.0.4.jar是org.jdesktop.layout,org.jdesktop.layout.GroupLayout类的工具jar包
根据提供的文件信息,可以看出标题与描述提及的是关于Java Swing程序设计的内容,但给出的部分内容实际上是一封具有幽默性质的情侣间的通信,并未涉及任何Swing编程的信息。因此,本回答将依据标题和描述中提到的...
6. **可定制性(Customizability)**:Swing组件可以通过继承和覆盖方法进行自定义,以满足特定需求。 7. **国际化(Internationalization)**:Swing支持多语言,允许应用适应不同地区的用户。 8. **Swing小部件...
Java课程设计-学生成绩管理系统-Swing+MySQL.zipJava课程设计-学生成绩管理系统-Swing+MySQL.zipJava课程设计-学生成绩管理系统-Swing+MySQL.zipJava课程设计-学生成绩管理系统-Swing+MySQL.zipJava课程设计-学生...
Swing界面设计灵活,允许开发者自定义组件外观和交互方式,因此MyEditor能够实现定制化的用户体验。 在MyEditor中,JMenu组件被用于构建菜单栏,这是大多数文本编辑器的标准配置。JMenu允许用户通过点击菜单项执行...
《深入理解Aspect-Swing-Worker-1.1.jar在Java编程中的应用》 在Java开发领域,库文件的使用是提升代码效率、实现特定功能的关键。今天我们将深度探讨"aspect-swing-worker-1.1.jar.zip"这个压缩包,它包含了一个名...