java带书签合并拆分pdf样例

java带书签合并拆分pdf样例

本人最近做民航维修手册发布任务时遇到合并拆分pdf并且插入附件丢失书签问题

	//封面
	public static final String COVERS_PAGE = "01_covers";
	//批准页
	public static final String APPROVE_PAGE = "02_approve";
	//维修总裁声明
	public static final String DECLARE_PAGE = "03_declare";
	//总目录
	public static final String CATALOG_PAGE = "04_catalog";
	//批准有效页清单
	public static final String APPROVE_VALID_PAGE = "05_approvevalid";
	//有效页清单
	public static final String VALID_PAGE = "06_valid";
	//改版记录
	public static final String REVISION_PAGE = "07_revision";
	//插换页记录
	public static final String PLUGCHG_PAGE = "08_plugchg";
	//第一部分修订说明
	public static final String AMEND_PAGE = "09_first";
	//第二部分前言Introduction
	public static final String INSTRODUCTION_PAGE = "10_second";
	//第三部分定期维修项目
	public static final String THIRD_PAGE = "11_third";
	//第四部分部件维修控制
	public static final String FOUR_PAGE = "12_four";
	//第五部分
	public static final String FIVE_PAGE = "13_five";
	//第六部分
	public static final String SIX_PAGE = "14_six";
	public static final String DIRECTION_START = "start";
	public static final String DIRECTION_END = "end";
	public static void main(String args[]) throws InvalidPasswordException, IOException {
     
		ArrayList flist = new ArrayList();
		flist.add("C:/Users/Xu1fw/Desktop/qdal/start2.pdf");
		flist.add("C:/Users/Xu1fw/Desktop/qdal/six.pdf");
//		flist.add("C:/Users/Xu1fw/Desktop/qdal/end.pdf");
		//flist.add("d:/eotest/2014910__487506.pdf");
		// flist.add("d:/eotest/sect2.pdf.pdf.pdf");
		try {
     
//			PDFUtil.composeMTPDF(flist, "D:/ALL80/CAOM012427.pdf");
			PDFUtil.mergePdfFiles(flist, "C:/Users/Xu1fw/Desktop/qdal/merge2.pdf",SIX_PAGE,589);
		} catch (Exception e) {
     
			e.printStackTrace();
		}
	}
	
	public static void main22(String[] args) {
     
		String filePath = "C:/Users/Xu1fw/Desktop/qdal/MP07.pdf";
		File file = new File(filePath);
		PDDocument document = null;
		try {
     
			if(file != null && file.isFile()){
     
				System.out.println(file.getPath());
				document = PDDocument.load(file, MemoryUsageSetting.setupTempFileOnly());
			}
			int pages = document.getNumberOfPages();
			System.out.println(pages);
//			String chapter = "D:/ALL80/dd.pdf";
			String chapter = "C:/Users/Xu1fw/Desktop/qdal/01.pdf";
//			splitPdfByPages(document, 0, 2, chapter);
			splitPDF("C:/Users/Xu1fw/Desktop/qdal/MP07.pdf","C:/Users/Xu1fw/Desktop/qdal/start2.pdf"
					,1,589,"14_six","start");
//			splitPDF("C:/Users/Xu1fw/Desktop/qdal/MP07.pdf","C:/Users/Xu1fw/Desktop/qdal/02.pdf"
//					,3,4,"02_six","end");
//			String chapter2 = "D:/ALL80/ff.pdf";
//			splitPdfByPages(document, 3, pages, chapter2);
//			ArrayList flist = new ArrayList();
//			flist.add(chapter);
//			flist.add("D:/ALL80/aa.pdf");
//			flist.add(chapter2);
//			PDFUtil.mergePdfFiles(flist, "D:/ALL80/bc.pdf");
		} catch (Exception e) {
     
			e.printStackTrace();
		}finally{
     
			try {
     
				if(document != null){
     
				document.close();
				}
			} catch (IOException e) {
     
				e.printStackTrace();
			}
		}
		
		
	}
	 public static void splitPDF(String bytes, String newFile, int start, int end,String bookmark,String direction) {
     
	        Document document = null;
	        PdfCopy copy = null;
	        PdfReader reader = null;
	        try {
     
	            reader = new PdfReader(bytes);
	    		List bookmarkList = SimpleBookmark.getBookmark(reader);
//	    		System.out.println(bookmarkList.size());
				List resultBookmark = new ArrayList();
				//获取pdf页数
	            int n = reader.getNumberOfPages();
	            if (end == 0) {
     
	                end = n;
	            }
	            document = new Document(reader.getPageSize(1));
	            copy = new PdfCopy(document, new FileOutputStream(newFile));

	            document.open();
	            for (int j = start; j <= end; j++) {
     
	                document.newPage();
	                PdfImportedPage page = copy.getImportedPage(reader, j);
	                copy.addPage(page);
	            }
	            //获取当前书签层级
	            String levelStr = bookmark.substring(0,bookmark.indexOf("_"));
	            int bookmarkLevel = 0;
	            if(levelStr.startsWith("0")){
     
	            	bookmarkLevel = Integer.parseInt(levelStr.substring(1));	
	            }else{
     
	            	bookmarkLevel = Integer.parseInt(levelStr);
	            }
//            	int bookmarkLevel = bookmark.substring(beginIndex)
	            //判断当前书签层级
	            	if(DIRECTION_START.equalsIgnoreCase(direction)){
     
	            		for(int i = 0;i < bookmarkLevel-1;i++){
     
	            			HashMap bk = (HashMap)bookmarkList.get(i);
	    	            	resultBookmark.add(bk); 
	            		}
	            	}else{
     
	            		for(int i = bookmarkLevel;i < bookmarkList.size();i++){
     
	            			HashMap bk = (HashMap)bookmarkList.get(i);
	    	            	resultBookmark.add(bk); 
	            		}
	            	}
	      
	    		copy.setOutlines(resultBookmark);
	        } catch (Exception e) {
     
				e.printStackTrace();
	            System.err.println("split pdf file error:" + e.getMessage());
	        }finally{
     
	        	if(document != null){
     
	        		 document.close();
	        	}
	        	if(reader != null){
     
	 	            reader.close();
	        	}

	        }
	    }
		public static void mergePdfFiles(ArrayList filelist, String savepath,String level,int posPageNum) {
     
			Document document = null;
			try {
     
			    document = new Document(new PdfReader((String) filelist.get(0)).getPageSize(1));
				PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath));
				document.open();
				List resultBookmark = new ArrayList();
				for (int i = 0; i < filelist.size(); i++) {
     
					PdfReader reader = new PdfReader((String) filelist.get(i));
					List bookmarkList = SimpleBookmark.getBookmark(reader);
				   //如果为要插入的附件
				   if(i == 1){
     	
					if(SIX_PAGE.equalsIgnoreCase(level)){
     
						if(bookmarkList != null && bookmarkList.size() > 0){
     
							dealHasBookmark(bookmarkList, resultBookmark, level, posPageNum);
						}else{
     
							dealNotBookmark(resultBookmark, level, posPageNum);   
						}
					}else{
     
						if(bookmarkList != null && bookmarkList.size() > 0){
     
							dealHasBookmark(bookmarkList, resultBookmark, level, posPageNum);
						}else{
     
							dealNotBookmark(resultBookmark, level, posPageNum);   
						}
					}
				   }else{
     
						resultBookmark.addAll(bookmarkList);   
				   }
					//测试跳转页面
//					if(i==1){
     
//				    if(bookmarkList != null){		
//					 for(Object o : bookmarkList){
     
//						 HashMap bk = (HashMap)o;
//						 resultBookmark.add(bk);
//						 System.out.println((String)bk.get("Title"));
//						 if(((String)bk.get("Title")).contains("MP批准页")){
     
							    bk.remove("Named");
//						        bk.put("Action", "GoTo");
//						        bk.put("Page", "3 FitH 846");
//						 }
						 for(Object o1 :bk.keySet()){
     
							System.out.println((String)o1+"-------"+bk.get((String)o1)); 
						 }
//					 }
//				      }
//					}else{
     
//						resultBookmark.addAll(bookmarkList);
//					}
					int n = reader.getNumberOfPages();
					for (int j = 1; j <= n; j++) {
     
						PdfImportedPage page = copy.getImportedPage(reader, j);
						copy.addPage(page);
					}
					if(reader != null){
     
						reader.close();
					}
				}
	    		copy.setOutlines(resultBookmark);
			} catch (IOException e) {
     
				e.printStackTrace();
			} catch (DocumentException e) {
     
				e.printStackTrace();
			}finally{
     
				document.close();
			}
		}

	public static void dealHasBookmark(List bookmarkList, List resultBookmark, String level,int posPageNum) {
     
		if (SIX_PAGE.equalsIgnoreCase(level)) {
     
			for (Object o : bookmarkList) {
     
				HashMap bk = (HashMap) o;
//				resultBookmark.add(bk);
//				if (((String) bk.get("Title")).contains("部件寿命限制清单")) {
     
					// bk.remove("Named");
					bk.put("Action", "GoTo");
					bk.put("Page", posPageNum+" FitH 600");
					resultBookmark.add(bk);
//				}
			}
		} else {
     
			for (Object o : bookmarkList) {
     
				HashMap bk = (HashMap) o;
//				System.out.println((String) bk.get("Title"));
//				if (((String) bk.get("Title")).contains("MP批准页")) {
     
					// bk.remove("Named");
					bk.put("Action", "GoTo");
					bk.put("Page", posPageNum+" FitH 846");
					resultBookmark.add(bk);
//				}
			}
		}
	}

	public static void dealNotBookmark(List resultBookmark, String level, int posPageNum) {
     
		if (SIX_PAGE.equalsIgnoreCase(level)) {
     
			HashMap bk = new HashMap();
			bk.put("Action", "GoTo");
			bk.put("Title", "第六部分 部件寿命限制清单");
			bk.put("Page", posPageNum + " FitH 600");
			resultBookmark.add(bk);
		} else {
     
			HashMap bk = new HashMap();
			bk.put("Action", "GoTo");
			if (APPROVE_PAGE.equals(level)) {
     
				bk.put("Title", "002 MP批准页");
			} else if (DECLARE_PAGE.equals(level)) {
     
				bk.put("Title", "003 维修副总裁声明");

			} else if (CATALOG_PAGE.equals(level)) {
     
				bk.put("Title", "004 总目录");

			} else if (APPROVE_VALID_PAGE.equals(level)) {
     
				bk.put("Title", "005 批准有效页清单");

			} else if (PLUGCHG_PAGE.equals(level)) {
     
				bk.put("Title", "008 插换页记录");

			}
			bk.put("Page", posPageNum + " FitH 846");
			resultBookmark.add(bk);
		}
	}

你可能感兴趣的:(合并拆分pdf是夹带书签样例,java)