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();
    }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章