Spire.pdf-使用学习记录
生活随笔
收集整理的這篇文章主要介紹了
Spire.pdf-使用学习记录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
spire.pdf 使用學習記錄
- 背景
- 簡介
- 相似產品及特點
- 官網地址
- 功能實現
- 切割pdf
- 按每頁切割
- 按指定頁切割
- 將pdf轉成txt
- 識別pdf中的篇章節生成對應文本
- 去除水印
- 獲取書簽
- 獲取每頁中圖片
- 項目地址
背景
通過打印機將一本紙質書轉為pdf的格式,以下所有操作都是在這個基礎上操作,最終目的生成n篇txt文件,每個txt名字規則是:起始頁_篇&章&節 內容:是對應切割的內容;
簡介
這是一款基于OCR框架的解析工具,擁有比價完整的Java 類庫,及完善的API文檔,不但具備pdf的讀寫,還支持文本和圖片的提取,水印的添加,書簽的增刪改,表格的操作,同時還支持,將pdf轉化成word、HTML、XPS、SVG、等多種方式;當然目前這類工具市面上有很多,不過通過比較最后選擇了spire.pdf ;目前這款項目共有兩個版本,一個是免費版本一個是付費版本,免費版本如果只是處理簡單的pdf是沒問題的,但是如果涉及到輸出為pdf則會只顯示前10頁,第十一頁則是預定的購買頁介紹,不過介于spire.pdf的完善性我最后還是選擇了他,至于10頁的問題,后面會拿出我的處理辦法,如果你是其他語言如.NET、Android、也可以使用這款產品;
相似產品及特點
- PDFBox
- itext
- 百度
- Tesseract 只能用于識別圖片,如果需要先將pdf轉為圖片
官網地址
https://www.e-iceblue.cn/Introduce/Free-Spire-PDF-JAVA.html
功能實現
前往官網下載jar包或者直接在maven上通過坐標也可實現,不過maven上的肯定沒有網頁下載的新;
<!-- 事先配置maven倉庫路徑--> <repositories><repository><id>com.e-iceblue</id><url>http://repo.e-iceblue.cn/repository/maven-public/</url></repository></repositories><!--maven中 spire.pdf鏡像依賴--> <dependencies><dependency><groupId> e-iceblue </groupId><artifactId>spire.pdf.free</artifactId><version>3.11.6</version></dependency> </dependencies>切割pdf
按每頁切割
/***每一頁生成一個pdf文檔*/public static void splitPdfOneByOne(){PdfDocument pdf = new PdfDocument();int count = pdf.getPages().getCount();System.out.println(count);pdf.loadFromFile("C:\\Users\\wangchenchen\\Desktop\\boot-structure\\book.pdf");pdf.split("C:\\Users\\wangchenchen\\Desktop\\boot-structure\\output\\surgery_{0}.pdf",0);pdf.close();}按指定頁切割
package com.wangcc.wangccocrdemo001.ocr;import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.graphics.PdfMargins; import com.wangcc.wangccocrdemo001.util.FileUtil;import java.awt.geom.Point2D; import java.io.File;/*** 拆分文檔* 拆成每頁一個* 拆成每九頁一個(免費版最多只能處理九頁)* @author wangcc* @createTime 2021年08月31日 23:25:00*/ public class SubPDF {/*** 每九頁生成一個pdf**/public static void splitPdfMoreByOne(){String fileName = "C:\\Users\\wangchenchen\\Desktop\\boot-structure\\book.pdf";String outPath = "C:\\Users\\wangchenchen\\Desktop\\boot-structure\\outFile\\outPDFByMore";PdfDocument pdf = new PdfDocument();pdf.loadFromFile(fileName);int totalCount = pdf.getPages().getCount();PdfPageBase pageBase;PdfDocument document = new PdfDocument();int count = 1;for(int i = 41; i< 822;i++){System.out.println(i+"/"+822);pageBase = document.getPages().add(pdf.getPages().get(i).getSize(),new PdfMargins(0));pdf.getPages().get(i).createTemplate().draw(pageBase, new Point2D.Float(0,0));if(count % 9 == 0){String path = "\\splitPdf-"+i+".pdf";document.saveToFile(outPath+path);document = new PdfDocument();}count++;}if(document.getPages().getCount() >0){String path = "\\splitPdf-999999.pdf";document.saveToFile(outPath+path);}}/*** @Description //* @return void**/public static void splitPdfByNumber(Integer begin, Integer end,String filePath,String pdfOutPath){if(begin.equals("") || end.equals("") || filePath.equals("") || pdfOutPath.equals("")){System.out.println("傳入參數有空.......");return;}if(begin >= end){System.out.println("截止頁數不能小于或等于開始頁數.......");return;}if(end-begin > 9){System.out.println("操作頁數最多為9頁");return;}File file = new File(pdfOutPath);if (file.exists()){FileUtil fileUtil = new FileUtil();fileUtil.DeleteFolder(pdfOutPath);}PdfDocument pdf = new PdfDocument();pdf.loadFromFile(filePath);int totalCount = pdf.getPages().getCount();PdfPageBase pageBase;PdfDocument document = new PdfDocument();for(int i = begin; i< end;i++){System.out.println(i+"/"+end);pageBase = document.getPages().add(pdf.getPages().get(i).getSize(),new PdfMargins(0));pdf.getPages().get(i).createTemplate().draw(pageBase, new Point2D.Float(0,0));String path = "\\surgery_"+i+".pdf";document.saveToFile(pdfOutPath+path);document = new PdfDocument();}} }將pdf轉成txt
package com.wangcc.wangccocrdemo001.ocr;import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase;import java.io.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 讀取所有拆分文件生成txt文件* @author wangcc* @createTime 2021年08月31日 23:51:00*/ public class ReadAllSplitFile {public static String fileName = "C:\\Users\\wangchenchen\\Desktop\\boot-structure\\outFile\\outPDFByMore\\";public static String outPath = "C:\\Users\\wangchenchen\\Desktop\\boot-structure\\outFile\\readPdfFile.txt";public static void main(String[] args) {List<File> fileList = readAllFile();List<String> pdfFileNameList = new ArrayList<>();for (File file:fileList) {pdfFileNameList.add(file.getName());}Collections.sort(pdfFileNameList, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int n1 = extractNumber(o1);int n2 = extractNumber(o2);return n1 - n2;}});File file = new File(outPath);if(file.exists()){file.delete();}for (String s:pdfFileNameList) {try {readFile(s);} catch (IOException e) {e.printStackTrace();}}}public static List<File> readAllFile(){String filePath = "C:\\Users\\wangchenchen\\Desktop\\boot-structure\\outFile\\outPDFByMore";ArrayList<File> fileList = new ArrayList<>();File file = new File(filePath);File[] files = file.listFiles();if(Objects.isNull(files)){return null;}for (File f:files) {if(f.isFile()){fileList.add(f);}}return fileList;}/*** @Param orderStr 排序:asc,des,不區分大小寫**/public static List<File> sortFileByName(List<File> fileList, final String orderStr){if(!orderStr.equalsIgnoreCase("asc") && !orderStr.equalsIgnoreCase("desc")){return fileList;}File[] files = fileList.toArray(new File[0]);Arrays.sort(files, new Comparator<File>() {@Overridepublic int compare(File o1, File o2) {int n1 = extractNumber(o1.getName());int n2 = extractNumber(o2.getName());if(orderStr == null || orderStr.length() < 1 || orderStr.equalsIgnoreCase("asc")){return n1 - n2;}else {//降序return n2 - n1;}}});return new ArrayList<File>(Arrays.asList(files));}public static int extractNumber(String name){int i;try {String s = name.replaceAll("[^\\d]", "");i = Integer.parseInt(s);}catch (Exception e){i = 0;}return i;}public static void readFile(String path) throws IOException {PdfDocument pdf = new PdfDocument();pdf.loadFromFile(fileName+path);PdfPageBase page;StringBuilder sb = new StringBuilder();Pattern pattern = Pattern.compile("(^(\\s*)第)(.{1,9})[章節卷集部篇回](\\s{1,10})(.{1,20})(\\s{1,10})");Pattern pattern1 = Pattern.compile("(\\s{0,10})([0-9][0-9]?[0-9]?[0-9]?)");//遍歷PDF頁面,獲取每個頁面的文本并添加到StringBuilder對象for(int i = 0;i < pdf.getPages().getCount();i++) {//System.out.println("循環遍歷pdf頁數:當前" + i + "頁/" + pdf.getPages().getCount() + "頁");page = pdf.getPages().get(i);int count = 0;String extractText = null;BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(page.extractText(true).getBytes())));while ((extractText = br.readLine())!= null){Matcher matcher = pattern.matcher(extractText);Matcher matcher1 = pattern1.matcher(extractText);/*末尾包含數字的*/if (count != 0 || matcher.find()){//System.out.println(extractText);if(!extractText.equals("") && !matcher1.find()){String s = extractText.replaceAll("\\s{5,9}", " ");sb.append(s+"\n");}}count++;}br.close();}FileWriter writer;try {//將StringBuilder對象中的文本寫入到文本文件writer = new FileWriter(outPath,true);System.out.println(sb.toString());writer.write(sb.toString());writer.flush();writer.close();sb.delete(0,sb.length());} catch (IOException e) {e.printStackTrace();}pdf.close();} }識別pdf中的篇章節生成對應文本
去除水印
package com.wangcc.wangccocrdemo001.ocr;import com.spire.pdf.PdfDocument;import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;/*** 去除水印(未必都有用,主要是看水印的類型)* 水印有兩種* 1.文字,放在對應的位置* 2.大圖片,png 背景透明* 一些特殊的水印原則上是去不掉的* @author wangcc* @createTime 2021年08月31日 23:46:00*/ public class ClearWaterMark {public static void main(String[] args) throws IOException {PdfDocument pdf = new PdfDocument();pdf.loadFromFile("C:\\Users\\wangchenchen\\Desktop\\boot-structure\\out\\splitPdf-18.pdf");BufferedImage bufferedImage = null;for (int i = 0; i<pdf.getPages().getCount();i++){bufferedImage = pdf.saveAsImage(i);bufferedImage.getSubimage(bufferedImage.getMinX(),15,bufferedImage.getWidth(),bufferedImage.getHeight()-15);File saveFile = new File("C:\\Users\\wangchenchen\\Desktop\\boot-structure\\outImg\\" + i + ".png");if(!saveFile.exists()){saveFile.mkdirs();}ImageIO.write(bufferedImage,"PNG",saveFile);bufferedImage.flush();}} }獲取書簽
package com.wangcc.wangccocrdemo001.ocr;import com.spire.pdf.PdfDocument; import com.spire.pdf.bookmarks.PdfBookmark; import com.spire.pdf.bookmarks.PdfBookmarkCollection;import java.io.FileWriter; import java.io.IOException;/*** 獲取書簽* @author wangcc* @createTime 2021年08月31日 23:47:00*/ public class getBookMake {public static void main(String[] args) {PdfDocument pdf = new PdfDocument();pdf.loadFromFile("C:\\Users\\wangchenchen\\Desktop\\boot-structure\\out\\splitPdf-18.pdf");PdfBookmarkCollection bookmarkCollection = pdf.getBookmarks();StringBuilder stringBuilder = new StringBuilder();/*獲取書簽*/GetBookMakeTitle(bookmarkCollection,stringBuilder);FileWriter writer;try {writer = new FileWriter("C:\\Users\\wangchenchen\\Desktop\\boot-structure\\讀取的書簽.txt");writer.write(stringBuilder.toString());writer.flush();} catch (IOException e) {e.printStackTrace();}pdf.dispose();}public static void GetBookMakeTitle(PdfBookmarkCollection bookmarkCollection,StringBuilder stringBuilder){if(bookmarkCollection.getCount() > 0){for (int i = 0; i < bookmarkCollection.getCount(); i++){PdfBookmark bookmark = bookmarkCollection.get(i);stringBuilder.append(bookmark.getTitle());GetBookMakeTitle(bookmark,stringBuilder);}}} }獲取每頁中圖片
package com.wangcc.wangccocrdemo001.ocr;import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase;import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Objects;/*** 提取每頁pdf中的圖片* @author wangcc* @createTime 2021年08月31日 23:41:00*/ public class ExtractImg {public static void main(String[] args) throws Exception{//加載測試文檔InputStream inputStream = new BufferedInputStream(new FileInputStream(new File("C:\\Users\\wangchenchen\\Desktop\\boot-structure\\demo.pdf")));PdfDocument pdf = new PdfDocument();//pdf.loadFromFile("C:\\Users\\wangchenchen\\Desktop\\boot-structure\\demo.pdf");pdf.loadFromStream(inputStream);//定義一個int型變量int index = 0;//遍歷PDF每一頁for (int i= 0;i< pdf.getPages().getCount(); i ++){System.out.println(i+"/"+pdf.getPages().getCount());//獲取PDF頁面PdfPageBase page = pdf.getPages().get(i);//使用extractImages方法獲取頁面上圖片for (BufferedImage image : page.extractImages()) {if(Objects.nonNull(image)){//指定輸出圖片名稱File output = new File( String.format("C:\\Users\\wangchenchen\\Desktop\\boot-structure\\Img\\Image_%d.pdf", index++));//將圖片保存為PNG格式文件ImageIO.write(image, "PNG", output);}}}} }項目地址
spire.pdf 下載
總結
以上是生活随笔為你收集整理的Spire.pdf-使用学习记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: firefox火狐浏览器显示多列书签菜单
- 下一篇: 高中计算机整人代码完整,整人代码 VBS