`

使用java合成PDF文件

    博客分类:
  • Java
阅读更多

最近弄一项目,需要将多个tif文件合并成一个pdf文件,基本业务是这样子的:从xml文件读取节点信息组成pdf名称、读取tif文件信息合成pdf文件。我的处理方式是先将每个tif文件按照一定的命名规则转成pdf,再把所有的pdf文件合成一个大的pdf文件。

主要代码如下:

1、createPDFFile方法用来生成pdf文件,包括将tif转成pdf,将多个pdf转成一个pdf

/**
 * @Desc:该方法用来生成pdf文件
 * @param:父级文件夹名称
 * @param:需要处理的文件所在目录
 * */
public boolean createPDFFile(String parentFileName,String newFilePath) throws Exception{
	boolean result=false;
	File listFile = new File(newFilePath+File.separator+"list.xml");
	if(listFile.isFile() && listFile.exists()){//是文件且存在
		String appNum="",appName="",appAJ="",appPer="";
		Document doc=this.getSAXReader().read(listFile);//读取文件
		//1、查找申请号
		List<Element> els= doc.selectNodes("//SHENQINGH");
		if(els.size()==0 || els.get(0).getTextTrim().equals("")){
			errorInfo="没有申请号!\r\n";
			return false;
		}else{
			appNum= els.get(0).getTextTrim();//获取申请号内容
		}
		
		//2、查找名称
		els = doc.selectNodes("//FAMINGMC");
		if(els.size()==0 || els.get(0).getTextTrim().equals("")){
			errorInfo="没有名称!\r\n";
			return false;
		}else{
			appName= els.get(0).getTextTrim();
		}
		
		//3、查找申请人信息
//			System.out.println("申请人信息所在目录:"+(newFilePath+File.separator+parentFileName));
		File appInfoFile = new File(newFilePath+File.separator+parentFileName);
		if(appInfoFile.exists() && appInfoFile.isDirectory()){
			String xmlName="";
			Document xmlDoc=null;
			SAXReader xmlSAX = this.getSAXReader();
			for(File infoXml:appInfoFile.listFiles()){
				xmlName=infoXml.getName().toUpperCase();
				if(xmlName.startsWith(parentFileName.toUpperCase()) && xmlName.endsWith(".XML")){//是XML文件且以父级文件夹名称打头
//						System.out.println(infoXml.exists()+"\n"+infoXml.getAbsolutePath());
					xmlDoc = xmlSAX.read(infoXml);//读取文件
					els = xmlDoc.selectNodes("//applicant_name");//查找申请人名称标签
					appPer = els.get(0).getTextTrim();//获取申请人名称
				}
			}
		}
		
		//4、查找内部编号
		els = doc.selectNodes("//NEIBUBH");
		if(els.size()>0) appAJ = els.get(0).getTextTrim();
		if(appAJ!=null && appAJ.length()>0){//说明有内部编号
			if(appAJ.toUpperCase().startsWith("AJ")){//避免出现小写aj的情况,所以全部转成大写进行比较
				//内部编号只取XSQ后面的部分,但因为XSQ有可能不存在,所以不用XSQ进行截取,用最后一个下划线截取
				appAJ = appAJ.substring(appAJ.lastIndexOf("_")+1);
			}
		}else{
			appAJ="";
		}
		
		//5、查找附件信息
		String[] prefix=null;
		//附件列表
		els = doc.selectNodes("//FUJIANLB");
		String text="";
		if(els.size()>0){//说明有附件
			els = doc.selectNodes("//WENJIANMC");//获取附件列表
			prefix = new String[els.size()];
			for(int i=0;i<els.size();i++){
				text = els.get(i).getTextTrim();
				if(text.indexOf(".")>0)
					prefix[i]=text.substring(0, text.indexOf(".")).trim();
			}
		}
		
		//6、处理主扫描件
		String tiffFolder = newFilePath+File.separator+parentFileName+File.separator+parentFileName;
//			System.out.println("主文件目录:"+tiffFolder);
		Integer i=1;
		i = findTiff(newFilePath,tiffFolder,i);
		
		//7、处理附件
		for(int m=0;m<prefix.length;m++){
			tiffFolder = newFilePath+File.separator+parentFileName+File.separator+prefix[m]+"("+(m+1)+")";
//				System.out.println("附件目录:"+tiffFolder);
			i = findTiff(newFilePath,tiffFolder,i);
		}
		
		//8、拼接扫描件文件集合,包括主扫描件和附件的扫描件
		String[] tiffList = new String[i-1];
		for(int j=0;j<tiffList.length;j++){
			tiffList[j]=newFilePath+File.separator+(j+1)+".pdf";
		}
		//9、合成PDF
		appName = appName.replaceAll("<.*?>", "");//去掉当中的标签
		appName = escapeExprSpecialWord(appName);//去掉特殊字符
		String pdfName = "("+parentFileName+")"+appNum+appName+appPer+appAJ;//最后生成的pdf名称:申请号+名称+申请人+内部编号
//			String pdfName = appNum+appName+appPer+appAJ;//最后生成的pdf名称:申请号+名称+申请人+内部编号
//			System.out.println("PDF文件名称:"+pdfName);
		result=getPDF(classFile.getAbsolutePath(),pdfName,tiffList);
	}
	return result;
}

/**
 * 该方法用来获取SXAReader对象
 * */
public SAXReader getSAXReader(){
	SAXReader saxReader = new SAXReader();
	/* 在读取文件时,去掉dtd的验证,可以缩短运行时间  */
	try {
//			saxReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);//可能需要网络,所以不用它
		saxReader.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.LOAD_EXTERNAL_DTD_FEATURE, false);  //设置不需要校验头文件
	} catch (SAXException e) {
		e.printStackTrace();
	}
	return saxReader;
}

/**
 * 转义正则特殊字符 ($()*+.[]?\^{},|/\:?"<>)
 * @param keyword
 * @return
 */
public String escapeExprSpecialWord(String keyword) {
	if(keyword!=null && keyword.trim().length()>0){
		String[] fbsArr = {"/","\\",":","*","?","\"","<",">","|", "(", ")","+", "[", "]", "^", "{", "}","、"};
		for (String key : fbsArr) {
			if (keyword.contains(key)) {
				keyword = keyword.replace(key,"");
				}
			}
		}
		return keyword;
	}
}

  

2、findTiff方法用来查找tiff文件,toPDF方法用来将tif文件转换成pdf文件。

/**
 * 该方法用来查找tiff文件并转换成pdf文件
 * @param pdfPath:生成后的pdf所在目录
 * @param path:tiff文件所在文件夹
 * @param i:序号(也可以作为文件名称)
 * */
private Integer findTiff(String pdfPath,String path,Integer i){
	File mainFile = new File(path);
	if(mainFile.isDirectory() && mainFile.exists()){//是文件夹且存在
		File[] tiff=mainFile.listFiles();
		for(File tif:tiff){
			if(tif.getName().toUpperCase().endsWith(".TIF") || tif.getName().toUpperCase().endsWith(".TIFF")){//后缀名为tif或tiff的扫描文件
				toPDF(pdfPath,tif,i.toString());
				i++;
			}
		}
	}
	return i;
}

/**
 * 该方法用来将制定的tiff文件转换成pdf文件
 * @param pdfPath:生成后的pdf所在目录
 * @param tiff:需要进行转换的tiff文件
 * @param pdfName:生成的pdf文件名称,只需要规定名称即可,不需要规定后缀名
 * */
public static boolean toPDF(String pdfPath,File tiff,String pdfName){
	boolean result = false;
	//1、判断给定的文件是否是tif文件:既不是tif格式结尾,也不是tiff格式结尾
	if(tiff.getName().toUpperCase().endsWith(".TIF") || tiff.getName().toUpperCase().endsWith(".TIFF")){//两种格式都是扫描文件格式
		//2、获取tiff文件
		pdfName = pdfName + ".pdf";//以当前tif文件命名pdf文件 
//			System.out.println(pdf);//
		com.lowagie.text.Document document = new com.lowagie.text.Document(PageSize.A4); //设置文档大小
        int pages = 0, comps = 0; 
        try{
        	//获取实例
//	        	System.out.println("PDF目录:"+pdfPath+File.separator+pdfName);
        	PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath+File.separator+pdfName)); 
        	document.open();//打开文档 
        	PdfContentByte cb = writer.getDirectContent(); 
         	RandomAccessFileOrArray ra = null; 
//	         	System.out.println("************\nTIFF文件所在目录:"+tiff.getAbsolutePath());
         	ra = new RandomAccessFileOrArray(tiff.getAbsolutePath()); 
            comps = TiffImage.getNumberOfPages(ra); 
            for (int c = 0; c < comps; ++c){ 
            	Image img = TiffImage.getTiffImage(ra, c + 1); 
	             if (img != null){ 
	               img.scalePercent(7200f / img.getDpiX(), 7200f / img.getDpiY()); 
	               document.setPageSize(new Rectangle(img.getScaledWidth(), img.getScaledHeight())); 
	               img.setAbsolutePosition(0, 0); 
	               cb.addImage(img); 
	               document.newPage(); 
	               ++pages; 
	         }
            }
         ra.close(); 
         document.close(); 
         result = true;
       } catch (Throwable e){ 
    	   e.printStackTrace(); 
       } 
	}else{
		return result;
	}
	return  result ;
}

 

 3、mergePdfFiles方法用来将多个pdf文件合并成一个pdf文件。

/** 
 * 得到生成的PDF文件(多个合并) 
 * @param savepath PDF文件保存的路径 
 * @param pdfName pdf文件名称 
 * @param files 需要进行合并的pdf文件 
 * @return String 
 */ 
public static boolean getPDF(String savepath, String pdfName, String[] files){ 
	boolean flag=false;
    savepath = savepath+File.separator+pdfName+".pdf"; 
    //如果是多个PDF文件进行合并 
    if (files.length > 0){ 
        flag = mergePdfFiles(files, savepath); //多个PDF文件合并 
    } 
    return flag; 
} 
/** 
 * 多个PDF合并功能 
 * @param files 多个PDF的路径 
 * @param savepath 生成的新PDF路径 
 * @return boolean boolean 
 */ 
public static boolean mergePdfFiles(String[]files,String savepath){ 
    try{ 
    	File saveFile = new File(savepath);
    	if(!saveFile.exists() || saveFile.isDirectory()){//不存在或是个目录,都需要则新建
    		saveFile.createNewFile();
    	}
    	com.lowagie.text.Document document = new com.lowagie.text.Document(new PdfReader(files[0]).getPageSize(1));            
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath));            
        document.open(); 
        for (int i = 0; i < files.length; i++){
        	if(files[i].toUpperCase().endsWith(".PDF")){
                PdfReader reader = new PdfReader(files[i]);                
                int n = reader.getNumberOfPages();          
                for (int j = 1; j <= n; j++){                   
                    document.newPage(); 
                    PdfImportedPage page = copy.getImportedPage(reader, j);                    
                    copy.addPage(page); 
                }
        	}
        } 
        document.close(); 
        return true; 
    }catch (IOException e){ 
        e.printStackTrace(); 
        return false; 
    }catch(DocumentException e){ 
        e.printStackTrace(); 
        return false; 
    } 
} 

 

 4、需要用到的jar包:

com.lowagie.text_2.1.7.jar
jaxen-1.1-beta-7.jar
dom4j-1.6.1.jar

 

 

 

 

 

分享到:
评论

相关推荐

    Java 生成pdf文件加盖公章图片,上传阿里云

    以上就是使用Java生成PDF文件并加盖公章图片,以及上传阿里云的基本步骤和涉及的关键技术点。实际开发中可能还需要根据具体需求进行调整,例如,公章的透明度、旋转角度等,都需要通过代码进行精确控制。

    java多个PDF文件合并为一个PDF文件源码

    在Java编程环境中,合并多个PDF文件是一项常见的任务,特别是在处理文档集合或自动化工作流程时。以下是一个关于如何在Java中实现这一功能的详细说明。 首先,我们需要一个库来处理PDF文件,Apache PDFBox是一个...

    java多个pdf文件合并成一个

    通过以上步骤,你可以使用Java和Apache PDFBox成功地将多个Base64编码的PDF文件合并为一个PDF文件。这种方法在处理大量PDF文件时非常有效,且代码简洁易于维护。同时,Apache PDFBox库还提供了许多其他功能,如PDF元...

    Java将图片组合成PDF文件的方法

    2. PDF文件生成:PDF文件生成是指使用Java语言生成PDF文件的过程。PDF文件生成可以使用iText库,该库提供了一个强大的PDF文件生成工具,可以生成各种类型的PDF文件,如文本PDF、图像PDF、表格PDF等。 3. 文件选择器...

    大量图片合成到一个pdf文件

    总结,将大量图片合成到一个PDF文件,使用Java和PDFBox库是一个高效且灵活的方法。通过理解这些基本操作,你可以根据具体需求进行定制,创建出满足各种场景的PDF文档。在处理大批量图片时,可能还需要考虑性能优化,...

    java 多个pdf合并,目录生成(支持自定义目录),页码生成(源码)

    本项目提供了一个纯Java实现的解决方案,它能有效地完成多个PDF文件的合并,并且支持自定义目录的生成以及页码的添加。 首先,`PDFUtil.java`是这个项目的核心类,它包含了处理PDF的关键方法。PDFUtil可能包含了...

    java 多个多页的tif文件转pdf方法

    在Java编程环境中,将多个多页的TIFF(Tagged Image File Format)文件转换为PDF文档,可以使用一些专门处理这种任务的库,其中iTextPDF是一个广泛使用的库。本篇将详细介绍如何利用iTextPDF库实现这个转换过程,并...

    java:图片列表合并转pdf完整示例

    3. 保存PDF文件时,确保有写入文件的权限。 4. 记得在完成操作后关闭`PDDocument`,避免内存泄漏。 在实际应用中,你可能需要根据具体需求进行更多的定制,比如设置页面布局、添加文字说明、调整图像质量等。通过...

    PDF合成代码实例

    如果需要,可以使用库提供的功能对新合成的PDF文件设置权限。 8. 兼容性测试:合成后的PDF应能在各种阅读器上正常打开和显示,因此,测试其在不同平台和设备上的兼容性是必不可少的。 9. 性能优化:对于大量PDF的...

    PDF合并工具:将多个pdf合并成一个pdf文件

    可以将多个PDF合并成一个pdf文件,如使用命令 merge D:\\luolf\\tmp\\test_out.pdf D:\\luolf\\tmp\\test.pdf,D:\\luolf\\tmp\\test1.pdf,D:\\luolf\\tmp\\test2.pdf 可以将 test.pdf,test1.pdf,test2.pdf 合并成一...

    13年基础代码修改的大量图片合成到一个pdf文件

    标题中的“13年基础代码修改的大量图片合成到一个pdf文件”指的是一个软件或程序,可能是基于2013年的原始代码进行了修改,用于将多张图片合并成一个PDF文档。这个过程涉及到图像处理和PDF文档生成的技术。 在描述...

    Java+电子签名,生成PDF格式的合同

    在Java环境中,我们可以使用如iText、PDFBox、Apache PDFBox等库来处理PDF文档和生成电子签名。在这个场景下,我们使用的是Freemarker模板引擎来将HTML转换为PDF,这使得我们可以方便地动态生成合同内容。 1. **...

    itextpdf在已有pdf指定页及位置添加图片(包含jar及实例)

    在IT行业中,PDF(Portable Document Format...总的来说,使用iTextPDF库,你可以轻松地在已有的PDF文件中添加图片,实现灵活的PDF编辑功能。通过熟练掌握iTextPDF的API,你可以处理更多复杂的PDF操作,提高工作效率。

    java16进制与字符串的转换.pdf

    在 Java 中,我们可以使用 `uniteBytes` 函数将两个 ASCII 字符合成一个字节。该函数接受两个参数 src0 和 src1,即两个 ASCII 字符,然后将其合成一个字节。 ```java public static byte uniteBytes(byte src0, ...

    Java工具包Hutool Wiki PDF版

    Hutool的命名来源于对“Hu”(致敬前任公司)和“tool”(工具)的合成,同时谐音“糊涂”,寓意在开发中追求一种豁达的心态。Hutool最初起源于项目中的util包,逐步发展成为了一个全面、丰富的Java工具集。 Hutool...

    java Pdf转换图片

    总结来说,Java中使用PDFBox库可以方便地实现PDF转图片的功能,并且可以进行缩放和多页合成的操作。在实际应用中,根据具体需求,可能还需要考虑其他因素,如图片质量、内存管理以及并发处理大量PDF时的性能优化等。

    Java生成PDF的jar(这个是对的)

    iText提供了丰富的API,可以方便地创建、读取、修改和解析PDF文件。通过iText,你可以控制PDF的布局,插入文本、图像,甚至创建复杂的表格和列表。示例博客可能演示了如何使用iText的基本操作,如创建一个新的PDF...

    免费的pdf合成软件的源码,可以合成目录内所有PDF到一个文件,运行mergePDF.exe文件进行合成操作

    在源码中,开发者可能使用了如C++、C#或Java等编程语言,并结合上述的PDF库实现了PDF文件的合并功能。运行这个程序,系统会扫描指定目录下的所有PDF文件,并将它们整合到一个新文件中,大大简化了用户的操作流程。 ...

    在线合成Java合软.pdf

    而在线合成Java应用程序的教程《在线合成Java合软.pdf》就为他们提供了一条清晰的解决途径。 教程的开篇首先建议用户选择轻量版的QQ进行操作,这是因为轻量版的QQ在合成过程中的兼容性和资源占用方面更胜一筹。对于...

Global site tag (gtag.js) - Google Analytics