最近弄一项目,需要将多个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文件,Apache PDFBox是一个...
通过以上步骤,你可以使用Java和Apache PDFBox成功地将多个Base64编码的PDF文件合并为一个PDF文件。这种方法在处理大量PDF文件时非常有效,且代码简洁易于维护。同时,Apache PDFBox库还提供了许多其他功能,如PDF元...
2. PDF文件生成:PDF文件生成是指使用Java语言生成PDF文件的过程。PDF文件生成可以使用iText库,该库提供了一个强大的PDF文件生成工具,可以生成各种类型的PDF文件,如文本PDF、图像PDF、表格PDF等。 3. 文件选择器...
总结,将大量图片合成到一个PDF文件,使用Java和PDFBox库是一个高效且灵活的方法。通过理解这些基本操作,你可以根据具体需求进行定制,创建出满足各种场景的PDF文档。在处理大批量图片时,可能还需要考虑性能优化,...
本项目提供了一个纯Java实现的解决方案,它能有效地完成多个PDF文件的合并,并且支持自定义目录的生成以及页码的添加。 首先,`PDFUtil.java`是这个项目的核心类,它包含了处理PDF的关键方法。PDFUtil可能包含了...
在Java编程环境中,将多个多页的TIFF(Tagged Image File Format)文件转换为PDF文档,可以使用一些专门处理这种任务的库,其中iTextPDF是一个广泛使用的库。本篇将详细介绍如何利用iTextPDF库实现这个转换过程,并...
3. 保存PDF文件时,确保有写入文件的权限。 4. 记得在完成操作后关闭`PDDocument`,避免内存泄漏。 在实际应用中,你可能需要根据具体需求进行更多的定制,比如设置页面布局、添加文字说明、调整图像质量等。通过...
如果需要,可以使用库提供的功能对新合成的PDF文件设置权限。 8. 兼容性测试:合成后的PDF应能在各种阅读器上正常打开和显示,因此,测试其在不同平台和设备上的兼容性是必不可少的。 9. 性能优化:对于大量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文件”指的是一个软件或程序,可能是基于2013年的原始代码进行了修改,用于将多张图片合并成一个PDF文档。这个过程涉及到图像处理和PDF文档生成的技术。 在描述...
在Java环境中,我们可以使用如iText、PDFBox、Apache PDFBox等库来处理PDF文档和生成电子签名。在这个场景下,我们使用的是Freemarker模板引擎来将HTML转换为PDF,这使得我们可以方便地动态生成合同内容。 1. **...
在IT行业中,PDF(Portable Document Format...总的来说,使用iTextPDF库,你可以轻松地在已有的PDF文件中添加图片,实现灵活的PDF编辑功能。通过熟练掌握iTextPDF的API,你可以处理更多复杂的PDF操作,提高工作效率。
在 Java 中,我们可以使用 `uniteBytes` 函数将两个 ASCII 字符合成一个字节。该函数接受两个参数 src0 和 src1,即两个 ASCII 字符,然后将其合成一个字节。 ```java public static byte uniteBytes(byte src0, ...
Hutool的命名来源于对“Hu”(致敬前任公司)和“tool”(工具)的合成,同时谐音“糊涂”,寓意在开发中追求一种豁达的心态。Hutool最初起源于项目中的util包,逐步发展成为了一个全面、丰富的Java工具集。 Hutool...
总结来说,Java中使用PDFBox库可以方便地实现PDF转图片的功能,并且可以进行缩放和多页合成的操作。在实际应用中,根据具体需求,可能还需要考虑其他因素,如图片质量、内存管理以及并发处理大量PDF时的性能优化等。
iText提供了丰富的API,可以方便地创建、读取、修改和解析PDF文件。通过iText,你可以控制PDF的布局,插入文本、图像,甚至创建复杂的表格和列表。示例博客可能演示了如何使用iText的基本操作,如创建一个新的PDF...
在源码中,开发者可能使用了如C++、C#或Java等编程语言,并结合上述的PDF库实现了PDF文件的合并功能。运行这个程序,系统会扫描指定目录下的所有PDF文件,并将它们整合到一个新文件中,大大简化了用户的操作流程。 ...
而在线合成Java应用程序的教程《在线合成Java合软.pdf》就为他们提供了一条清晰的解决途径。 教程的开篇首先建议用户选择轻量版的QQ进行操作,这是因为轻量版的QQ在合成过程中的兼容性和资源占用方面更胜一筹。对于...