項目通常都是以pdf.js插件閱讀PDF文件,但存在閱讀體驗不理想的狀況,因此參考手機上的電子書閱讀器,使用國外的連接描述http://fliphtml5.com
製做電子書示例。javascript
完整代碼已上傳git,標題搜索便可。html
插件功能強大,縮略圖,鼠標翻頁,放大縮小均可以,部分配置代碼config.js以下html5
var bookConfig = { appName:'flippdf', totalPageCount : 0, largePageWidth : 1080, largePageHeight : 1440, normalPath : "files/page/", largePath : "files/large/", thumbPath : "files/thumb/", ToolBarsSettings:"", TitleBar:"", appLogoLinkURL:"", bookTitle:"FLIPBUILDER", bookDescription:"", ButtonsBar:"", ShareButton:"", ThumbnailsButton:"", ThumbnailsButtonVisible:"Hide", ZoomButton:"", ZoomButtonVisible:"No", FlashDisplaySettings:"", MainBgConfig:"", bgBeginColor:"#cccccc", bgEndColor:"#eeeeee", bgMRotation:45, pageBackgroundColor:"#FFFFFF", flipshortcutbutton:"Hide", BookMargins:"", topMargin:10, bottomMargin:10, leftMargin:10, rightMargin:10, HTMLControlSettings:"", linkconfig:"", LinkDownColor:"#808080", LinkAlpha:0.5, OpenWindow:"_Blank", BookMarkButtonVisible:'False', productName : 'Demo created by Flip PDF', homePage : 'http://www.html5.com/', isFlipPdf : "False", TableOfContentButtonVisible:"False", searchTextJS:'javascript/search_config.js', searchPositionJS:undefined };
插件顯示實際是使用的jpg圖片,能夠由pdf文檔生成,其中涉及的是正常圖片和縮略圖的生成。
具體以下java
maven引入git
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.9</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.9</version> </dependency>
核心程序apache
import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; public class pdftest { public static void main(String[] args) { String fileAddress="D:\\data"; String filename="qqq"; String type="jpg"; pdf2png(fileAddress,filename,type); } /** * 轉換所有的pdf * @param fileAddress 文件地址 * @param filename PDF文件名 * @param type 圖片類型 */ public static void pdf2png(String fileAddress,String filename,String type) { // 將pdf裝圖片 而且自定義圖片得格式大小 File file = new File(fileAddress+"\\"+filename+".pdf"); try { PDDocument doc = PDDocument.load(file); PDFRenderer renderer = new PDFRenderer(doc); int pageCount = doc.getNumberOfPages(); for (int i = 0; i < pageCount; i++) { BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI //ImageIO.write(image, type, new File(fileAddress+"\\"+filename+"_"+(i+1)+"."+type)); ImageIO.write(image, type, new File("D:\\data\\html5-ebook-paging-mobile\\files\\mobile\\"+(i+1)+"."+type)); BufferedImage srcImage = resize(image, 240, 240);//產生縮略圖 ImageIO.write(srcImage, type, new File("D:\\data\\html5-ebook-paging-mobile\\files\\thumb\\"+(i+1)+"."+type));//產生縮略圖 } } catch (IOException e) { e.printStackTrace(); } } /** *自由肯定起始頁和終止頁 * @param fileAddress 文件地址 * @param filename pdf文件名 * @param indexOfStart 開始頁 開始轉換的頁碼,從0開始 * @param indexOfEnd 結束頁 中止轉換的頁碼,-1爲所有 * @param type 圖片類型 */ public static void pdf2png(String fileAddress,String filename,int indexOfStart,int indexOfEnd,String type) { // 將pdf裝圖片 而且自定義圖片得格式大小 File file = new File(fileAddress+"\\"+filename+".pdf"); try { PDDocument doc = PDDocument.load(file); PDFRenderer renderer = new PDFRenderer(doc); int pageCount = doc.getNumberOfPages(); for (int i = indexOfStart; i < indexOfEnd; i++) { BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI // BufferedImage srcImage = resize(image, 240, 240);//產生縮略圖 ImageIO.write(image, type, new File(fileAddress+"\\"+filename+"_"+(i+1)+"."+type)); } } catch (IOException e) { e.printStackTrace(); } } /** * 縮略圖 */ private static BufferedImage resize(BufferedImage source, int targetW, int targetH) { int type = source.getType(); BufferedImage target = null; double sx = (double) targetW / source.getWidth(); double sy = (double) targetH / source.getHeight(); if (sx > sy) { sx = sy; targetW = (int) (sx * source.getWidth()); } else { sy = sx; targetH = (int) (sy * source.getHeight()); } if (type == BufferedImage.TYPE_CUSTOM) { ColorModel cm = source.getColorModel(); WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH); boolean alphaPremultiplied = cm.isAlphaPremultiplied(); target = new BufferedImage(cm, raster, alphaPremultiplied, null); } else { target = new BufferedImage(targetW, targetH, type); } Graphics2D g = target.createGraphics(); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy)); g.dispose(); return target; } }