java导出pdf_java生成pdf

这篇博客介绍了如何使用Java的iTextPDF库来创建PDF文件。首先通过Gradle引入了版本为5.5.13的iTextPDF依赖。接着展示了如何创建PDF文档,包括添加图片、设置字体、添加段落、插入点线分隔符以及添加页码。代码中还包含了生成随机编号和日期的方法。最后,虽然没有展示,但提到了可以扩展到从模板填充数据生成PDF的功能。
摘要由CSDN通过智能技术生成

java创建pdf

Meavn

com.itextpdf

itextpdf

5.5.13

Gradle

// https://mvnrepository.com/artifact/com.itextpdf/itextpdf

compile group: 'com.itextpdf', name: 'itextpdf', version: '5.5.13'

CreatePDF

package PDFUtil;

import com.itextpdf.text.*;

import com.itextpdf.text.pdf.*;

import com.itextpdf.text.pdf.draw.DottedLineSeparator;

import java.io.File;

import java.io.FileOutputStream;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Random;

public class CreatePDF {

public static void main(String[] args) throws Exception {

createPdfAdd1("12345667");

}

/**

* 创建pdf

* @param examjson

* @return

*/

public static String createPdfAdd1(String examjson){

//Map exam = JSONObject.parseObject(examjson, new TypeReference>() { });

String pathimg = "C:\\Users\\idea\\Pictures";

String path = "D:\\photos";

Integer paperid = 1;

String examPath = "";

try{

//创建文件

Document document = new Document();

//设置字体

BaseFont bfChinese = BaseFont.createFont();

//文件路径

examPath = path;

File files = new File(examPath);

if(! files.exists() && !files.isDirectory()) {//判断目录是否存在

files.mkdir();

}

//创建PDF

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(examPath+"/test.pdf"));

// 设置页面布局

writer.setViewerPreferences(PdfWriter.PageLayoutOneColumn);

// 页码

writer.setPageEvent(new PageXofYTest());

//打开文件

document.open();

//图片1

Image image1 = Image.getInstance(pathimg+"/1.jpg");

//设置图片的宽度和高度

//image1.scaleAbsolute(140, 40);

//将图片1添加到pdf文件中

document.add(image1);

//标题

Paragraph paragraph = new Paragraph(150);//段落的间距

//1 2 3 中右左

paragraph.setAlignment(1); //对齐方式

Font font = new Font(bfChinese);//字体

font.setSize(40);//字体大小

paragraph.setFont(font);//设置段落字体

Chunk chunk = new Chunk("Test");

paragraph.add(chunk);

document.add(paragraph);

Paragraph paragraph1 = new Paragraph(40);

//1 2 3 中右左

paragraph1.setAlignment(1); //对齐方式

Font font1 = new Font(bfChinese);//字体

font1.setSize(20);

paragraph1.setFont(font1);

Chunk chunk1 = new Chunk("Test1");

paragraph1.add(chunk1);

//paragraph1.setSpacingBefore(-15);

//paragraph1.setSpacingAfter(-50);//往下距离200

document.add(paragraph1);

//点线

DottedLineSeparator line = new DottedLineSeparator();

//下移5个单位

line.setOffset(-15);

//设置点之间的距离

//line.setGap(20);

document.add(line);

Paragraph paragraph3 = new Paragraph(150);

//1 2 3 中右左

paragraph3.setAlignment(1); //对齐方式

Font font3 = new Font(bfChinese);//字体

font3.setSize(12);

paragraph3.setFont(font3);

Chunk chunk3 = new Chunk("编号:"+getRandom(17));

paragraph3.add(chunk3);

paragraph3.setSpacingAfter(5);

document.add(paragraph3);

Paragraph paragraph4 = new Paragraph(15);

//1 2 3 中右左

paragraph4.setAlignment(1); //对齐方式

Font font4 = new Font(bfChinese);//字体

font4.setSize(12);

paragraph4.setFont(font4);

SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日");

Chunk chunk4 = new Chunk("文档生成日期:"+df.format(System.currentTimeMillis()));

paragraph4.add(chunk4);

paragraph4.setSpacingAfter(5);

document.add(paragraph4);

document.newPage(); //换页

Paragraph answerPar = new Paragraph(20);//标准答案

answerPar.setAlignment(3); //对齐方式

Font answerfont = new Font(bfChinese);//字体

answerfont.setSize(12);

answerPar.setFont(answerfont);

Chunk answerchunk = new Chunk(examjson);

answerPar.add(answerchunk);

answerPar.setSpacingAfter(5);

document.add(answerPar);

//关闭文档

document.close();

//关闭书写器

writer.close();

}catch(Exception e){

e.printStackTrace();

}

// ZIPUtil.compress(examPath,path+"/exam-"+paperid+".zip" );//压缩

System.out.println("完成");

return "ok";

}

/**

* 生成指定位数的随机数

* @param length

* @return

*/

public static String getRandom(int length){

String val = "";

Random random = new Random();

for (int i = 0; i < length; i++) {

val += String.valueOf(random.nextInt(10));

}

return val;

}

/**

* 抠模板

* @throws Exception

*/

/*public static void createAllPdf() throws Exception {

//填充创建pdf

PdfReader reader = null;

PdfStamper stamp = null;

try {

reader = new PdfReader("E:/module.pdf");

SimpleDateFormat simp = new SimpleDateFormat("yyyy-MM-dd");

String times = simp.format(new Date()).trim();

//创建生成报告名称

String root = "D:photos/";

if (!new File(root).exists())

new File(root).mkdirs();

File deskFile = new File(root, times + ".pdf");

stamp = new PdfStamper(reader, new FileOutputStream(deskFile));

//取出报表模板中的所有字段

AcroFields form = stamp.getAcroFields();

// 填充数据

form.setField("name", "zhangsan");

form.setField("sex", "男");

form.setField("age", "15");

//报告生成日期

SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");

String generationdate = dateformat.format(new Date());

form.setField("generationdate", generationdate);

stamp.setFormFlattening(true);

} catch (Exception e) {

e.printStackTrace();

} finally {

if (stamp != null) {

stamp.close();

}

if (reader != null) {

reader.close();

}

}

}*/

}

PageXofYTest

package PDFUtil;

import com.itextpdf.text.Document;

import com.itextpdf.text.ExceptionConverter;

import com.itextpdf.text.pdf.*;

import java.io.File;

//页码事件

public class PageXofYTest extends PdfPageEventHelper {

public PdfTemplate total;

public BaseFont bfChinese;

/**

* 重写PdfPageEventHelper中的onOpenDocument方法

*/

@Override

public void onOpenDocument(PdfWriter writer, Document document) {

// 得到文档的内容并为该内容新建一个模板

total = writer.getDirectContent().createTemplate(500, 500);

try {

String prefixFont = "";

String os = System.getProperties().getProperty("os.name");

if(os.startsWith("win") || os.startsWith("Win")){

prefixFont = "C:\\Windows\\Fonts" + File.separator;

}else {

prefixFont = "/usr/share/fonts/chinese" + File.separator;

}

// 设置字体对象为Windows系统默认的字体

//bfChinese = BaseFont.createFont(prefixFont + "simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

bfChinese = BaseFont.createFont();

} catch (Exception e) {

throw new ExceptionConverter(e);

}

}

/**

* 重写PdfPageEventHelper中的onEndPage方法

*/

@Override

public void onEndPage(PdfWriter writer, Document document) {

// 新建获得用户页面文本和图片内容位置的对象

PdfContentByte pdfContentByte = writer.getDirectContent();

// 保存图形状态

pdfContentByte.saveState();

String text ="www.rkpass.cn "+ writer.getPageNumber();

// 获取点字符串的宽度

float textSize = bfChinese.getWidthPoint(text, 15);

pdfContentByte.beginText();

// 设置随后的文本内容写作的字体和字号

pdfContentByte.setFontAndSize(bfChinese, 15);

// 定位'X/'

//System.out.println(document.right() +"...."+ document.left());

// float x = (document.right() + document.left())/2;

float x = (document.right()-150f);

float y = 20f;

pdfContentByte.setTextMatrix(x, y);

pdfContentByte.showText(text);

pdfContentByte.endText();

// 将模板加入到内容(content)中- // 定位'Y'

pdfContentByte.addTemplate(total, x + textSize, y);

pdfContentByte.restoreState();

}

/**

* 重写PdfPageEventHelper中的onCloseDocument方法

*/

/* @Override

public void onCloseDocument(PdfWriter writer, Document document) {

total.beginText();

try {

String prefixFont = "";

String os = System.getProperties().getProperty("os.name");

if(os.startsWith("win") || os.startsWith("Win")){

prefixFont = "C:\\Windows\\Fonts" + File.separator;

}else {

prefixFont = "/usr/share/fonts/chinese" + File.separator;

}

bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

total.setFontAndSize(bfChinese, 15);

} catch (DocumentException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

total.setTextMatrix(0, 0);

// 设置总页数的值到模板上,并应用到每个界面

total.showText(String.valueOf(writer.getPageNumber() - 1));

total.endText();

}*/

}

ZIPUtil

package PDFUtil;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream;

public class ZIPUtil {

//private static Logger logger = LoggerFactory.getLogger(ZIPUtil.class);

/**s

* 压缩文件

* @param srcFilePath 压缩源路径

* @param destFilePath 压缩目的路径

*/

public static void compress(String srcFilePath, String destFilePath) {

//

File src = new File(srcFilePath);

if (!src.exists()) {

throw new RuntimeException(srcFilePath + "不存在");

}

File zipFile = new File(destFilePath);

try {

FileOutputStream fos = new FileOutputStream(zipFile);

ZipOutputStream zos = new ZipOutputStream(fos);

String baseDir = "";

compressbyType(src, zos, baseDir);

zos.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 按照原路径的类型就行压缩。文件路径直接把文件压缩,

* @param src

* @param zos

* @param baseDir

*/

private static void compressbyType(File src, ZipOutputStream zos,String baseDir) {

if (!src.exists())

return;

// logger.info("压缩路径" + baseDir + src.getName());

//判断文件是否是文件,如果是文件调用compressFile方法,如果是路径,则调用compressDir方法;

if (src.isFile()) {

//src是文件,调用此方法

compressFile(src, zos, baseDir);

} else if (src.isDirectory()) {

//src是文件夹,调用此方法

compressDir(src, zos, baseDir);

}

}

/**

* 压缩文件

*/

private static void compressFile(File file, ZipOutputStream zos,String baseDir) {

if (!file.exists())

return;

try {

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

ZipEntry entry = new ZipEntry(baseDir + file.getName());

zos.putNextEntry(entry);

int count;

byte[] buf = new byte[1024];

while ((count = bis.read(buf)) != -1) {

zos.write(buf, 0, count);

}

bis.close();

} catch (Exception e) {

// TODO: handle exception

}

}

/**

* 压缩文件夹

*/

private static void compressDir(File dir, ZipOutputStream zos,String baseDir) {

if (!dir.exists())

return;

File[] files = dir.listFiles();

if(files.length == 0){

try {

zos.putNextEntry(new ZipEntry(baseDir + dir.getName()+File.separator));

} catch (IOException e) {

e.printStackTrace();

}

}

for (File file : files) {

compressbyType(file, zos, baseDir + dir.getName() + File.separator);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值