Java實(shí)現(xiàn)導(dǎo)出pdf格式文件的示例代碼
Java實(shí)現(xiàn)導(dǎo)出pdf |word |ppt 格式文件
controller層:
@ApiOperation("導(dǎo)出")
@GetMapping("/download")
public void download(@RequestParam("userId") Long userId ,HttpServletResponse response) {
reportResultService.generateWordXWPFDocument(userId,response);
}
serviceimpi層:
/**
* 下載word
* @param userId
* @param response
*/
// @Override
// public void generateWordXWPFDocument(Long userId,HttpServletResponse response) {
// try {
// XWPFDocument doc = new XWPFDocument();
// List<ReportDetail> ReportDetail = reportResultMapper.reportDetails(userId);
// createParagraph(doc, ReportDetail.get(0).getReport());
// response.reset();
// response.setContentType("application/octet-stream");
// response.setHeader("Content-disposition",
// "attachment;filename=user_word_" + System.currentTimeMillis() + ".docx");
// OutputStream os = response.getOutputStream();
// doc.write(os);
// os.close();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
/**
* 下載pdf
* @param userId
* @param response
*/
@Override
public void generateWordXWPFDocument(Long userId,HttpServletResponse response) {
try {
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename=user_pdf_" + System.currentTimeMillis() + ".pdf");
OutputStream os = response.getOutputStream();
// document
com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document, os);
// open
document.open();
List<ReportDetail> reportDetails = reportResultMapper.reportDetails(userId);
if (!reportDetails.isEmpty()) {
String report = reportDetails.get(0).getReport();
document.add(createParagraph(report));
}
document.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 下載word
* @param doc
* @param content
*/
private void createParagraph(XWPFDocument doc, String content) {
XWPFParagraph actType = doc.createParagraph();
XWPFRun runText2 = actType.createRun();
runText2.setText(content);
runText2.setFontSize(11);
// 設(shè)置段落對齊方式
actType.setAlignment(ParagraphAlignment.CENTER); // 居中對齊
actType.setVerticalAlignment(TextAlignment.CENTER); // 垂直居中對齊
}
/**
* 下載pdf
* @param content
* @return
* @throws IOException
* @throws DocumentException
*/
private com.itextpdf.text.Paragraph createParagraph(String content) throws IOException, DocumentException {
Font font = new Font(getBaseFont(), 12, Font.NORMAL);
Paragraph paragraph = new Paragraph(content, font);
paragraph.setAlignment(Element.ALIGN_LEFT);
paragraph.setIndentationLeft(12); //設(shè)置左縮進(jìn)
paragraph.setIndentationRight(12); //設(shè)置右縮進(jìn)
paragraph.setFirstLineIndent(24); //設(shè)置首行縮進(jìn)
paragraph.setLeading(20f); //行間距
paragraph.setSpacingBefore(5f); //設(shè)置段落上空白
paragraph.setSpacingAfter(10f); //設(shè)置段落下空白
return paragraph;
}
private BaseFont getBaseFont() throws IOException, DocumentException {
return BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
}
或者可以使用以下工具類實(shí)現(xiàn)
package com.zllms.common.utils.poi;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
/**
* @Author: wangjj
* @Date: 2020/11/4 15:53
* @Description pdf生成工具類
*/
@Slf4j
public class PdfCreateUtil {
/**
* @Author Yangy
* @Description 創(chuàng)建document
* @Date 16:24 2020/11/5
* @Param []
* @return com.itextpdf.text.Document
**/
public static Document getDocumentInstance(){
//此處方法可以初始化document屬性,document默認(rèn)A4大小
Document document = new Document();
return document;
}
/**
* @Author Yangy
* @Description 設(shè)置document基本屬性
* @Date 16:24 2020/11/5
* @Param [document]
* @return com.itextpdf.text.Document
**/
public static Document setDocumentProperties(Document document,String title,String author,String subject,String keywords,String creator){
// 標(biāo)題
document.addTitle(title);
// 作者
document.addAuthor(author);
// 主題
document.addSubject(subject);
// 關(guān)鍵字
document.addKeywords(keywords);
// 創(chuàng)建者
document.addCreator(creator);
return document;
}
/**
* @Author Yangy
* @Description 創(chuàng)建段落,可設(shè)置段落通用格式
* @Date 16:24 2020/11/5
* @Param []
* @return com.itextpdf.text.Paragraph
**/
public static Paragraph getParagraph(String content,Font fontStyle,int align,int lineIdent,float leading){
//設(shè)置內(nèi)容與字體樣式
Paragraph p = new Paragraph(content,fontStyle);
//設(shè)置文字居中 0=靠左,1=居中,2=靠右
p.setAlignment(align);
//首行縮進(jìn)
p.setFirstLineIndent(lineIdent);
//設(shè)置左縮進(jìn)
// p.setIndentationLeft(12);
//設(shè)置右縮進(jìn)
// p.setIndentationRight(12);
//行間距
p.setLeading(leading);
//設(shè)置段落上空白
p.setSpacingBefore(5f);
//設(shè)置段落下空白
p.setSpacingAfter(10f);
return p;
}
/**
* @Author Yangy
* @Description 獲取圖片
* @Date 16:39 2020/11/5
* @Param [imgUrl]
* @return com.itextpdf.text.Image
**/
public static Image getImage(String imgUrl,int align,int percent){
Image image = null;
try {
image = Image.getInstance(imgUrl);
} catch (BadElementException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//設(shè)置圖片位置
image.setAlignment(align);
//依照比例縮放
image.scalePercent(percent);
return image;
}
/**
* @Author Yangy
* @Description 創(chuàng)建表格
* @Date 16:43 2020/11/5
* @Param [dataList=數(shù)據(jù)集合,maxWidth=表格最大寬度,align=位置(0,靠左 1,居中 2,靠右)
* @return com.itextpdf.text.pdf.PdfPTable
**/
public static PdfPTable getTable(List<List<String>> dataList,int maxWidth,int align,Font font){
if(Objects.isNull(dataList) || dataList.size() == 0){
log.warn("data list is empty when create table");
return null;
}
int columns = dataList.get(0).size();
PdfPTable table = new PdfPTable(columns);
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(align);
//設(shè)置列邊框
table.getDefaultCell().setBorder(1);
//此處可自定義表的每列寬度比例,但需要對應(yīng)列數(shù)
// int width[] = {10,45,45};//設(shè)置每列寬度比例
// table.setWidths(width);
table.setHorizontalAlignment(Element.ALIGN_CENTER);//居中
//邊距:單元格的邊線與單元格內(nèi)容的邊距
table.setPaddingTop(1f);
//間距:單元格與單元格之間的距離
table.setSpacingBefore(0);
table.setSpacingAfter(0);
for (int i = 0; i < dataList.size(); i++) {
for (int j = 0; j < dataList.get(i).size(); j++) {
table.addCell(createCell(dataList.get(i).get(j),font));
}
}
return table;
}
/**
* @Author Yangy
* @Description 自定義表格列樣式屬性
* @Date 16:54 2020/11/5
* @Param [value, font]
* @return com.itextpdf.text.pdf.PdfPCell
**/
private static PdfPCell createCell(String value, Font font) {
PdfPCell cell = new PdfPCell();
//設(shè)置列縱向位置,居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//設(shè)置列橫向位置,居中
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setPhrase(new Phrase(value, font));
return cell;
}
/**
* @Author Yangy
* @Description 獲取自定義字體
* @Date 11:38 2020/11/6
* @Param [size=字大小, style=字風(fēng)格, fontFamily=字體, color=顏色]
* @return com.itextpdf.text.Font
**/
public static Font setFont(float size, int style, String fontFamily, BaseColor color)
throws IOException, DocumentException {
//設(shè)置中文可用
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(bfChinese,size,style);
font.setFamily(fontFamily);
font.setColor(color);
return font;
}
/**
* @Author Yangy
* @Description 創(chuàng)建水印設(shè)置
* @Date 12:04 2020/11/6
* @Param [markContent]
* @return xxx.xxx.data.util.PdfCreateUtil.Watermark
**/
public static Watermark createWaterMark(String markContent) throws IOException, DocumentException {
return new Watermark(markContent);
}
/**
* @Author Yangy
* @Description 設(shè)置水印
* @Date 12:03 2020/11/6
* @Param
* @return
**/
public static class Watermark extends PdfPageEventHelper {
Font FONT = PdfCreateUtil.setFont(30f, Font.BOLD, "",new GrayColor(0.95f));
private String waterCont;//水印內(nèi)容
public Watermark() throws IOException, DocumentException {
}
public Watermark(String waterCont) throws IOException, DocumentException {
this.waterCont = waterCont;
}
@Override
public void onEndPage(PdfWriter writer, Document document) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
ColumnText.showTextAligned(writer.getDirectContentUnder(),
Element.ALIGN_CENTER,
new Phrase(StringUtils.isEmpty(this.waterCont) ? "" : this.waterCont, FONT),
(50.5f + i * 350),
(40.0f + j * 150),
writer.getPageNumber() % 2 == 1 ? 45 : -45);
}
}
}
}
public static HeaderFooter createHeaderFooter(){
return new HeaderFooter();
}
/**
* @Author Yangy
* @Description 頁眉/頁腳
* @Date 12:25 2020/11/6
* @Param
* @return
**/
public static class HeaderFooter extends PdfPageEventHelper {
// 總頁數(shù)
PdfTemplate totalPage;
Font hfFont;
{
try {
hfFont = setFont(8, Font.NORMAL,"",BaseColor.BLACK);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 打開文檔時(shí),創(chuàng)建一個(gè)總頁數(shù)的模版
@Override
public void onOpenDocument(PdfWriter writer, Document document) {
PdfContentByte cb =writer.getDirectContent();
totalPage = cb.createTemplate(30, 16);
}
// 一頁加載完成觸發(fā),寫入頁眉和頁腳
@Override
public void onEndPage(PdfWriter writer, Document document) {
PdfPTable table = new PdfPTable(3);
try {
table.setTotalWidth(PageSize.A4.getWidth() - 100);
table.setWidths(new int[] { 24, 24, 3});
table.setLockedWidth(true);
table.getDefaultCell().setFixedHeight(-10);
table.getDefaultCell().setBorder(Rectangle.BOTTOM);
table.addCell(new Paragraph("我是頁眉/頁腳", hfFont));
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(new Paragraph("第" + writer.getPageNumber() + "頁/", hfFont));
// 總頁數(shù)
PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));
cell.setBorder(Rectangle.BOTTOM);
table.addCell(cell);
// 將頁眉寫到document中,位置可以指定,指定到下面就是頁腳
table.writeSelectedRows(0, -1, 50,PageSize.A4.getHeight() - 20, writer.getDirectContent());
} catch (Exception de) {
throw new ExceptionConverter(de);
}
}
// 全部完成后,將總頁數(shù)的pdf模版寫到指定位置
@Override
public void onCloseDocument(PdfWriter writer,Document document) {
String text = "總" + (writer.getPageNumber()) + "頁";
ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text,hfFont), 2, 2, 0);
}
}
}
到此這篇關(guān)于Java實(shí)現(xiàn)導(dǎo)出pdf格式文件的示例代碼的文章就介紹到這了,更多相關(guān)Java導(dǎo)出pdf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 中String和StringBuffer與StringBuilder的區(qū)別及使用方法
這篇文章主要介紹了java 中String和StringBuffer與StringBuilder的區(qū)別及使用方法的相關(guān)資料,在開發(fā)過程中經(jīng)常會用到String 這個(gè)類進(jìn)行操作,需要的朋友可以參考下2017-08-08
Shiro與Springboot整合開發(fā)的基本步驟過程詳解
這篇文章主要介紹了Shiro與Springboot整合開發(fā)的基本步驟,本文結(jié)合實(shí)例代碼給大家介紹整合過程,感興趣的朋友跟隨小編一起看看吧2023-06-06
Java Mail郵件發(fā)送如何實(shí)現(xiàn)簡單封裝
這篇文章主要介紹了Java Mail郵件發(fā)送如何實(shí)現(xiàn)簡單封裝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
SpringBoot中多環(huán)境啟動(dòng)配置的教程詳解
在SpringBoot項(xiàng)目的生命周期中,存在不同的環(huán)境,我們就需要針對不同環(huán)境制定不同名稱的配置文件,里面放置不同環(huán)境下所需的配置項(xiàng),下面小編就來和大家詳細(xì)講講SpringBoot如何進(jìn)行多環(huán)境啟動(dòng)配置的吧2024-02-02
Java中使用異或語句實(shí)現(xiàn)兩個(gè)變量的互換
這篇文章主要介紹了Java中使用異或語句實(shí)現(xiàn)兩個(gè)變量的互換,本文直接給出代碼實(shí)例以及運(yùn)行結(jié)果,需要的朋友可以參考下2015-06-06
基于Protobuf動(dòng)態(tài)解析在Java中的應(yīng)用 包含例子程序
下面小編就為大家?guī)硪黄赑rotobuf動(dòng)態(tài)解析在Java中的應(yīng)用 包含例子程序。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
Java8 實(shí)現(xiàn)stream將對象集合list中抽取屬性集合轉(zhuǎn)化為map或list
這篇文章主要介紹了Java8 實(shí)現(xiàn)stream將對象集合list中抽取屬性集合轉(zhuǎn)化為map或list的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02

