PDF解決方案(2)--文件轉PDF

相關專題鏈接:

PDF解決方案(1)--文件上傳

PDF解決方案(2)--文件轉PDF

PDF解決方案(3)--PDF轉SWF

PDF解決方案(4)--在線瀏覽

前言:上一篇中講到的文件上傳,文件上傳在網絡上有大量的范例,因為想提供一個完整的解決方案就放上了,僅供參考;這一篇主要介紹一些常用文件轉換為PDF的實現。

1、word、excel轉pdf

通過百度了解到現在office轉換為pdf主要有三種形式:Jacob、JCom、openoffice,前兩種方式均依賴windows平臺和office軟件(其中JCom還需要Acrobat_Pro且已注冊),成本很高且局限性很大,第三種方式使用開源的openoffice支持跨平臺使用,目前絕大部分的web應用都會部署在linux或UNIX平臺,所以第三種方式是一種最好的實現方案,下面介紹第三種方案的實現(基于windows平臺,linux平臺在openoffice的安裝和啟動略有差異,但Java調用的代碼是相同的,后面在提供專門篇幅來介紹linux平臺的openoffice安裝和啟動),前兩種方式會在下面提供demo供大家參考。

轉換前需要先安裝并以服務方式啟動openoffice軟件:

openoffice下載地址:http://www.openoffice.org/download/index.html

安裝成功后在cmd中定位到program目錄,執行命令:soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard,然后執行:netstat -ano|findstr "8100" ,當出現如圖紅線所示則表示啟動成功了。

openoffice

?

調用openoffice代碼:

調用openoffice進行轉換需要用到openoffice提供的jar包:jodconverter、juh、jurt、ridl、slf4j-api、slf4j-jdk14、unoil、xstream,Apache的io包,在項目中引用就可以了,其中在jodconverter包的com.artofsolving.jodconverter路徑下有一個document-formats.xml的文件,它定義了openoffice支持的文件轉換類型,這里我們只選中其中的doc、docx、xls、xlsx四種類型,先獲取openoffice連接,然后定義輸入輸出文件格式信息,執行轉換,關閉連接即可,代碼中有詳細注釋這里不再贅述了。

/*** 調用openoffice把office轉成pdf* @param inStream 輸入流* @param fos 輸出流* @param extensionname 擴展名*/public static void converterOffiec2PDF(InputStream inStream,FileOutputStream fos, String extensionname){OpenOfficeConnection connection = null;try{connection = new SocketOpenOfficeConnection(8100);//獲取openoffice連接DocumentConverter converter = new OpenOfficeDocumentConverter(connection);//創建openoffice文件轉換類DocumentFormat inputFormat = null;DocumentFormat pdf = new DocumentFormat("Portable Document Format","application/pdf", "pdf");//指定目標文件格式信息//指定輸出過濾器參數pdf.setExportFilter(DocumentFamily.DRAWING, "draw_pdf_Export");pdf.setExportFilter(DocumentFamily.PRESENTATION,"impress_pdf_Export");pdf.setExportFilter(DocumentFamily.SPREADSHEET, "calc_pdf_Export");pdf.setExportFilter(DocumentFamily.TEXT, "writer_pdf_Export");//指定輸入文件格式信息  定義信息在docment_formats.xml中if (Constans.FileExtName.DOC.equalsIgnoreCase(extensionname)){inputFormat = new DocumentFormat("Microsoft Word",DocumentFamily.TEXT, "application/msword", "doc");inputFormat.setExportFilter(DocumentFamily.TEXT, "MS Word 97");}else if (Constans.FileExtName.DOCX.equalsIgnoreCase(extensionname)){inputFormat = new DocumentFormat("Microsoft Word 2007 XML",DocumentFamily.TEXT,"application/vnd.openxmlformats-officedocument.wordprocessingml.document","docx");}else if (Constans.FileExtName.XLS.equalsIgnoreCase(extensionname)){inputFormat = new DocumentFormat("Microsoft Excel",DocumentFamily.SPREADSHEET, "application/vnd.ms-excel","xls");inputFormat.setExportFilter(DocumentFamily.SPREADSHEET,"MS Excel 97");}else if (Constans.FileExtName.XLSX.equalsIgnoreCase(extensionname)){inputFormat = new DocumentFormat("Microsoft Excel 2007 XML",DocumentFamily.SPREADSHEET,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","xlsx");}//執行文件轉換
            converter.convert(inStream, inputFormat, fos, pdf);} finally{if (connection != null){connection.disconnect();connection = null;}closeStream(inStream, fos);}}

?

?

2、圖片轉pdf

圖片轉pdf采用itext的開源jar包itextpdf,itextpdf可以創建、修改pdf,這里我們利用itextpdf創建一個新的pdf然后把圖片添加進去,實現圖片轉pdf的效果;代碼步驟為:先創建文檔,獲取pdf寫入器,打開文檔,設置內容格式,寫入內容到文檔,關閉文檔。

/*** 圖片轉pdf* @param inStream* @param fos* @throws MalformedURLException* @throws IOException* @throws*/public static void converterImg2Pdf(InputStream inStream,FileOutputStream fos) throws MalformedURLException, IOException{//創建新文檔Document doc = new Document();try{//pdf寫入器裝載文檔、輸出流
            PdfWriter.getInstance(doc, fos);doc.open();//打開文檔準備寫入,文檔必須打開才能寫入
            BufferedImage bufferedImage = ImageIO.read(inStream);float h = bufferedImage.getHeight();float w = bufferedImage.getWidth();Image image = Image.getInstance(bufferedImage, null);image.setAlignment(Image.MIDDLE);//圖片對齊方式,居中即可image.scalePercent(getPercent2(h, w));//圖片壓縮比doc.add(image);//添加圖片doc.close();//關閉文檔,文檔必須正確關閉
} catch (DocumentException e){e.printStackTrace();}}

?

相關文件下載

jcom、jacob demo下載地址:http://pan.baidu.com/s/1dD297rz

轉載于:https://www.cnblogs.com/barros/p/3870704.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273646.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker 常用命令(二)

Docker 鏡像常用命令 搜索鏡像 可使用 docker search 命令搜索存放在 Docker Hub 中的鏡像。例如: docker search java 執行該命令后, Docker 就會在 Docker Hub 中搜索含有 java 這個關鍵詞的鏡像倉庫。執行該命令后,可看到類似于如下的表格…

Docker 使用Dockerfile構建Docker(三)

Dockerfile 簡單使用 先來編寫一個最簡單的 Dockerfile。 例如&#xff1a; FROM nginx RUN echo <h1>使用Dockerfile構建鏡像</h1> > /usr/share/nginx/html/index.html 該 Dockerfile 非常簡單&#xff0c;其中的 FORM 、 RUN 都是 Dockerfile 的指令。 FROM …

網絡流之最大流問題

Reference&#xff1a; http://blog.csdn.net/rrerre/article/details/6751520 http://blog.csdn.net/y990041769/article/details/21026445 http://www.nocow.cn/index.php/Translate:USACO/NetworkFlow 最大流Edmonds_Karp算法模板&#xff1a; EK算法即增廣路算法。 最大流最…

delphi讀取excel

簡單的例子 1 procedure TForm1.Button1Click(Sender: TObject);2 var3 ExcelApp,MyWorkBook: OLEVariant;4 begin5 opendialog1.Filter:Microsoft Excel Workbook (*.xls)|*.XLS|; 6 edit2.Text : sheet1;7 if opendialog1.Execute then8 begin9 edit1.Text:o…

Docker-compose 常用命令及網絡設置(五)

Docker Compose 常用命令 build 構建或重新構建服務。服務被構建后將會以 project_service的形式標記,例如:comoretest db。help 査看指定命令的幫助文檔,該命令非常實用。 docker-compose所有命令的幫助文檔都可通過該命令查看。 docker-compose he lp COMMAND 示例 docker-co…

淺談 trie樹 及其實現

定義&#xff1a;又稱字典樹&#xff0c;單詞查找樹或者前綴樹&#xff0c;是一種用于快速檢索的多叉樹結構&#xff0c; 如英文字母的字典樹是一個26叉樹&#xff0c;數字的字典樹是一個10叉樹。 核心思想&#xff1a;是空間換時間.利用字符串的公共前綴來降低查詢時間的開銷以…

Docker-compose 安裝與基本使用(四)

安裝 Docker-Compose Compose有多種安裝方式,例如通過 shell, pip以及將 Compose作為容器安裝等。本次安裝以Shell 為主。 通過以下命令自動下載并安裝適應系統版本的 Compose: curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(un…

如何開始DDD(完)

連續寫了兩篇文章&#xff0c;這一篇我想是序的完結篇了。結合用戶注冊的例子再將他簡單豐富一下。在這里只添加一個簡單需求&#xff0c;就是用戶注冊成功后給用戶發一封郵件。補充一下之前的代碼 public class DomainService {public void Register(User user){if (_userRepo…

git pull 報錯:Untracked Fles Preventing Merge

場景 使用 git pull 命令更新報錯解決 找到對應的文件刪除后重新打開項目。

關于string,我今天科普的

今天下午朋友討論組上討論一個關于string的問題&#xff0c;問題是這樣的&#xff0c;string a"aaa";string ba;a"bbb",為什么測試b的值不改變&#xff1f;之前我看過一個文章&#xff0c;知道肯定不相等&#xff0c;因為引用地址的一系列問題&#xff0c;…

git pull 報錯:The following untracked working tree files would be overwritten by merge

場景 使用 git pull 命令更新報錯 Updating d652d1c..fa05549 error: The following untracked working tree files would be overwritten by merge:.idea/encodings.xmlPlease move or remove them before you can merge. Aborting 解決 使用 git clean -d -fx 命令即可。

SpringBoot 配置多數據源

項目Git地址&#xff1a;SpringBoot 配置多數據源&#xff1a;Jacob-multi-data-source 準備工作 準備兩個數據庫(此模塊中兩個數據庫一個為本地 一個為遠程&#xff0c;本地為主&#xff0c;遠程為從)。然后建表。 #本地庫 CREATE TABLE username (id bigint(11) NOT NULL AUT…

HDU 2912

直線關于球的多次反射&#xff0c;求最后一次反射點 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath>using namespace std; const double inf1e10; const double eps1e-8; struct point {doub…

EMVTag系列3《持卡人基本信息數據》

9F61 持卡人證件號 L&#xff1a;2–26 R&#xff08;需求&#xff09;&#xff1a;數據應存在&#xff0c;在讀應用數據過程中&#xff0c;終端不檢查&#xff1b; (PBOC2.0第五部分中規定)芯片中持卡人姓名 5F20與持卡人姓名擴展9F0B只能使用一個&#xff0c;另一個必須不…

BindingException: Parameter 'XXX' not found. Available parameters are [collection, list]

應業務需求&#xff0c;需要使用到MQ進行數據上傳和下發。傳遞格式為JSON,服務那邊下發JSON數組&#xff0c;接收端將JSON數組轉換成List集合&#xff0c;調用Mybatis-plus批量添加saveBatch()。提示字段未找到... org.apache.ibatis.exceptions.PersistenceException: ### Er…

JDK 8 新特性 之 default關鍵字

前言 Jdk1.8之前的接口中只聲明方法&#xff0c;方法具體實現應在子類中進行。Jdk1.8打破了這樣的用法&#xff1a;接口中可以實現具體的方法體&#xff0c;只需要加上關鍵字static或者default修飾即可。 default關鍵字 public interface UserService {//自定義方法void getUse…

headroom.js插件使用方法

1.什么是headroom.js&#xff1f; headroom是用純Javascript寫的插件&#xff0c;用來隱藏和展示頁面元素&#xff0c;從而為頁面留下更多空間。比如使用headroom能使導航欄當頁面下滾時消失&#xff0c;當頁面上滾時候又出現。&#xff08;查看效果&#xff09; 2.工作原理 通…

JDK 8 新特性 之 方法引用

概述 方法引用&#xff1a;當要傳遞給Lambda體的操作&#xff0c;已經有實現的方法了&#xff0c;就可以使用方法引用方法引用&#xff1a;在Lambda的基礎上進一步的簡化。換句話說&#xff0c;方法引用就是Lambda表達式&#xff0c;也就是函數式接口的一個實例&#xff0c;通過…

項目記錄:springmvc forward redirect 問題

RequestMapping("/redirect")public String redirect(RedirectAttributes redirectAttributes){redirectAttributes.addFlashAttribute("test", "testdata"); //專供此種情況下使用。return "redirect:read";} 注意&#xff1a;此種情…

JDK 8 新特性 之 Lambda表達式

前言 Lambda 表達式&#xff0c;也可稱為閉包&#xff0c;它是推動 Java 8 發布的最重要新特性。Lambda 允許把函數作為參數傳遞進方法中。使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。lambda表達式的重要特征: 可選類型聲明&#xff1a;不需要聲明參數類型&#xff0c;編譯…