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();
}
}
// 打開文檔時,創(chuàng)建一個總頁數(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)文章
Mybatis+Druid+MybatisPlus多數(shù)據(jù)源配置方法
在項(xiàng)目開發(fā)中,經(jīng)常需要連接多個數(shù)據(jù)庫,使用Mybatis、Druid和MybatisPlus可以實(shí)現(xiàn)多數(shù)據(jù)源配置,通過定義配置類和修改配置文件,如properties或yaml,可以設(shè)置多個數(shù)據(jù)源,本文介紹了配置項(xiàng)包括Druid基本配置、數(shù)據(jù)源一、數(shù)據(jù)源二,感興趣的朋友一起看看吧2024-09-09
心動嗎?正大光明的免費(fèi)使用IntelliJ IDEA商業(yè)版
這篇文章主要介紹了正大光明的免費(fèi)使用IntelliJ IDEA商業(yè)版,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-02-02
Java刷題之最小k個數(shù)的思路及具體實(shí)現(xiàn)
這篇文章主要介紹了Java刷題之最小k個數(shù)的思路及具體實(shí)現(xiàn),最小K個數(shù)是一個經(jīng)典的top-K問題,可以通過整體排序、建立小根堆或大根堆的方式解決,排序方式時間復(fù)雜度較高,適合數(shù)據(jù)量小的場景,小根堆適合k較小的情況,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
Spring?Cloud?Sleuth?和?Zipkin?進(jìn)行分布式跟蹤使用小結(jié)
分布式跟蹤是一種機(jī)制,我們可以使用它跟蹤整個分布式系統(tǒng)中的特定請求,分布式跟蹤允許您跟蹤分布式系統(tǒng)中的請求,本文給大家介紹Spring?Cloud?Sleuth?和?Zipkin?進(jìn)行分布式跟蹤使用小結(jié),感興趣的朋友一起看看吧2022-03-03
Java8 新特性Lambda表達(dá)式實(shí)例詳解
這篇文章主要介紹了Java8 新特性Lambda表達(dá)式實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
SpringBoot+Mybatis-plus+shardingsphere實(shí)現(xiàn)分庫分表的方案
實(shí)現(xiàn)億級數(shù)據(jù)量分庫分表的項(xiàng)目是一個挑戰(zhàn)性很高的任務(wù),下面是一個基于Spring Boot的簡單實(shí)現(xiàn)方案,感興趣的朋友一起看看吧2024-03-03

