利用代码生成奖状pdf-中文版
- 1、图片模板
- 2、实现代码
- 3、生成模板(pdf文件截取)
1、图片模板
2、实现代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import static org.apache.pdfbox.pdmodel.font.PDType1Font.*;
public class MakeCerticate2 {
public static final String TEMP_PATH = "D:\\OA_Temp\\templates\\";
public static final String ATTRACH_PATH = "D:\\OA_Temp\\attachments\\pdf_attachs\\";
public static final String FONT_PATH = "C:\\Windows\\Fonts\\simhei.ttf";
public static void MakeCerticate2(){
try {
float width = 842,height = 595;
// 创建一个新的PDF文档
PDDocument document = new PDDocument();
// 创建一个 A4 大小的页面,并旋转 90 度使其变为横向
PDRectangle pageSizeLandscape = new PDRectangle(width, height);
PDPage page = new PDPage(pageSizeLandscape);
document.addPage(page);
// 加载图片-签章
PDImageXObject pdImage = PDImageXObject.createFromFile(TEMP_PATH + "CompanySeal.png", document);
// 加载图片-奖状
PDImageXObject pdImage2 = PDImageXObject.createFromFile(TEMP_PATH + "Certificate.jpg", document);
// 创建一个Date对象(这里使用当前时间作为示例)
Date date = new Date();
// 创建一个SimpleDateFormat对象并指定日期格式
SimpleDateFormat sdf = new SimpleDateFormat(" yyyy 年 MM 月 ");
String formattedDate = sdf.format(date);
// 创建一个新的内容流,以便向页面添加内容
PDPageContentStream contentStream = new PDPageContentStream(document, page);
File fontFile = new File(FONT_PATH); // 替换为你的字体文件路径
PDType0Font font = PDType0Font.load(document, fontFile);
float scale = 0.45f; // 缩放因子,如果图片太大可以调整这个值
// 奖状背景
contentStream.drawImage(pdImage2, 0, 0, width, height);
// 签章
contentStream.drawImage(pdImage, 550, 75, pdImage.getWidth() * scale, pdImage.getHeight() * scale);
// 设定起始位置
float startX = 50;
float startY = 700; // 在PDF中,Y坐标的0位于页面的底部,所以我们需要一个较高的值来从顶部开始
// 奖励内容
String text = "5月27日,山西太原。中北大学的一位学生因奶奶去世,向学院请假回家奔丧,“预计在家待五天”,班主任、教学科均同意申请," +
"但最终却遭学院老师李某某拒绝申请,她称“最多三天”。请假截图在网络流传后,网友纷纷指责学院老师没有人情味。5月29日,中北大学相关部门负责人告诉红星新闻," +
"李老师基于学业紧张、马上考试等原因,所以只批给了学生三天假,“老师考虑问题过于简单”。该负责人表示,目前学生已经回到家中,若学生有需要延长假期,通过家里跟班主任报备即可。" +
"对于学生在网上发帖一事,该负责人表示,发帖学生不会被处理。(红星新闻)";
text = " " + text;
int strLength = text.length();
int index = 0; //字符串下标
int rowNum = 330; //内容填充位置
int rowCount = 50;
while(index < strLength+rowCount){
String conStr;
if(strLength > index+rowCount){
conStr = text.substring(index,index+rowCount);
}else{
conStr = text.substring(index,strLength);
index = index +rowCount;
}
contentStream.beginText();
contentStream.setFont(font, 14); // 设置字体和大小
contentStream.newLineAtOffset(60, rowNum); // 设置起始位置(X, Y)
contentStream.showText(conStr);
contentStream.endText();
index = index + rowCount;
rowNum = rowNum - 15;
}
// 奖励对象
contentStream.beginText();
contentStream.setFont(font, 14);
contentStream.newLineAtOffset(60, 365); // 设置起始位置(X, Y)
contentStream.showText("你好,星期六!");
contentStream.endText();
// 公司
contentStream.beginText();
contentStream.setFont(font, 14);
contentStream.newLineAtOffset(560, 135);
contentStream.showText("这是一个公司名(中国)有限公司");
contentStream.endText();
// 年月
contentStream.beginText();
contentStream.setFont(font, 14);
contentStream.newLineAtOffset(615, 120);
contentStream.showText("年月:" + formattedDate);
contentStream.endText();
// pdf文件名
sdf = new SimpleDateFormat("yyyyMMdd HHmmss ");
formattedDate = sdf.format(date);
// 关闭内容流
contentStream.close();
// 保存PDF文档
document.save(new File(ATTRACH_PATH + formattedDate + "output.pdf"));
// 关闭文档
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MakeCerticate2();
}
}