PDF解決方案(1)--文件上傳html
PDF解決方案(2)--文件轉PDFlinux
PDF解決方案(4)--在線瀏覽windows
前言:上一篇中講到的文件上傳,文件上傳在網絡上有大量的範例,由於想提供一個完整的解決方案就放上了,僅供參考;這一篇主要介紹一些經常使用文件轉換爲PDF的實現。api
經過百度瞭解到如今office轉換爲pdf主要有三種形式:Jacob、JCom、openoffice,前兩種方式均依賴windows平臺和office軟件(其中JCom還須要Acrobat_Pro且已註冊),成本很高且侷限性很大,第三種方式使用開源的openoffice支持跨平臺使用,目前絕大部分的web應用都會部署在linux或UNIX平臺,因此第三種方式是一種最好的實現方案,下面介紹第三種方案的實現(基於windows平臺,linux平臺在openoffice的安裝和啓動略有差別,但Java調用的代碼是相同的,後面在提供專門篇幅來介紹linux平臺的openoffice安裝和啓動),前兩種方式會在下面提供demo供你們參考。網絡
轉換前須要先安裝並以服務方式啓動openoffice軟件:app
openoffice下載地址:http://www.openoffice.org/download/index.htmlless
安裝成功後在cmd中定位到program目錄,執行命令:soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard,而後執行:netstat -ano|findstr "8100" ,當出現如圖紅線所示則表示啓動成功了。socket
調用openoffice代碼:spa
調用openoffice進行轉換須要用到openoffice提供的jar包:jodconverter、juh、jurt、ridl、slf4j-api、slf4j-jdk1四、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); } }
圖片轉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