java 如何根据itext 生成/编辑pdf 、将word转成pdf并且填充内容、解决itext转pdf后只显示一页的问题

1首先你要先将你的pdf模板做好,可以采用Adobe Acrobat Dc 这个工具,不过这个工具是需要破译的,博主也没有,所以下了一个下来,用的是30天的试用期,反正也不常用。

2.先将你的word素材,另存为pdf模式的,然后保存到一个你熟悉的地方。

3.将你刚刚保存的pdf打开,打开的方式是右键点击“打开方式为”:Adobe Acrobat Dc这个工具打开。

4将pdf打开后,点击右边的“准备表单”,如下图:
在这里插入图片描述

5.重点来啰! 当你点击准备表单后,自动生成表单后,才会出现如图所示的TI字图形,点击这个图形就能生成模板填充域了,注意,不点击准备表单是不会出现这个图形的哟。这也是我走了好多冤枉路才摸索出来的。图片如下:

在这里插入图片描述

6.接下来就点击“TI”图形,在你所想要填充内容的地方生成模板域,操作方式是:鼠标点击T图形后,直接在你所想填充的位置拖动鼠标,生成一个长度宽度大小容纳的下你的内容的形状,
在这里插入图片描述

7 然后在文字域的框框中修改你的域名,域名就是你后面要填充内容的key值,比如说在姓名的域名框中可以写:name

8. 等所有域名框做好后,版式内容位置调整好后,模板就算正式做好了,然后点击左上方的文件,进行另存为,存到一个你熟悉的位置进行保存模板。

9.然后可以将你的模板,copy到你的代码中去,一般保存在你的resources路径下面。然后就开始正式编码了。

  1. 首先,要使用itext,先导入其相关联的jar包,如下:
<!--项目要使用iText,必须引入jar包。才能使用,maven依赖如下:-->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.13</version>
		</dependency>

		<!--输出中文,还要引入下面itext-asian.jar包:-->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itext-asian</artifactId>
			<version>5.2.0</version>
		</dependency>


		<!--设置pdf文件密码,还要引入下面bcprov-jdk15on.jar包:-->
		<dependency>
			<groupId>org.bouncycastle</groupId>
			<artifactId>bcprov-jdk15on</artifactId>
			<version>1.55</version>
		</dependency>

11. 将我们刚刚生成的pd模板转成pdf 并且将内容填充进去:

 /**
     * 将参数保存并且导出新的pdf
     * @param o : 需要保存的参数
     * @param url :pdf模板路径
     * @return
     */
    private  Map<String, String>   pdfout(Map<String,Object> o,String  url) {
        // 模板路径
        String templatePath = url;
        //生成的新文件pdf的路径(这里的路径是博主自己的测试路径,你们要写自己的。)
        String newPDFPath = "D:\\模板\\test.pdf";
        //pdf阅读器
        PdfReader reader;
        //文件输出流
        FileOutputStream out;
        //字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。
        ByteArrayOutputStream bos;
        // 使用pdfstamper修改现有文档
        PdfStamper stamper;
        try {
            //输出流
            out = new FileOutputStream(newPDFPath);
            //读取pdf模板
            reader = new PdfReader(templatePath);
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();
            Map<String,String> datemap = (Map<String,String>)o.get("datemap");
            for(String key : datemap.keySet()){
                String value = datemap.get(key);
                form.setField(key,value);
            }
            //true代表生成的PDF文件不可编辑,false可编辑
            stamper.setFormFlattening(true);
            stamper.close();
            Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            //循环是处理成品只显示一页的问题
           PdfImportedPage importPage = null;
            for (int  i=1;i<=reader.getNumberOfPages();i++){
                importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
                copy.addPage(importPage);
            }
            doc.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return  null;
    }


  1. 在你指定的位置生成一个新的pdf

public class PdfDemo {



    public static void main(String[] args) throws FileNotFoundException, DocumentException {

        // 1.新建document对象
        Document document = new Document();

        // 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
        // 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。//D:\work\悦美消分
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/work/data/test.pdf"));

        // 3.打开文档
        document.open();

        // 4.添加一个内容段落
        document.add(new Paragraph("Hello World!"));

        // 5.关闭文档
        document.close();

    }
   

13.读取/修改已有的PDF文件

 public static void main(String[] args) throws DocumentException, IOException {

        //创建一个pdf读入流 读取pdf文件
        PdfReader pdfReader = new PdfReader("D:/work/data/test.pdf");

        //修改器  根据一个pdfreader创建一个pdfStamper.用来生成新的pdf.  
        PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream("D:/work/data/test02.pdf"));

        Image image = Image.getInstance("D:/work/data/test02.png");
        //设置图片的宽和高
        image.scaleAbsolute(250, 250);
        //设置图片在文档中所在位置的宽和高
        image.setAbsolutePosition(250, 250);

        for(int i=1; i<= pdfReader.getNumberOfPages(); i++)
        {
            PdfContentByte content = pdfStamper.getUnderContent(i);
            content.addImage(image);
        }

        pdfStamper.close();
    }




  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值