pdf工具类之添加页码
实现思路:将原pdf复制一份到目标pdf,在目标pdf上进行操作,复制的原因是:原pdf需要获取其pdf读入流(PdfReader),如果还在原pdf上继续宁操作,就会出现一下一下异常
java.io.FileNotFoundException: D:\testtest1\test.pdf (请求的操作无法在使用用户映射区域打开的文件上执行。)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at priv.lgq.filesysspringboot.utils.pdf.PdfUtils.addPageNum(PdfUtils.java:146)
at priv.lgq.filesysspringboot.business.DemoTest.main(DemoTest.java:28)
源码如下:
1 /**
2 * 添加页码
3 *
4 * @author 龙谷情
5 * @date 2020/11/12 14:25
6 * @param pdfPath 原pdf路径
7 * @param outFilePath 目标pdf路径
8 * @param positionX 页数位置X
9 * @param positionY 页数位置Y
10 * @param fontSize 字体大小
11 * @return java.io.File[返回类型说明]
12 * @exception/throws [异常类型] [异常说明]
13 * @since [v1.0]
14 */
15 public static File addPageNum(String pdfPath, String outFilePath, int positionX, int positionY, int fontSize) {
16 PdfReader reader = null;
17 PdfStamper stamper = null;
18 FileOutputStream outputStream = null;
19 try {
20 // 创建一个pdf读入流
21 reader = new PdfReader(pdfPath);
22 // 根据一个pdfreader创建一个pdfStamper.用来生成新的pdf.
23 outputStream = new FileOutputStream(outFilePath);
24 stamper = new PdfStamper(reader, outputStream);
25 // 这个字体是itext-asian.jar中自带的 所以不用考虑操作系统环境问题.
26 BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
27 // baseFont不支持字体样式设定.但是font字体要求操作系统支持此字体会带来移植问题.
28 Font font = new Font(bf, 10);
29 font.setStyle(Font.BOLD);
30 font.getBaseFont();
31 // 获取页码
32 int num = reader.getNumberOfPages();
33 for (int i = 1; i <= num; i++) {
34 PdfContentByte over = stamper.getOverContent(i);
35 over.beginText();
36 over.setFontAndSize(font.getBaseFont(), fontSize);
37 over.setColorFill(BaseColor.BLACK);
38 // 设置页码在页面中的坐标
39 over.setTextMatrix(positionX, positionY);
40 over.showText("第" + i + "页");
41 over.endText();
42 over.stroke();
43 }
44 stamper.close();
45 } catch (Exception e) {
46 e.printStackTrace();
47 } finally {
48 if (outputStream != null) {
49 try {
50 outputStream.close();
51 } catch (IOException e) {
52 e.printStackTrace();
53 }
54 }
55 if (reader != null) {
56 reader.close();
57 }
58 if (stamper != null) {
59 try {
60 stamper.close();
61 } catch (DocumentException e) {
62 e.printStackTrace();
63 } catch (IOException e) {
64 e.printStackTrace();
65 }
66 }
67 }
68 File file = new File(outFilePath);
69 return file;
70 }
pdf工具类之添加页码的更多相关文章
- Java 借助poi操作PDF工具类
一直以来说写一个关于Java操作PDF的工具类,也没有时间去写,今天抽空写一个简单的工具类,拥有PDF中 换行,字体大小,字体设置,字体颜色,首行缩进,居中,居左,居右,增加新一页等功能,如果需要 ...
- springboot在工具类中添加service的方法,显示为空的解决方案
@Component// 1.将工具类声明为spring组件,这个必须不能忘 public class TestUtils { //2.自动注入 @Autowired private ItemServ ...
- java img图片转pdf 工具类
package com.elitel.hljhr.comm.web.main.controller; import java.io.File; import java.io.FileNotFoundE ...
- java excel转pdf 工具类
package com.elitel.hljhr.comm.web.main.controller; import java.io.File; import java.io.FileOutputStr ...
- java word转pdf 工具类
package com.elitel.hljhr.comm.web.main.controller; import java.io.File; import java.io.FileOutputStr ...
- FileUtils删除文件的工具类
前提是知道文件在哪个文件夹下面然后到文件夹下面删除文件,如果文件夹也需要传参数需要对下面方法进行改造. ( 需要借助于commons-io.jar和ResourceUtils.java ) 1.De ...
- Android常见工具类封装
MD5加密 import android.annotation.SuppressLint; import java.security.MessageDigest; public class MD5 { ...
- 自写Date工具类
以前写项目的时候总是在使用到了时间的转换的时候才在工具类中添加一个方法,这样很容易导致代码冗余以及转换的方法注释不清晰导致每次使用都要重新看一遍工具类.因此整理出经常使用的一些转换,用作记录,以便以后 ...
- SpringBoot 项目在静态工具类中注入 RedisTemplate
静态属性不能直接注入,可以通过其set方法进行注入.(注意生成的set方法需要去掉static). 在工具类里直接注入RedisTemplate,两种方法: (1)使用@Autowired priva ...
- 第一章 Java工具类目录
在这一系列博客中,主要是记录在实际开发中会常用的一些Java工具类,方便后续开发中使用. 以下的目录会随着后边具体工具类的添加而改变. 浮点数精确计算 第二章 Java浮点数精确计算 crc32将任意 ...
随机推荐
- 使用Python计算汉密尔顿路径
引言 在图论中,汉密尔顿路径(Hamiltonian Path)是一个经典问题,它在很多实际应用中都有广泛的应用,如网络路由.旅行商问题等.今天,我们将一起探讨如何使用 Python 来计算汉密尔顿路 ...
- 使用Python对理想气体进行建模
引言 在日常生活中,我们常常听到"气体",但你是否知道气体的行为是如何被科学家们用数学模型描述的呢?今天,我们就来聊聊如何用 Python 对理想气体进行建模,帮助大家更好地理解气 ...
- dubbo源码解析-服务暴露与发现
一.概述 dubbo是一个简单易用的RPC框架,通过简单的提供者,消费者配置就能完成无感的网络调用.那么在dubbo中是如何将提供者的服务暴露出去,消费者又是如何获取到提供者相关信息的呢? 二.dub ...
- Sentinel——流控规则
目录 流控规则 QPS 设置流控规则 api设置流控规则 资源实体指定流控规则 并发线程数 Sentinel 隔离方案 流控模式-关联 流控模式-链路 控制效果 快速失败 Warm Up 排队等待 三 ...
- 一个日h站的Nday
0x00 前言 今天先来无事的我翻起了qq收藏夹.忽然发现了一个去年EDUSRC群里一个老表发的洞.今天就给大家发出来耍耍. 抵制黄色网站人人有责,打造绿色上网环境. 面对正规网站时候,请不要做非法测 ...
- 【笔记】reko 0.10.2 反编译工具安装和使用记录|(1) README.md
(翻译自README.md,并通过自己的实际操作情况重新整理了一遍) 笔者注:我已经成功地根据README.md下载了Release版本,也自己试了下从源码编译,跟着README都挺顺利的.如果操作过 ...
- java代码发起POST请求,并封装条件
一.场景 不同的系统采用调用,这里我们是定时任务调用其他系统的接口获取数据并返回处理 二.代码 技术点: 发起Post请求 封装接口所需条件<key,vlaue> 将返回的{"c ...
- codeup之统计同成绩学生人数
Description 读入N名学生的成绩,将获得某一给定分数的学生人数输出. Input 测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的成绩,相邻两数字用一个空格间隔 ...
- save could notbe completed!!!
错误描述:ctrl+s报错 eg: 原因及解决:eclipse正使用的字符集GBK,不能支持所有代码的映射,需要删掉不符合和字符或者换个字符集--所以还是比较推荐后者:Projext->Prop ...
- 必看!手把手教你玩转Dify的3大核心工具!
Dify 中的工具是指其平台内置或支持集成的功能插件,用于扩展 AI 应用的能力. 1.工具作用 扩展 LLM 的能力:工具可以赋予 LLM 连接外部世界的能力,例如联网搜索.科学计算.绘制图片等.例 ...