iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用itextpdf解决PDF合并的问题
  • 287
分享到

如何使用itextpdf解决PDF合并的问题

2023-06-20 14:06:55 287人浏览 八月长安
摘要

这篇文章主要介绍了如何使用itextpdf解决PDF合并的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。itextpdf解决PDF合并的问题本文章是我在项目开发过程中解决

这篇文章主要介绍了如何使用itextpdf解决PDF合并的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

itextpdf解决PDF合并的问题

本文章是我在项目开发过程中解决了一个关于PDF显示的需求而记录的。

需求是这样的,需要将两个PDF进行合并,一个PDF是根据数据库的信息在在后台形成的(实际不存在的PDF),另一个是磁盘保存的PDF文件(这个PDF文件后期会变成从云端获取)。

作为一个Java菜鸟,这个问题解决了数天,还是在leader的指导下解决的。在这里做一下关键代码的记录。

项目主要包含了以下关键词:(我不做详解了,主要是用了这些)

- Spring MVC、Spring、Hibernate

- Maven

- Java

- itextpdf

- MySQL

- JavaWeb相关

首先是itextpdf的依赖

<dependency>    <groupId>com.itextpdf</groupId>    <artifactId>itextpdf</artifactId>    <version>5.5.10</version></dependency>

如何在后台生成一个PDF

这个问题,百度上有很多解决方案,因为我需要将这个生成的PDF和已存在的PDF拼接,于是尝试了多种方案,决定将这个以文档的形式,将这个文档转为字节数组,然后用itextpdf将流读取到PDF中。

生成PDF的部分代码:

import java.io.ByteArrayOutputStream;import com.model.User;import com.itextpdf.text.BaseColor;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Element;import com.itextpdf.text.Font;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfContentByte;import com.itextpdf.text.pdf.PdfPCell;import com.itextpdf.text.pdf.PdfPTable;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.text.pdf.parser.PdfReaderContentParser;public class ReportKit {     public static byte[] createReport(User user) throws Exception {               ByteArrayOutputStream ba = new ByteArrayOutputStream();               Document doc = new Document();//创建一个document对象               PdfWriter writer = PdfWriter.getInstance(doc, ba);//这个PdfWriter会一直往文档里写内容。              doc.open();//开启文档              BaseFont bfChinese = BaseFont.createFont("c://windows//fonts//msyh.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);              com.itextpdf.text.Font FontChinese18 = new com.itextpdf.text.Font(bfChinese, 18, com.itextpdf.text.Font.BOLD);              com.itextpdf.text.Font FontChinese12 = new com.itextpdf.text.Font(bfChinese, 12, com.itextpdf.text.Font.NORMAL);              com.itextpdf.text.Font FontChinese11 = new com.itextpdf.text.Font(bfChinese, 11, com.itextpdf.text.Font.ITALIC);              Font fontChinese =  new  Font(bfChinese  ,  12 , Font.NORMAL, BaseColor.BLACK);              Paragraph pf = new Paragraph("");              //加入空行              Paragraph blankRow1 = new Paragraph(24f," ",FontChinese18);              doc.add(blankRow1);              //table2              PdfPTable table25 = new PdfPTable(2);              //设置每列宽度比例              int width31[] = {2,98};              table25.setWidths(width31);              table25.getDefaultCell().setBorder(0);              PdfPCell cell25 = new PdfPCell(new Paragraph("这是一个报告",FontChinese18));              cell25.setBorder(0);              table25.addCell("");              table25.addCell(cell25);              doc.add(table25);              Paragraph blankRow3 = new Paragraph(18f, "Report ", FontChinese11);              blankRow3.setAlignment(PdfContentByte.ALIGN_RIGHT);              doc.add(blankRow3);                      BaseColor lightGrey = new BaseColor(0xCC,0xCC,0xCC);              PdfPTable table8 = new PdfPTable(6);            //设置table的宽度为100%            table8.setWidthPercentage(100);            //设置不同列的宽度            float[] columnWidths = {1.6f, 1.6f, 1.6f, 1.6f, 1.6f, 1.6f};            table8.setWidths(columnWidths);              PdfPCell cell1 = new PdfPCell(new Paragraph("用户名",FontChinese12));            PdfPCell cell2 = new PdfPCell(new Paragraph("出生日期",FontChinese12));            PdfPCell cell3 = new PdfPCell(new Paragraph("性别",FontChinese12));            PdfPCell cell4 = new PdfPCell(new Paragraph("身高",FontChinese12));            PdfPCell cell5 = new PdfPCell(new Paragraph("体重",FontChinese12));            PdfPCell cell6 = new PdfPCell(new Paragraph("地区",FontChinese12));            PdfPCell cell7 = new PdfPCell(new Paragraph(user.getAccessname(),FontChinese12));            PdfPCell cell8 = new PdfPCell(new Paragraph(user.getBirthday(),FontChinese12));            PdfPCell cell9 = new PdfPCell(new Paragraph(sex,FontChinese12));            PdfPCell cell10 = new PdfPCell(new Paragraph(String.valueOf(user.getHeight()),FontChinese12));            PdfPCell cell11 = new PdfPCell(new Paragraph(String.valueOf(user.getWeight()),FontChinese12));            PdfPCell cell12 = new PdfPCell(new Paragraph(user.getArea_name(),FontChinese12));            //表格高度            cell1.setFixedHeight(30);            cell2.setFixedHeight(30);            cell3.setFixedHeight(30);            cell4.setFixedHeight(30);            cell5.setFixedHeight(30);            cell6.setFixedHeight(30);            cell7.setFixedHeight(30);            cell8.setFixedHeight(30);            cell9.setFixedHeight(30);            cell10.setFixedHeight(30);            cell11.setFixedHeight(30);            cell12.setFixedHeight(30);            //水平居中           cell1.setHorizontalAlignment(Element.ALIGN_CENTER);            cell2.setHorizontalAlignment(Element.ALIGN_CENTER);            cell3.setHorizontalAlignment(Element.ALIGN_CENTER);            cell4.setHorizontalAlignment(Element.ALIGN_CENTER);            cell5.setHorizontalAlignment(Element.ALIGN_CENTER);            cell6.setHorizontalAlignment(Element.ALIGN_CENTER);            cell7.setHorizontalAlignment(Element.ALIGN_CENTER);            cell8.setHorizontalAlignment(Element.ALIGN_CENTER);            cell9.setHorizontalAlignment(Element.ALIGN_CENTER);            cell10.setHorizontalAlignment(Element.ALIGN_CENTER);            cell11.setHorizontalAlignment(Element.ALIGN_CENTER);            cell12.setHorizontalAlignment(Element.ALIGN_CENTER);            //垂直居中            cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell6.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell7.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell8.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell9.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell10.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell11.setVerticalAlignment(Element.ALIGN_MIDDLE);            cell12.setVerticalAlignment(Element.ALIGN_MIDDLE);            //边框颜色            cell1.setBorderColor(lightGrey);            cell2.setBorderColor(lightGrey);            cell3.setBorderColor(lightGrey);            cell4.setBorderColor(lightGrey);            cell5.setBorderColor(lightGrey);            cell6.setBorderColor(lightGrey);            cell7.setBorderColor(lightGrey);            cell8.setBorderColor(lightGrey);            cell9.setBorderColor(lightGrey);            cell10.setBorderColor(lightGrey);            cell11.setBorderColor(lightGrey);            cell12.setBorderColor(lightGrey);            table8.addCell(cell1);            table8.addCell(cell2);            table8.addCell(cell3);            table8.addCell(cell4);            table8.addCell(cell5);            table8.addCell(cell6);            table8.addCell(cell7);            table8.addCell(cell8);            table8.addCell(cell9);            table8.addCell(cell10);            table8.addCell(cell11);            table8.addCell(cell12);                    doc.add(table8);            doc.close();//(有开启文档,就要记得关闭文档)            writer.close();            byte[] bytes = ba.toByteArray();                      return bytes;     }}

用document来编辑文档,真的蛮恶心的,费时费力,排版也不好调,如果能有更加好用的方式,希望大家能告诉我。

到这里,调用这个方法,就可以获得这个文档的字节数组了。

接下来开始拼接PDF。因为是结合前端页面实现的。因此这个方法是我在controller完成的。

//注意这里的produces,“application/pdf”,正是因为设置了这个,使得整个方法会将文档以PDF的格式返回到页面。@RequestMapping(value = "/newPdf/{report_name}", produces = "application/pdf;charset=UTF-8")    public void updateReport(Model model, @PathVariable String report_name, httpservletRequest request,            HttpServletResponse response,HttpSession session) {        try {            User user = (User) session.getAttribute("user");            //这是用户登录后保存到session里的用户信息(可以用别的对象来替代这个)            if(user==null){                return ;            }            PdfReader reader1 =null;            try {                // 调用刚刚写的生成PDF的方法,将这个字节数组获取。                byte[] pdfUserByte=ReportKit.createReport(user);                if(pdfUserByte==null||pdfUserByte.length==0){                    return;                }                //用pdfReader来读取字节数组,这里将文档信息读入                 reader1 = new PdfReader(pdfUserByte);            } catch (Exception e) {                System.out.println(e.getMessage());                return ;            }            if(reader1==null) return;            //第二个PDF的读取            PdfReader reader2;            // 报告的PDF            reader2 = new PdfReader("C:\\Users\\Administrator\\Desktop\\report.pdf");            Document document = new Document();            PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());            document.open();            PdfContentByte cb = writer.getDirectContent();            int totalPages = 0;            totalPages += reader1.getNumberOfPages();            totalPages += reader2.getNumberOfPages();            java.util.List<PdfReader> readers = new ArrayList<PdfReader>();            readers.add(reader1);            readers.add(reader2);            int pageOfCurrentReaderPDF = 0;            Iterator<PdfReader> iteratorPDFReader = readers.iterator();            // Loop through the PDF files and add to the output.            while (iteratorPDFReader.hasNext()) {                PdfReader pdfReader = iteratorPDFReader.next();                // Create a new page in the target for each source page.                while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {                    document.newPage();//创建新的一页                    pageOfCurrentReaderPDF++;                    PdfImportedPage page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF);                    cb.addTemplate(page, 0, 0);                }                pageOfCurrentReaderPDF = 0;            }            document.close();            writer.close();        } catch (IOException | DocumentException e) {            e.printStackTrace();        }    }

关于如何在页面预览这个PDF,我用了object标签来获取。

jsp上的部分片段

<div class="pdf" id="pdf" ><!-- pdf -->    <object type="application/pdf" data="http://localhost:8080/project/newPdf/${report.report_name}" id="review"  >     </object>    </div>

标签很好的实现了PDF预览的功能,如果是URL的PDF,data直接输入URL,就能将PDF在页面预览,感觉蛮好用的。

iText 合并PDF文件报错

在使用iText操作PDF进行合并的时候报错:

com.lowagie.text.exceptions.BadPassWordException: PdfReader not opened with owner password

public static PdfReader unlockPdf(PdfReader pdfReader) {     if (pdfReader == null) {      return pdfReader;     }     try {      java.lang.reflect.Field f = pdfReader.getClass().getDeclaredField("encrypted");      f.setAccessible(true);      f.set(pdfReader, false);     } catch (Exception e) {       // ignore     }     return pdfReader;    }

对reader使用上述方法即可解决该问题。

感谢你能够认真阅读完这篇文章,希望小编分享的“如何使用itextpdf解决PDF合并的问题”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: 如何使用itextpdf解决PDF合并的问题

本文链接: https://www.lsjlt.com/news/297325.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用itextpdf解决PDF合并的问题
    这篇文章主要介绍了如何使用itextpdf解决PDF合并的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。itextpdf解决PDF合并的问题本文章是我在项目开发过程中解决...
    99+
    2023-06-20
  • 使用itextpdf解决PDF合并的问题
    itextpdf解决PDF合并的问题 本文章是我在项目开发过程中解决了一个关于PDF显示的需求而记录的。 需求是这样的,需要将两个PDF进行合并,一个PDF是根据数据库的信息在在后台...
    99+
    2024-04-02
  • 使用itextpdf操作pdf的实例讲解
    使用maven引入jar<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId&g...
    99+
    2023-05-30
  • mysql如何解决并发问题
    mysql并发的解决方法优化sql语句优化代码中sql语句,应尽量避免全表扫描,在 where 及 order by 涉及的列上建立索引;并避免频繁创建和删除临时表,以减少系统表资源的消耗。添加缓存缓存适合读多写少更新频度相对较低...
    99+
    2024-04-02
  • java并发问题如何解决
    Java中的并发问题可以通过以下几种方式来解决:1. 使用同步机制:可以使用synchronized关键字或者Lock接口来对共享资...
    99+
    2023-08-12
    java
  • 怎么解决Git合并冲突的问题
    本篇内容介绍了“怎么解决Git合并冲突的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!合并并不仅仅是简单的文件添加、移除的操作,Git ...
    99+
    2023-06-04
  • ASP、Windows、JavaScript同时使用,如何解决并发问题?
    在当前的互联网应用中,ASP、Windows和JavaScript是非常常见的技术。但是,在使用这些技术时,我们可能会面临一个共同的问题——并发。如果我们不采取措施,这个问题可能会导致我们的应用程序出现故障,影响用户体验。因此,本文将介绍...
    99+
    2023-07-21
    并发 windows javascript
  • php如何解决高并发的问题?
    在PHP中解决高并发问题可以采取以下几种策略: 使用缓存:通过使用缓存技术,可以将经常访问的数据存储在内存中,减轻数据库或其他资源的压力。常见的缓存技术包括Memcached和Redis。PHP提供...
    99+
    2023-10-24
    php 开发语言
  • 如何使用Easyui ueditor整合解决不能编辑的问题
    这篇文章主要介绍了如何使用Easyui ueditor整合解决不能编辑的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。<scrip...
    99+
    2024-04-02
  • 如何使用github解决问题
    这篇“如何使用github解决问题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用github解决问题”文章吧。一、G...
    99+
    2023-07-06
  • Java如何解决高并发问题
    在Java中,可以采用以下几种方式来解决高并发问题:1. 使用线程池:线程池可以有效地管理线程的创建和销毁,避免频繁地创建和销毁线程...
    99+
    2023-10-20
    Java
  • PHP高并发问题如何解决
    PHP高并发问题如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。重启与过载保护如果系统发生“雪崩”,贸然重启服务,是无法解决问题的。最常见的现象是,启动起...
    99+
    2023-06-15
  • Redis如何解决高并发问题
    这篇文章主要介绍Redis如何解决高并发问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:redis为什么会有高并发问题redis的出身决定 redis是一种单线...
    99+
    2024-04-02
  • 如何用Python解决LeetCode数组题目的并发问题?
    LeetCode是全球知名的在线编程网站,提供了许多算法和数据结构题目供程序员练习。在LeetCode中,数组问题是一类非常常见的问题。然而,当数组问题涉及到并发时,解决方法就会变得更加复杂。在这篇文章中,我们将介绍如何使用Python来解...
    99+
    2023-11-05
    数组 leetcode 并发
  • 如何解决PHP高并发问题
    这篇“如何解决PHP高并发问题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何解决PHP高并发问题”文章吧。秒杀会产生一个...
    99+
    2023-06-29
  • SpringBoot如何使用 Redis 分布式锁解决并发问题
    这期内容当中小编将会给大家带来有关SpringBoot如何使用 Redis 分布式锁解决并发问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。问题背景现在的应用程序架构中,很多服务都是多副本运行,从而保证...
    99+
    2023-06-25
  • 如何使用泛型解决golang中并发编程问题
    使用泛型解决 golang 中的并发问题。泛型允许在不指定类型的情况下定义函数和结构,从而创建线程安全的数据结构。例如:定义一个泛型队列 queue[t],其中 t 表示元素类型。使用 ...
    99+
    2024-05-03
    golang 泛型 并发访问
  • 揭秘 Java 并发集合:解决并发问题的利器
    并发集合概述 Java 并发集合是 Java 集合框架的一部分,专门针对多线程环境进行了优化。这些集合提供线程安全的数据结构,允许多个线程同时访问和修改数据,而无需担心竞态条件和数据损坏。 并发集合类型 Java 并发集合包含多种类型,包...
    99+
    2024-04-03
    在多线程并发的编程环境中 管理共享数据至关重要 以避免数据损坏和不一致。Java 并发集合提供了一个丰富的框架 帮助开发人员有效地处理并发问题 确保数据完整性和应用可靠性。
  • mysql并发写入问题如何解决
    在MySQL中,可以通过以下几种方法来解决并发写入问题:1. 事务隔离级别:使用适当的事务隔离级别,如读已提交(Read Commi...
    99+
    2023-10-11
    mysql
  • C++解决合并两个排序的链表问题
    目录题目描述:示例:解题思路:测试代码:题目描述: 输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。 数据范围: n为0~1000,节点值为...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作