java利用iText写pdf并上传阿里云OSS并下载

iText是用于生成pdf的一个类库,通过它可以生成pdf或者将XML , HTML转换城pdf模版;阿里云的oss对象存储存储的类型比较多了,可以存储音频 图片 pdf excel 等资源,oss本质上来说是写api,在这次介绍中会将一些相关api写出来方便有需求的同学直接在开发使用。

首先将pdf模版贴出来

iText 和 阿里云OSS 的坐标:

   <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.10</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-asian</artifactId>
        <version>5.2.0</version>
    </dependency>
    <!--aliyun -->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>2.8.2</version>
    </dependency>

说一下实现思路:
1.首先使用iText写出pdf模版
2.将pdf写出到web项目的临时虚拟目录中,通过 System.getProperty(“java.io.tmpdir”) 来完成,下面详细描述
3.去虚拟目录读取pdf自定义模版,将pdf上传到阿里云的OSS

实现思路说完了下面我们来按照思路一步一步去实现:

  1. 首先实现第一步写出自定义的pdf模版,在这里要说一下就是我没有使用pdfTable去写,因为业务场景不要求pdfTable的需要段落的 Paragraph,如果有这种需求的同学可以留言我会将pdftable更新到这篇博客中。
  2. 在这里说一下api的一些关键对象
BaseFont设置pdf的基础背景样
Font应用BaseFont使设置的背景样式
Paragraph段落对象, Paragraph继承自Phase,默认是换行的
PhasePhrase本质上是由Chunk块组成的字符串
Rectangle设置自定义pdf模版的大小以及四周间距,可以去看源码,能够从构造方法上体现出来
ChunkChunk是IText最小的文本编辑单元,不能再拆分更小的单元了,其他高级的文本对象都是基于Chunk来构建的,请看下面代码体现
Document文档对象,这个对象的作用是将段落(Paragraph)或者pdf的表格(PdfTable)写进文档中,最后再把文档对象放入PdfWriter中
PdfTablepdf表格对象,pdf中只要涉及表格操作都会用到此对象
PdfWriter将写好的Document放到PdfWriter对象中并写出到页面或者本地
System.getProperty(“java.io.tmpdir”)虚拟文件夹,可以参考System.getProperty(“java.io.tmpdir”)的api


pdf自定义模版实现类:对于文档的内容部分做了部分修改,因为涉及公司的一些业务,所以改了模版部分内容为test,类中pdf主要实现的功能(1)设置pdf行间距,(2)设置pdf模版文字下面的下划线,(3)设置模版中同一行两种字体和两种颜色,(4)设置同一行左右对其,(5)如果在main方法中运行会在系统中生成一个临时虚拟文件夹;如果在web项目中会在项目中生成一个临时的虚拟文件夹。本类实现了所说的这些功能,详情请看下面代码实现:

import com.itextpdf.awt.AsianFontMapper;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;
 
 
public class PdfDesigner {
    // 临时文件夹获取java system变量中的临时路径,在web项目中是容器的temp文件夹,如果直接运行是系统临时文件夹.
    private static final String FILE_PATH_TEMPLATE = System.getProperty("java.io.tmpdir") + "/tempdf/%s";
 
    public File designer() {
 
        // 输出文件
        File outFile = null;
        try {
            //生成临时文件位置,存储到 java.io.tmpdir 下
            outFile = new File(String.format(FILE_PATH_TEMPLATE, UUID.randomUUID() + ".pdf"));
            //如果不存在临时文件夹,则创建文件夹
            if (!outFile.getParentFile().exists()) {
                outFile.getParentFile().mkdirs();
            }
            System.out.println("临时文件所在位置:——" + outFile.getPath());
            FileOutputStream outputStream = new FileOutputStream(outFile);
            Rectangle rectangle = new Rectangle(PageSize.A4);
            //1.创建文档 并设置四周边距
            Document document = new Document(rectangle, 40, 40, 40, 40);
            //2.新建pdf实例 输出到本地文件目录
//            PdfWriter.getInstance(document, new FileOutputStream(new File("H:/信用管理服务协议.pdf")));
            // 将 pdf 输出到页面
//            response.setContentType("application/octet-stream;charset=UTF-8");
//            OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
            //PDFWriter可以将文档存成PDF文件;HtmlWriter可以将文档存成html文件
            PdfWriter.getInstance(document, outputStream);
            //3.打开文档 无论输出到本地还是 页面都要打开文档
            document.open();
            // 设置pdf的基础样式;参数1:(1)使用iText中的字体,字体类行为宋体,(2)使用资源字体classpath:/SIMYOU.TTF (3)使用windows系统字体C:/Windows/Fonts/SIMYOU.TTF
            BaseFont baseFont = BaseFont.createFont(AsianFontMapper.ChineseSimplifiedFont, AsianFontMapper.ChineseSimplifiedEncoding_H, BaseFont.NOT_EMBEDDED);
            // 文档标题对应的样式 参数1:相当于字体(宋体) 参数2:字体大小 参数3:是否加粗,斜体 参数4:字体颜色
            Font headerFont = new Font(baseFont, 20, Font.NORMAL, BaseColor.BLACK);
            // headerParagraph  文档标题 
            Paragraph headerParagraph = new Paragraph("信息服务协议", headerFont);
            ///文字居中
            headerParagraph.setAlignment(Paragraph.ALIGN_CENTER);
            //将添加到文档中
            document.add(headerParagraph);
            // 副标题对应的值:协议编号
            String agreementSerialNumber = "8369757";
            //设置文档副标题  参数1:基础样式  参数2:字体大小  参数3:字体类型正常  参数4:字体颜色
            Font headerSubtitlefont = new Font(baseFont, 10, Font.NORMAL, BaseColor.BLACK);
            //构建一个段落 可构建可不构建 参数1:生成标的段落名称  参数2:为此标题单独设置的样式
            Paragraph header2Paragraph = new Paragraph("协议编号" + ":" + agreementSerialNumber, headerSubtitlefont);
            //设置段落文字居右
            header2Paragraph.setAlignment(Paragraph.ALIGN_RIGHT);
            //设置行间距
            header2Paragraph.setLeading(29f);
            //将副标题加入到文档中
            document.add(header2Paragraph);
            //设置段落字体 参数1:设置基础样式 参数2:设置字体大小  参数2:字体正常字体 参数4:设置字体颜色为黑色
            Font paragraphHeaderFont = new Font(baseFont, 10, Font.NORMAL, BaseColor.BLACK);
            // 使用公共样式不单独设置段落样式
            Paragraph paragraph = new Paragraph();
            Font fontStyle = new Font(baseFont, 10, Font.BOLD, BaseColor.BLACK);
            Chunk c1 = new Chunk("本信用管理服务协议(下称“本协议”)由以下双方于 ", paragraphHeaderFont);
            Chunk c2 = new Chunk("2017", fontStyle);
            Chunk c3 = new Chunk(" 年 ", paragraphHeaderFont);
            Chunk c4 = new Chunk("06", fontStyle);
            Chunk c5 = new Chunk("月", paragraphHeaderFont);
            Chunk c6 = new Chunk("21", fontStyle);
            Chunk c7 = new Chunk("日在中华人民共和国北京市签订并履行:", paragraphHeaderFont);
            // 设置下划线
            c2.setUnderline(0.1f, -1f);
            c4.setUnderline(0.1f, -1f);
            c6.setUnderline(0.1f, -1f);
            paragraph.add(c1);
            paragraph.add(c2);
            paragraph.add(c3);
            paragraph.add(c4);
            paragraph.add(c5);
            paragraph.add(c6);
            paragraph.add(c7);
            document.add(paragraph);
 
            Paragraph paragraph1 = new Paragraph();
            Chunk c8 = new Chunk("甲方(借款人):", paragraphHeaderFont);
            Chunk c9 = new Chunk("韩信", fontStyle);
            c9.setUnderline(0.1f, -1f);
            paragraph1.add(c8);
            paragraph1.add(c9);
            document.add(paragraph1);
 
            Paragraph paragraph2 = new Paragraph();
            Chunk c10 = new Chunk("用户 ID :", paragraphHeaderFont);
            Chunk c11 = new Chunk("12138", fontStyle);
            c11.setUnderline(0.1f, -1f);
            paragraph2.add(c10);
            paragraph2.add(c11);
            document.add(paragraph2);
 
            Paragraph paragraph4 = new Paragraph();
            Chunk c14 = new Chunk("身份证号码:", paragraphHeaderFont);
            Chunk c15 = new Chunk("152326199010267876", fontStyle);
            c15.setUnderline(0.1f, -1f);
            paragraph4.add(c14);
            paragraph4.add(c15);
            document.add(paragraph4);
 
            Paragraph paragraph5 = new Paragraph();
            Chunk c16 = new Chunk("现居住址:", paragraphHeaderFont);
            Chunk c17 = new Chunk("北京市大兴区龙河路", fontStyle);
            c17.setUnderline(0.1f, -1f);
            paragraph5.add(c16);
            paragraph5.add(c15);
            document.add(paragraph5);
 
            Paragraph paragraph6 = new Paragraph();
            Chunk c18 = new Chunk("联系电话:", paragraphHeaderFont);
            Chunk c19 = new Chunk("15149006403", fontStyle);
            c19.setUnderline(0.1f, -1f);
            paragraph6.add(c18);
            paragraph6.add(c19);
            document.add(paragraph6);
 
            Paragraph p7 = new Paragraph("乙方:test", paragraphHeaderFont);
            // 添加空行
            p7.setLeading(50);
            document.add(p7);
 
            Paragraph p8 = new Paragraph("地址:test test", paragraphHeaderFont);
            p8.setLeading(20);
            document.add(p8);
 
            Paragraph p9 = new Paragraph("联系电话: test", paragraphHeaderFont);
            p9.setLeading(20);
            document.add(p9);
 
            Paragraph p10 = new Paragraph("鉴于:", paragraphHeaderFont);
            // 添加空行
            p10.setLeading(50);
            document.add(p10);
 
            Paragraph p11 = new Paragraph("1. test,test,test;", paragraphHeaderFont);
            p11.setLeading(20);
            document.add(p11);
 
            Paragraph p12 = new Paragraph("2. test,test,test、test、test;test,test。", paragraphHeaderFont);
            p12.setLeading(20);
            document.add(p12);
 
            Paragraph p13 = new Paragraph("第一条 释义", paragraphHeaderFont);
            p13.setLeading(35);
            document.add(p13);
 
            Paragraph p14 = new Paragraph("1. 服务费:test、test,test、test,test;", paragraphHeaderFont);
            p14.setLeading(20);
            document.add(p14);
 
            Paragraph p15 = new Paragraph("2. 借款人:test,test,test《test》test,test;", paragraphHeaderFont);
            p15.setLeading(20);
            document.add(p15);
 
            Paragraph p16 = new Paragraph("3. 出借人:test,独立承担本协议项下权利义务的自然人,test《test》test,test;", paragraphHeaderFont);
            p16.setLeading(20);
            document.add(p16);
 
            Paragraph p17 = new Paragraph("4. 个人借款协议:test《test》;", paragraphHeaderFont);
            p17.setLeading(20);
            document.add(p17);
 
            Paragraph p18 = new Paragraph("5. 服务期:test。", paragraphHeaderFont);
            p18.setLeading(20);
            document.add(p18);
 
            Paragraph p19 = new Paragraph("第二条 甲方需求:借款金额、期限、借款类型", paragraphHeaderFont);
            p19.setLeading(35);
            document.add(p19);
 
            Paragraph p20 = new Paragraph();
            Chunk c20 = new Chunk("1. test(大写):", paragraphHeaderFont);
            Chunk c21 = new Chunk("八万八千八百", fontStyle);
            Chunk c22 = new Chunk("  (RMB  ", paragraphHeaderFont);
            Chunk c23 = new Chunk("80000", fontStyle);
            Chunk c24 = new Chunk("  元)", fontStyle);
            c21.setUnderline(0.1f, -1f);
            c23.setUnderline(0.1f, -1f);
            p20.add(c20);
            p20.add(c21);
            p20.add(c22);
            p20.add(c23);
            p20.add(c24);
            document.add(p20);
 
 
            Paragraph p21 = new Paragraph();
            Chunk c25 = new Chunk("2. 借款期限为", paragraphHeaderFont);
            Chunk c26 = new Chunk("12期", fontStyle);
            Chunk c27 = new Chunk(",test;", paragraphHeaderFont);
            c26.setUnderline(0.1f, -1f);
            p21.add(c25);
            p21.add(c26);
            p21.add(c27);
            document.add(p21);
 
 
            Paragraph p22 = new Paragraph();
            Chunk c28 = new Chunk("3. 甲方按照:", paragraphHeaderFont);
            Chunk c29 = new Chunk("等额本息", fontStyle);
            Chunk c30 = new Chunk("  test,test(大写):", paragraphHeaderFont);
            Chunk c31 = new Chunk("八万八千八百八十八", fontStyle);
            Chunk c32 = new Chunk("  (RMB", paragraphHeaderFont);
            Chunk c33 = new Chunk("88888", fontStyle);
            Chunk c34 = new Chunk("  元).", paragraphHeaderFont);
            c29.setUnderline(0.1f, -1f);
            c31.setUnderline(0.1f, -1f);
            c33.setUnderline(0.1f, -1f);
            p22.add(c28);
            p22.add(c29);
            p22.add(c30);
            p22.add(c31);
            p22.add(c32);
            p22.add(c33);
            p22.add(c34);
            document.add(p22);
 
            Paragraph p23 = new Paragraph("第三条 test", paragraphHeaderFont);
            p23.setLeading(35);
            document.add(p23);
 
            Paragraph p24 = new Paragraph("1. test;", paragraphHeaderFont);
            p24.setLeading(20);
            document.add(p24);
 
            Paragraph p25 = new Paragraph("2. test、有效、合法,不存在任何虚假、遗漏或隐瞒,test《test》test、合法、有效;test,test;", paragraphHeaderFont);
            p25.setLeading(20);
            document.add(p25);
 
            Paragraph p26 = new Paragraph("3. test;", paragraphHeaderFont);
            p26.setLeading(20);
            document.add(p26);
 
            Paragraph p27 = new Paragraph("4. test;", paragraphHeaderFont);
            p27.setLeading(20);
            document.add(p27);
 
            Paragraph p28 = new Paragraph("5. 甲方同意,,,,;", paragraphHeaderFont);
            p28.setLeading(20);
            document.add(p28);
 
            Paragraph p29 = new Paragraph("6. 甲方同意,如甲方在履行《test》,;", paragraphHeaderFont);
            p29.setLeading(20);
            document.add(p29);
 
            Paragraph p30 = new Paragraph("7. 对于甲方与出借人签订的《test》,;,.", paragraphHeaderFont);
            p30.setLeading(20);
            document.add(p30);
 
            Paragraph p31 = new Paragraph("第四条 test", paragraphHeaderFont);
            p31.setLeading(35);
            document.add(p31);
 
            Paragraph p32 = new Paragraph("1. test,,、;", paragraphHeaderFont);
            p32.setLeading(20);
            document.add(p32);
 
            Paragraph p33 = new Paragraph("2. test,test,test,test;", paragraphHeaderFont);
            p33.setLeading(20);
            document.add(p33);
 
            Paragraph p34 = new Paragraph("3. test;", paragraphHeaderFont);
            p34.setLeading(20);
            document.add(p34);
 
 
            Paragraph p35 = new Paragraph("4. 对于其他各类信息,test,test。", paragraphHeaderFont);
            p35.setLeading(20);
            document.add(p35);
 
            Paragraph p36 = new Paragraph("第五条 服务方式", paragraphHeaderFont);
            p36.setLeading(35);
            document.add(p36);
 
            Paragraph p37 = new Paragraph();
            Chunk c35 = new Chunk("1. test、test,test,test;并且乙方会在《test》test test,test,test、test。test,test(大写):", paragraphHeaderFont);
            Chunk c36 = new Chunk("八万九千", fontStyle);
            Chunk c37 = new Chunk("  (RMB ", paragraphHeaderFont);
            Chunk c38 = new Chunk("89000", fontStyle);
            Chunk c39 = new Chunk("  元) ", paragraphHeaderFont);
            c36.setUnderline(0.1f, -1f);
            c38.setUnderline(0.1f, -1f);
            p37.add(c35);
            p37.add(c36);
            p37.add(c37);
            p37.add(c38);
            p37.add(c39);
            document.add(p37);
 
 
            Paragraph p38 = new Paragraph("2. 书面申请:test,test;", paragraphHeaderFont);
            p38.setLeading(20);
            document.add(p38);
 
            Paragraph p39 = new Paragraph("3. 如甲方提前还款,test(补偿金),test,费用计算方式如下:", paragraphHeaderFont);
            p39.setLeading(20);
            document.add(p39);
 
            Paragraph p40 = new Paragraph("a)test=test x0.5%", paragraphHeaderFont);
            p40.setLeading(20);
            document.add(p40);
 
 
            Paragraph p41 = new Paragraph("b)test=test x1.5%", paragraphHeaderFont);
            p41.setLeading(20);
            document.add(p41);
 
 
            Paragraph p42 = new Paragraph("第七条 test", paragraphHeaderFont);
            p42.setLeading(35);
            document.add(p42);
 
 
            Paragraph p43 = new Paragraph("test 24 点前,test,test。test《test》test。test,test:A.test;B.test;C.test;D.test。test:", paragraphHeaderFont);
            p43.setLeading(20);
            document.add(p43);
 
 
            Paragraph p44 = new Paragraph("1. 逾期罚息:test(test)的 0.1%test(test),test。test。", paragraphHeaderFont);
            p44.setLeading(20);
            document.add(p44);
 
 
            Paragraph p45 = new Paragraph("2. test:test 0.5%test,每月单独计算,test。", paragraphHeaderFont);
            p45.setLeading(20);
            document.add(p45);
 
 
            Paragraph p46 = new Paragraph("第八条 test", paragraphHeaderFont);
            p46.setLeading(20);
            document.add(p46);
 
 
            Paragraph p47 = new Paragraph("1. test《test》test(下称“主还款账户”),《委托扣款授权书》中所列示的银行账户为甲方用于还款的备用账户(下称“备用还款账户”),主还款账户和备用还款账户统称为“还款账户”。test《个人借款协议》和本协议项下的应还、test。", paragraphHeaderFont);
            p47.setLeading(20);
            document.add(p47);
 
            Paragraph p48 = new Paragraph("2. test《test》test,test,须在还款日前至少 5 test,并签订《test》。否则因此导致甲方未能实现及时还款,并因此导致的逾期违约金和罚息由甲方承担。", paragraphHeaderFont);
            p48.setLeading(20);
            document.add(p48);
 
 
            Paragraph p49 = new Paragraph("3. 在还款过程中,甲方有义务配合为达成还款而进行的包括但不限于账户验证、账户变更、身份验证等事项,test、test。", paragraphHeaderFont);
            p49.setLeading(20);
            document.add(p49);
 
            Paragraph p50 = new Paragraph("第九条 违约规定", paragraphHeaderFont);
            p50.setLeading(35);
            document.add(p50);
 
 
            Paragraph p51 = new Paragraph("test,使得本协议的全部或部分不能履行,test,并赔偿对方因此遭受的损失(test);如双方均违约,test:", paragraphHeaderFont);
            p51.setLeading(20);
            document.add(p51);
 
 
            Paragraph p52 = new Paragraph("test。test。", paragraphHeaderFont);
            p52.setLeading(20);
            document.add(p52);
 
 
            Paragraph p53 = new Paragraph("test,test,包含但不限于甲方本人、test、居住地址、住所电话、手机号码、电子邮箱的变更。test。", paragraphHeaderFont);
            p53.setLeading(20);
            document.add(p53);
 
            Paragraph p54 = new Paragraph("第十一条 合同生效", paragraphHeaderFont);
            p54.setLeading(35);
            document.add(p54);
 
            Paragraph p56 = new Paragraph("1. test,test。test《test》test;", paragraphHeaderFont);
            p56.setLeading(20);
            document.add(p56);
 
 
            Paragraph p57 = new Paragraph("2. test、test,test,test,test。", paragraphHeaderFont);
            p57.setLeading(20);
            document.add(p57);
 
 
            Paragraph p58 = new Paragraph("第十二条 test", paragraphHeaderFont);
            p58.setLeading(35);
            document.add(p58);
 
 
            Paragraph p59 = new Paragraph("1. test、复印件、test;", paragraphHeaderFont);
            p59.setLeading(20);
            document.add(p59);
 
 
            Paragraph p60 = new Paragraph("2. 甲乙双方均确认,本协议的签订、test。test,test,test;", paragraphHeaderFont);
            p60.setLeading(20);
            document.add(p60);
 
 
            Paragraph p61 = new Paragraph("3. test,应友好协商解决;如协商无法达成一致,test,test,test;", paragraphHeaderFont);
            p61.setLeading(20);
            document.add(p61);
 
 
            Paragraph p62 = new Paragraph("4. 本协议一式两份,test,test。", paragraphHeaderFont);
            p62.setLeading(20);
            document.add(p62);
 
 
            //文档副标题
            Font headerSubtitlefont1 = new Font(baseFont, 10, Font.NORMAL, BaseColor.BLACK);
            //构建一个段落 可构建可不构建 生成标的段落
            Paragraph p63 = new Paragraph("(以下无正文)", headerSubtitlefont1);
            //文字居右
            p63.setAlignment(Paragraph.ALIGN_CENTER);
            //设置行间距
            p63.setLeading(20);
            // 设置此段落距离前面的长度
//            p63.setSpacingAfter(300);
            // 设置此段落距离后面的长度
//            p63.setSpacingBefore(300);
            document.add(p63);
 
 
            Paragraph p64 = new Paragraph("协议各方签字/盖章", paragraphHeaderFont);
            p64.setLeading(20);
            document.add(p64);
 
 
            Paragraph p65 = new Paragraph();
            Chunk c40 = new Chunk("甲方: ", paragraphHeaderFont);
            Chunk c43 = new Chunk("韩信", fontStyle);
//            Chunk c46 = new Chunk("乙方 :",paragraphHeaderFont);
//            Chunk c47 = new Chunk("北京寰玥国际投资管理有限公司",paragraphHeaderFont);
            c43.setUnderline(0.1f, -1f);
            p65.setAlignment(Paragraph.ALIGN_LEFT);
            p65.add(c40);
            p65.add(c43);
//            p65.add(c46);
//            p65.add(c47);
            document.add(p65);
 
 
            Paragraph p66 = new Paragraph();
            Chunk c46 = new Chunk("乙方 :", paragraphHeaderFont);
            Chunk c47 = new Chunk("test", paragraphHeaderFont);
            p66.setAlignment(Paragraph.ALIGN_RIGHT);
            p66.add(c46);
            p66.add(c47);
            document.add(p66);
 
 
            Paragraph p67 = new Paragraph();
            Chunk c48 = new Chunk("签章: ", paragraphHeaderFont);
            p67.setAlignment(Paragraph.ALIGN_LEFT);
            p67.add(c48);
            document.add(p67);
 
 
            Paragraph p68 = new Paragraph();
            Chunk c49 = new Chunk("签章: ", paragraphHeaderFont);
            p68.setAlignment(Paragraph.ALIGN_RIGHT);
            p68.add(c49);
            document.add(p68);
 
 
            //5.释放资源
            document.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return outFile;
    }
}

​ 上面的pdf自定义模版边写完了,但是有个建议就是,建议将pdf的模版不变的内容写成properties配置文件,这样后期产品要改pdf模版的时候不用去代码里面找对应的修改内容了,直接去配置文件中修改就行了。

​ 上面操作完了pdf自定义模版了,下面来操作将pdf上传到阿里云的oss:这里阿里云只是就一个简单的应用后面会写一个相对比较完善的阿里云oss的api实现出来,这个是简单的功能性实现。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
 
/**
 * 阿里云上传并获取url简单工具类,参见本类最下方的main方法
 */
public class AliyunOssUtils {
 
    /**
     * 设置默认endPoint 为北京,可以调整
     */
    public static String BEIJING_END_POINT = "";
 
    private static String ACCESS_ID = "";
    /**
     * 阿里云ACCESS_KEY
     */
    private static String ACCESS_KEY = "";
 
    /**
     * 阿里云BUCKET_NAME  OSS
     */
    private static String bucketName = "";
    /**
     * oss client
     */
    private static OSSClient client;
 
   
    /**
     * 构造并返回utils,并设置当前连接的bucket
     *
     * @param bucketName
     * @return
     */
    public static AliyunOssUtils newInstance(String bucketName) {
        AliyunOssUtils aliyunOssUtils = new AliyunOssUtils();
        aliyunOssUtils.bucketName = bucketName;
        return aliyunOssUtils;
    }
 
 
    /**
     * 通过objectk获取文件的公开url
     *
     * @param objectKey
     * @return
     */
    public String loadUrlByKey(String objectKey, Long expiration) {
        // 构造过期时间date对象
        Date expirationDate = new Date(expiration);
        //生成外部url
        URL url = client.generatePresignedUrl(bucketName, objectKey, expirationDate);
        // 生成成功则返回URL的字符串
        if (url != null) {
            return url.toString();
        }
        return null;
    }
 
 
    /**
     * 上传文件
     *
     * @param objectkey 上传到OSS起的名
     * @param file      本地文件
     * @throws OSSException
     * @throws ClientException
     * @throws FileNotFoundException
     */
    private PutObjectResult uploadFile(String objectkey, File file)
            throws FileNotFoundException, OSSException, ClientException {
        //获取上传文件拓展名
        String suffix = objectkey.substring(objectkey.lastIndexOf(".") + 1).toLowerCase();
        ObjectMetadata objectMeta = new ObjectMetadata();
        objectMeta.setContentLength(file.length());
        //判断上传类型,多的可根据自己需求来判定,要添加支持则在此处添加case
        switch (suffix) {
            case "xml":
                objectMeta.setContentType("text/xml");
                break;
            case "jpg":
                objectMeta.setContentType("image/jpeg");
                break;
            case "png":
                objectMeta.setContentType("image/png");
                break;
            case "pdf":
                objectMeta.setContentType("application/pdf");
                break;
            default:
                //如case列表都未知匹配,则设置为二进制流
                objectMeta.setContentType("application/octet-stream");
        }
 
        InputStream input = new FileInputStream(file);
        //调用ossclient上传
        return this.client.putObject(this.bucketName, objectkey, input, objectMeta);
    }
 
 
    /**
     * 上传文件,重载参数支持文件路径上传
     *
     * @param objectkey 上传到OSS起的名
     * @param filePath  本地文件全路径
     * @throws OSSException
     * @throws ClientException
     * @throws FileNotFoundException
     */
    private PutObjectResult uploadFile(String objectkey, String filePath)
            throws FileNotFoundException, OSSException, ClientException {
        return this.uploadFile(objectkey, new File(filePath));
    }
 
 
 
 
 
    /**
     * 演示上传并获得公开路径
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) {
        AliyunOssUtils aliyunOssUtils = AliyunOssUtils.newInstance();
        //要存储到oss的文件名
        String objectkey = "folder/信息服务协议.pdf";
        // 上传文件
 
        try {
            PutObjectResult putObjectResult = aliyunOssUtils.uploadFile(objectkey, new PdfDesigner().designer());
        } catch (FileNotFoundException e) {
            //文件不存在,上传的文件未找到,做相应异常处理
            e.printStackTrace();
        } catch (OSSException e) {
            //OSSException 参考下方链接做处理
            //http://aliyun_portal_storage.oss.aliyuncs.com/oss_api/oss_javahtml/exceptions.html
        } catch (ClientException e) {
            //ClientException 参考下方链接做处理
            //http://aliyun_portal_storage.oss.aliyuncs.com/oss_api/oss_javahtml/exceptions.html
        }
 
 
        // 设置URL过期时间为10年  3600l* 1000*24*365*10
        long expiration = new Date().getTime() + 3600l * 1000 * 24 * 365 * 10;
        String publicUrl = aliyunOssUtils.loadUrlByKey(objectkey, expiration);
        String endpoint = "http://oss-cn-beijing.aliyuncs.com";
        System.out.println("上传后的公开读取Url为:" + publicUrl);
    }
}

至此写出pdf到虚拟目录,然后再去虚拟目录读取pdf文件,最后上传阿里云oss,上传之后获取阿里云访问链接。

总结:

知识点1:通过这个功能学到了对 System.getProperty(“java.io.tmpdir”) 运用,这个问题是别人帮助我解决的,之后去看了相关的api,所以遇到问题多想多问。

知识点2:pdf的chunk对象的应用现在清晰多了,所以写一个api的时候遇到不懂的最好是从源码入手,理顺作者的一些思想,一个是自己有帮助一个是对能力的一个提升。

一个博客写一波三折,心乱的时候可以强制要求自己去试着去写写,写着写着就静下来了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值