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将任意 ...
随机推荐
- CH9120 TFTP使用详解
一.TFTP简介: TFTP是基于UDP应用层的简单的文件传输协议,端口号为69,TFTP协议主要应用于网络引导.配置文件传输等场景. 二.报文介绍: TFTP有四种数据包格式,分别是读/写请求包.文 ...
- 基于XML的方式配置AOP
第一步:把通知类用 bean 标签配置起来 <bean id="txManager" class="com.atguigu.account.utils.Transa ...
- MySQL 中如何进行 SQL 调优?
MySQL 中如何进行 SQL 调优? SQL 调优是提高数据库查询性能的过程,主要目的是减少查询的响应时间和系统的负载.下面是一些常见的 SQL 调优方法和技巧. 1. 使用索引 索引的使用可以显著 ...
- P7404题解
分析题意: 题意就是让前半段序列呈上升趋势,后半段呈下降趋势. 解题方法: 考虑差分出序列的高度. xix_ixi 表示以 iii 为 kkk 的前半段需增加量. yiy_iyi 表示以 i−1i ...
- flutter系列(一)----- 开发环境搭建
flutter刚刚出来的时候,当时前公司团队使用React Native开发出来项目刚刚上线半年多.当时RN刚刚出来的时候,也是相当的火爆.公司也是紧跟时代的潮流.果断使用RN做了新项目,RN出来的时 ...
- 基于Gazebo/ROS2的智能仓储机器人强化学习控制系统开发全攻略
引言:仓储自动化与强化学习的碰撞 在工业4.0浪潮下,智能仓储系统正经历从传统AGV到自主决策机器人的跨越式发展.本文将深入解析如何利用Gazebo仿真平台与ROS2框架,结合Stable-Basel ...
- C# 利用反射模拟多态效果
public class A { } public class B : A { } public class C : A { } public static class Extension { pub ...
- 保姆教程系列:生成 SSH Key 并配置连接远程仓库
@ 目录 前言 第 1 步:检查是否已有 SSH Key 第 2 步:生成新的 SSH Key 第 3 步:启动 SSH Agent 并添加密钥 第 4 步:复制 SSH 公钥 第 5 步:添加 SS ...
- 基于AI的智能农业病虫害识别系统实战指南
引言 在农业现代化进程中,病虫害防治始终是保障粮食安全的核心挑战.传统人工识别方式存在效率低.误判率高.响应滞后等问题.本文将通过完整的技术实现流程,展示如何利用Python生态构建智能病虫害识别系统 ...
- 使用qt+网上的api做股票查看器
股票球,采用的是qt和新浪的api来设计,目前只有查看功能,2021年1月17日开始开发,后续可能会持续更新(可能跟心情有关) k线图在 Windows下获取数据有问题,还没来得及做,目前在Linux ...