`
月亮不懂夜的黑
  • 浏览: 156374 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java处理office文档与pdf文件(二)

阅读更多

该部分主要内容:文件上传,以及office文件和pdf的html处理,以及提取text

// 根据服务器的文件保存地址和原文件名创建目录文件全路径
		File file = this.getFile();
		String url = "";
		String tempFile = "";
		String fileFolder = "";	//上传文件路径
		String hz = "";
		String oldOrgFileId = null;
		Long oldId = knowledge.getZsk_zskID();
		if(null != oldId && 0 != oldId){
			oldOrgFileId = knowledge.getOrgFileId();
		}
		
		if(null != file){
			// 截取扩展名
			hz = fileFileName.substring(fileFileName.lastIndexOf("."),fileFileName.length());
			String zskCode = knowledge.getZsk_Code();
			fileFolder = createNewFile(this.savePath,zskCode);
			// 上传的文件在服务器中的全路径
			url = fileFolder + "\\" + fileFileName;
			//1、文件上传
			FileUtils.copyFile(file, new File(url));	
			
			//2、文件转化为html
			tempFile = createNewFile(this.tempPath,zskCode);
			String htmlStr = "";
			if(hz.equals(".pdf")){
				htmlStr = "<html><body>" +
				"<embed src='"+fileFileName+"' width='100%' height='100%'></embed>" +
				"</body></html>";
			}else{
				String dstHtml = tempFile+"\\"+zskCode+".html";
				//删除文件夹下所有文件及子文件夹
				FileUtil.deleteChildFile(new File(tempFile));
				
				changeDocToHtml(hz, url, dstHtml);
				htmlStr = FileUtil.htmlToStr(dstHtml);
			}
			knowledge.setContentHtml(htmlStr);
			Clob htmlColb=Hibernate.createClob(htmlStr);
			knowledge.setZsk_Description(htmlColb);
			
			//3、获取上传文件对应的文本内容
			String docContent = findDocContent(hz, url);
			knowledge.setContentText(docContent);
			Clob docContentClob=Hibernate.createClob(docContent);
			knowledge.setZsk_Text(docContentClob);
			
			String orgFileId = new GUID().toString();	//知识库原文件对应的标识
			knowledge.setOrgFileId(orgFileId);
			knowledge.setZsk_ContentType(1);
		}else{
			Clob htmlColb = Hibernate.createClob(htmlArea);
			Clob textClob = Hibernate.createClob(htmlArea.replaceAll("</?[^>]+>", ""));
			knowledge.setZsk_Description(htmlColb);
			knowledge.setContentHtml(htmlArea);
			knowledge.setZsk_Text(textClob);
			knowledge.setContentText(htmlArea);
			knowledge.setZsk_ContentType(2);
		}
		
		//添加时处理
		if(null == oldId || 0 ==  oldId){
			//to--do  需要在后期重新处理 当前用户
			if(null == knowledge.getZsk_Author() || "".equals(knowledge.getZsk_Author())){	//当前用户
				knowledge.setZsk_Author(SessionUtil.getTSysAgent().getCagentname());
			}
			knowledge.setZsk_RegisterTime(new Date());
		}
		//to---do 
		knowledge.setZsk_LastMender(1L);
		knowledge.setZsk_ModifyTime(new Date());
		
		KnowLedgeOtherContion ko = new KnowLedgeOtherContion();
		ko.setFileContentType(fileContentType);
		ko.setFileFileName(fileFileName);
		ko.setOldId(oldId);
		ko.setTempFile(tempFile);
		ko.setUrl(url);
		ko.setOldOrgFileId(oldOrgFileId);
		
		knowUploadServiceImp.saveOrUpdateKnowledge(knowledge,ko);

 将office转化为html

/**
	 * 将word,excel,ppt,pdf转化为html
	 * @param hz
	 * @param url
	 * @param dstHtml
	 */
	private void changeDocToHtml(String hz, String url, String dstHtml) {
		if("pdf".equalsIgnoreCase(hz)){
			
		}else if(".xls".equalsIgnoreCase(hz) || ".xlsx".equalsIgnoreCase(hz)){
			DocToHtml.getInstance().ExceltoHtml(url,dstHtml);
		}else if(".doc".equalsIgnoreCase(hz) || ".docx".equalsIgnoreCase(hz)){
			DocToHtml.getInstance().WordtoHtml(url,dstHtml);
		}else if(".ppt".equalsIgnoreCase(hz) || ".pptx".equalsIgnoreCase(hz)){
			DocToHtml.getInstance().PPTtoHtml(url, dstHtml);
		}
	}

 将word,wxcel,ppt另存为html的方法

public boolean WordtoHtml(String srcFile, String dstFile) {
		ComThread.InitSTA();
		ActiveXComponent activexcomponent = new ActiveXComponent("Word.Application");
		String s2 = srcFile;
		String s3 = dstFile;
		boolean flag = false;
		try {
			activexcomponent.setProperty("Visible", new Variant(false));
			Dispatch dispatch = activexcomponent.getProperty("Documents").toDispatch();
			Dispatch dispatch1 = Dispatch.invoke(dispatch, "Open", 1,
					new Object[] { s2, new Variant(false), new Variant(true) },
					new int[1]).toDispatch();
			Dispatch.invoke(dispatch1, "SaveAs", 1, new Object[] { s3,new Variant(8) }, new int[1]);
			Variant variant = new Variant(false);
			Dispatch.call(dispatch1, "Close", variant);
			flag = true;
		} catch (Exception exception) {
			log.error("word转化为html出错-->"+exception.getMessage());
		} finally {
			activexcomponent.invoke("Quit", new Variant[0]);
			ComThread.Release();
			ComThread.quitMainSTA();
		}
		return flag;
	}

	public boolean PPTtoHtml(String srcFile, String dstFile) {
		ComThread.InitSTA();
		ActiveXComponent activexcomponent = new ActiveXComponent( "PowerPoint.Application");
		boolean flag = false;
		try {
			Dispatch dispatch = activexcomponent.getProperty("Presentations")
					.toDispatch();
			Dispatch dispatch1 = Dispatch.call(dispatch, "Open", srcFile,
					new Variant(-1), new Variant(-1), new Variant(0))
					.toDispatch();
			Dispatch.call(dispatch1, "SaveAs", dstFile, new Variant(12));
//			Variant variant = new Variant(-1);
			Dispatch.call(dispatch1, "Close");
			flag = true;
		} catch (Exception exception) {
			log.error("ppt转化为html出错-->"+exception.getMessage());
		} finally {
			activexcomponent.invoke("Quit", new Variant[0]);
			ComThread.Release();
			ComThread.quitMainSTA();
		}
		return flag;
	}

	public boolean ExceltoHtml(String s, String s1) {
		 ComThread.InitSTA();
		 ActiveXComponent activexcomponent = new
		 ActiveXComponent("Excel.Application");
		 boolean flag = false;
		 try
		 {
			 activexcomponent.setProperty("Visible", new Variant(false));
			 Dispatch dispatch = activexcomponent.getProperty("Workbooks").toDispatch();
			 Dispatch dispatch1 = Dispatch.invoke(dispatch, "Open", 1, new Object[] {
					 s, new Variant(false), new Variant(true)}, new int[1]).toDispatch();
			 Dispatch.call(dispatch1, "SaveAs", s1, new Variant(44));
			 Variant variant = new Variant(false);
			 Dispatch.call(dispatch1, "Close", variant);
			 flag = true;
		 }catch(Exception exception){
			 log.error("excel转化为html出错-->"+exception.getMessage());
		 }finally{
			 activexcomponent.invoke("Quit", new Variant[0]);
			 ComThread.Release();
			 ComThread.quitMainSTA();
		 }
		 return flag;
	}

 获取office文件以及pdf的文本内容

private String findDocContent(String hz, String url) {
		String docContent = null;
		File file = new File(url);
		if(".pdf".equalsIgnoreCase(hz)){
			docContent = GetDocText.getDocTextInta().getTextFromPdf(file);
		}else if(".xls".equalsIgnoreCase(hz) || ".xlsx".equalsIgnoreCase(hz)){
			docContent = GetDocText.getDocTextInta().getTextFromExcel(file);
		}else if(".doc".equalsIgnoreCase(hz) || ".docx".equalsIgnoreCase(hz)){
			docContent = GetDocText.getDocTextInta().getTextFromWord(file);
		}else if(".ppt".equalsIgnoreCase(hz) || ".pptx".equalsIgnoreCase(hz)){
			docContent = GetDocText.getDocTextInta().getTextFromPPT(file);
		}
		return docContent;
	}

 具体的实现方法

/**
	 * 从word文件获取文本内容
	 * 
	 * @param wordFile
	 * @return word文件的文本内容
	 */
	public String getTextFromWord(File wordFile) {
		String wordText = "";
		InputStream is = null;
		try {  
            //word 2003: 图片不会被读取  
            is = new FileInputStream(wordFile);
            String fileName = wordFile.getName();
		    String hz = fileName.substring(fileName.lastIndexOf("."),fileName.length());
		    if(".doc".equals(hz)){
		    	WordExtractor ex = new WordExtractor(is);  
		    	wordText = ex.getText();
		    }else{
		    	OPCPackage opcPackage = POIXMLDocument.openPackage(wordFile.getAbsolutePath());
		    	POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);  
		    	wordText = extractor.getText();
		    }
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }finally{
        	if(is != null){
        		try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
        	}
        }
		return wordText;
	}

	/**
	 * 从excel获取文本内容
	 * 
	 * @param excelFile
	 * @return Excel文件的文本内容
	 */
	public String getTextFromExcel(File excelFile) {
		String text = "";
		InputStream in = null;
		try {
			//创建相关的文件流对象
			in = new FileInputStream(excelFile);
		    //声明相关的工作薄对象
			Workbook wb =null;
		    //声明相关的excel抽取对象
		    ExcelExtractor extractor=null;
		    String fileName = excelFile.getName();
		    String hz = fileName.substring(fileName.lastIndexOf("."),fileName.length());
		    
		    if(hz.equals(".xls"))//针对2003版本
		    {
		    	//创建excel2003的文件文本抽取对象
		    	wb=new HSSFWorkbook(new POIFSFileSystem(in));
		    	extractor =new org.apache.poi.hssf.extractor.ExcelExtractor((HSSFWorkbook)wb);
		    }else{ //针对2007版本
		    	wb = new  XSSFWorkbook(in);
		    	//创建excel2007的文件文本抽取对象
		    	extractor =new XSSFExcelExtractor((XSSFWorkbook)wb);
		    }
		    
		    extractor.setFormulasNotResults(false);
		    //是否抽象sheet页的名称
		    extractor.setIncludeSheetNames(true);
		    //是否抽取cell的注释内容
		    extractor.setIncludeCellComments(true);
		    //获取相关的抽取文本信息
		    text = extractor.getText();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(in != null){
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
		return text;
	}
	/**
	 * 从ppt获取文本内容
	 * 
	 * @param pptFile
	 * @return ppt文件的文本内容
	 */
	public String getTextFromPPT(File pptFile){
		String pptText = null;
		FileInputStream fin = null;
		try {
			fin = new FileInputStream(pptFile);
			String fileName = pptFile.getName();
			String hz = fileName.substring(fileName.lastIndexOf("."),fileName.length());
			if(".ppt".equals(hz)){
				QuickButCruddyTextExtractor qct = new QuickButCruddyTextExtractor(fin);
				pptText = qct.getTextAsString();
			}else{
				OPCPackage opcPackage = POIXMLDocument.openPackage(pptFile.getAbsolutePath());
				XSLFPowerPointExtractor pptExtractor = new XSLFPowerPointExtractor(opcPackage);
				pptText = pptExtractor.getText();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (XmlException e) {
			e.printStackTrace();
		} catch (OpenXML4JException e) {
			e.printStackTrace();
		}finally{
			if(null != fin){
				try {
					fin.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return pptText;
	}
	/**
	 * 从pdf文件获取文本内容
	 * 
	 * @param pdfFile
	 * @return pdf文件的文本内容
	 */
	public String getTextFromPdf(File pdfFile){
		String result = null;
		FileInputStream is = null;
		PDDocument document = null;
		try{
			is = new FileInputStream(pdfFile);
			PDFParser parser = new PDFParser(is);
			parser.parse();
			document = parser.getPDDocument();
			PDFTextStripper stripper = new PDFTextStripper();
			result = stripper.getText(document);
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			if(is != null){
				try{
					is.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
			if(document != null){
				try{
					document.close();
				}catch(IOException ex){
					ex.printStackTrace();
				}
			}
		}
		return result;
	}
	/**
	 * 
	 * @param txtFile
	 * @return  返回txt的内容
	 */
	public String getTextFromTxt(File txtFile){
		FileReader fr;
		StringBuffer buff = new StringBuffer();
		try {
			fr = new FileReader(txtFile);
			BufferedReader br = new BufferedReader(fr);
			String temp = null;
			while((temp = br.readLine()) != null){
				buff.append(temp + "\r\n"); 
			}
			br.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return buff.toString();
	}

 对带有clob字段的实体save时,直接调用hibernate的save即可。ojdbc14.jar。

更新时的处理  如下:

public void updateKnowledge(Knowledge knowledge) {
		 try {
		    knowledge.setZsk_Description(Hibernate.createClob(" "));
		    knowledge.setZsk_Text(Hibernate.createClob(" "));
		    update(knowledge);
		    flush();
		    
		    getSession().refresh(knowledge, LockMode.UPGRADE);
		    
		    SerializableClob htmlSc=(SerializableClob)knowledge.getZsk_Description();
		    SerializableClob textSc=(SerializableClob)knowledge.getZsk_Text();
		    Clob htmlWrapclob=htmlSc.getWrappedClob();
		    Clob textWrapclob=textSc.getWrappedClob();
		    CLOB htmlClob2=(CLOB)htmlWrapclob;
		    CLOB textClob2=(CLOB)textWrapclob;
		    Writer htmlWriter=htmlClob2.getCharacterOutputStream();
		    htmlWriter.write(knowledge.getContentHtml());
		    htmlWriter.close();
		    
		    Writer textWriter=textClob2.getCharacterOutputStream();
		    textWriter.write(knowledge.getContentText());
		    textWriter.close();
		    
		    update(knowledge);
		  } catch (RuntimeException re) {
		    throw re;
		  } catch (SQLException e) {
		    e.printStackTrace();
		  } catch (IOException e) {
		    e.printStackTrace();
		  }
	}

 上面几步做完,基本可以完成上传以及存入数据库,以及对带有clob文件的更新。

需要的环境  windows,jacob-1.17-M2-x64 具体的jacob下载和配置 参照网络。poi-3.9

2
3
分享到:
评论

相关推荐

    燃料电池汽车Cruise整车仿真模型(燃料电池电电混动整车仿真模型) 1.基于Cruise与MATLAB Simulink联合仿真完成整个模型搭建,策略为多点恒功率(多点功率跟随)式控制策略,策略模

    燃料电池汽车Cruise整车仿真模型(燃料电池电电混动整车仿真模型)。 1.基于Cruise与MATLAB Simulink联合仿真完成整个模型搭建,策略为多点恒功率(多点功率跟随)式控制策略,策略模型具备燃料电池系统电堆控制,电机驱动,再生制动等功能,实现燃料电池车辆全部工作模式,基于项目开发,策略准确; 2.模型物超所值,Cruise模型与Simulink策略有不懂的随时交流; 注:请确定是否需要再买,这种技术类文件出一概不 ;附赠Cruise与Simulink联合仿真的方法心得体会(大概十几页)。

    并列关系-关系图表-鲜艳红色 -3.pptx

    图表分类ppt

    实际项目中三菱fx5u编写的中型程序,用了st fbd ld 混合编程,程序内容完整,控制十来个轴 ,结构清晰 ,用到了结构体,全局变量 ,适合进阶学习

    实际项目中三菱fx5u编写的中型程序,用了st fbd ld 混合编程,程序内容完整,控制十来个轴 ,结构清晰 ,用到了结构体,全局变量 ,适合进阶学习

    并列关系-关系图表-简约折纸-3.pptx

    图表分类ppt

    甘特图-商业图表-稳重色彩 3.pptx

    图表分类ppt

    西南科技大学仿射密码实验报告

    一、实验目的 1.理解仿射密码的基本原理及加密、解密过程。 2.掌握利用 C 语言实现仿射密码加密与解密的基本方法。 3.通过实例观察仿射密码的加密效果及安全性。 4.通过实现简单的古典密码算法,理解密码学的相关概念,如明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。

    彩色扇形层级关系图PPT模板-3.pptx

    彩色扇形层级关系图PPT模板-3

    创意铅笔四项并列PPT模板-1.pptx

    图表分类ppt

    大圆套小圆多项包含PPT图表.pptx

    大圆套小圆多项包含PPT图表

    Matlab 运动脉搏数据 基于小波降噪和VMD分解的滤波研究 不同滤波方法的信噪比对比

    Matlab 运动脉搏数据 基于小波降噪和VMD分解的滤波研究 不同滤波方法的信噪比对比

    极简创意PPT时间轴模板.pptx

    图表分类ppt

    CDN技术在网络内容分发的应用解析:工作原理、关键组件及优势

    内容概要:本文详细介绍了CDN (内容分发网络)的技术背景和具体实施方案,旨在帮助技术人员深入了解这一网络优化工具的工作机制。文章首先解释了CDN是如何通过在不同地理位置设立边缘节点来存储缓存内容的,接着重点描述了三个关键组成部分——边缘节点服务器、中心服务器以及负载均衡器的功能,并讨论了它们协同工作的流程。之后阐述了CDN的主要优势,包括提升网站响应时间和内容分发效率、减小源站服务器的压力和支持大规模并发访问等方面的表现。最后列举了几种典型应用场景,如加速静态网页加载速度、保障视频/音频串流质量,还有支持高效的大文件分发等。 适用人群:互联网开发者、运维人员及其他希望改进自己网站或平台性能的专业人士。 使用场景及目标:针对需要优化网站或移动应用程序加载速度的服务提供商来说,采用CDN可以帮助改善用户体验的同时也能节约带宽资源,进而达到降低运营开支的目的。 其他说明:文中不仅讲解了相关概念和技术细节,还提供了实用案例分析以便于读者更加直观的理解CDN的实际应用价值。此外,在选择是否部署CDN时应当考虑自身业务特点和需求,合理规划投入产出比。

    phpAjaxcookbook英文pdf文字版(phpAjax手册)最新版本

    This PDF, available in English, is designed for advanced PHP Ajax learners. It offers 60 simple yet highly effective recipes for the Ajaxification of Web 2.0 sites. Key topics include: - Learning to develop and deploy iPhone web and native applications. - Optimizing the performance of Ajax applications. - Constructing dynamic websites that achieve faster server responses through the asynchronous call feature of PHP Ajax. - Utilizing Ajax for rapid and efficient data access from the server, ther

    机器学习(预测模型):高等教育数学学习评估数据集

    一个专注于高等教育数学学习评估的宝贵资源,它汇集了9546条详尽的记录,为教育领域的数据分析和机器学习研究提供了丰富的素材。该数据集精心设计,能够支持多种机器学习任务,包括分类、回归和聚类等,有助于深入挖掘学生数学学习过程中的关键信息,为教育决策和教学改进提供有力依据。 数据集涵盖了学生回答数学问题的全方位信息。在学生层面,记录了学生ID和国籍,这有助于从不同地域文化背景分析学生的学习表现差异。问题细节方面,每个问题都有独特的ID标识,难度等级分为基础和高级,其中基础问题占比高达82%,高级问题占18%,这种分布反映了数学学习中不同难度层次的覆盖情况。数学主题丰富多样,线性代数主题占比最大,达60%,基础数学占9%,其他主题占31%,涵盖了数学教育的核心领域。子主题进一步细化,向量空间和线性变换是较为突出的两个子主题,分别占比29%和22%,体现了线性代数在数学学习中的重要地位。 数据的预期更新频率为每年,这保证了数据集能够持续反映数学教育领域的最新动态和学生学习情况的变化,使其始终保持时效性和实用性,为教育研究者和实践者提供持续的支持。

    基于java+springboot+vue+mysql的教学辅助平台设计与实现.docx

    基于java+springboot+vue+mysql的教学辅助平台设计与实现.docx

    西南科技大学密码学RSA实验

    内容概要:本文详细描述了RSA密码算法的实现,涵盖从基本原理的理解到密钥生成、数据加密解密的具体编程实践。在密钥生成环节,采用了随机大素数生成、素性检测(使用Miller-Rabin)、以及计算Euler's totient function和选定适当大小的公开指数e和私人指数d的过程;针对加密过程,引入了基于快速模幂算法的数据编码方式,而解密部分,则借助了中国剩余定理(孙子定理),提高了解密速度。同时对可能存在的误差进行了探讨。最后给出了关于如何改进代码性能的方法,并附带解答了一些相关理论问题。 适合人群:熟悉C语言编程,有兴趣深入研究密码学尤其是公共密钥基础设施的专业人士。 使用场景及目标:本报告适用于高校课程作业或是科研项目中的信息安全方向的研究,帮助学生掌握公钥加密机制背后的数学原理和技术细节,提升实际动手能力和解决实际问题的能力。 其他说明:报告还包括了一些附加的内容,比如如何用RSA构建简单的伪随机数生成器,还有讨论了什么情况下加密会产生固定点的现象。这些都是为了加深理解和巩固所学到的知识点提供的补充材料。

    实用的PPT数据表格模板-4.pptx

    实用的PPT数据表格模板-4

    springboot项目基于BS模式的冷链物流系统.zip

    springboot项目基于BS模式的冷链物流系统,含有完整的源码和报告文档

    基于微信小程序的岳阳市美术馆预约平台设计与实现.docx

    基于微信小程序的岳阳市美术馆预约平台设计与实现.docx

    Delphi 12 控件之BDE-Installer-for-RAD-Studio-10-Seattle.7z

    BDE_Installer_for_RAD_Studio_10_Seattle.7z

Global site tag (gtag.js) - Google Analytics