`

文件在线预览doc,docx转换pdf(一)

阅读更多

文件在线预览doc,docx转换pdf(一)
1. 前言
文档转换是一个是一块硬骨头,但是也是必不可少的,我们正好做的知识库产品中,也面临着同样的问题,文档转换,精准的全文搜索,知识的转换率,是知识库产品的基本要素,初识阅读时同时绞尽脑汁,自己开发?,集成第三方?都是中小企业面临的一大难题…….
自己在网上搜索着找到poi开源出来的很多例子,最开始是用poi把所有文档转换为html,
1) 在github上面找到一个https://github.com/litter-fish/transform完整的demo,你想要的转换基本都提供,初学者可以参照实现转换出来的基本样子,达到通用级别,需要自己花很多功夫。此开源代码是基于poi和itext(pdf)的转换方式。
2) https://gitee.com/kekingcn/file-online-preview这是开源中国提供的一个源码,基于jodconverter,原理是调用windows,另存为的组件,实现转换。
3) 收费产品例如【永中office】【office365】【idocv】、【https://downloads.aspose.com/words/java】



2. 转换思路
自己在尝试过很多后,也与永中集成了文档转换,发现,要想完成预览的品质,必须的做二次渲染。毕竟永中做了十几年文档转换我们不能比的,自己琢磨后,发现一个勉强靠谱的思路,doc和docx都转换为pdf实现预览。都是在基于poi的基础上。
2.1. Doc转换pdf
1) Doc转换为xml

/**
	 * doc转xml
	 */
	public String toXML(String filePath){
		
	try{
		
		POIFSFileSystem nPOIFSFileSystem = new POIFSFileSystem(new File(filePath));

		HWPFDocument nHWPFDocument = new HWPFDocument(nPOIFSFileSystem);
		WordToFoConverter nWordToHtmlConverter = new WordToFoConverter(
				DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
		PicturesManager nPicturesManager = new PicturesManager() {
			
			public String savePicture(byte[] arg0, PictureType arg1,String arg2, float arg3, float arg4) {
				//file:///F://20.vscode//iWorkP//temp//images//0.jpg
				//System.out.println("file:///"+PathMaster.getWebRootPath()+ java.io.File.separator + "temp"+java.io.File.separator+"images" + java.io.File.separator + arg2);
//				return  "file:///"+PathMaster.getWebRootPath()+java.io.File.separator +"temp"+java.io.File.separator+"images" + java.io.File.separator + arg2;
				return  "file:///"+PathMaster.getWebRootPath()+java.io.File.separator +"temp"+java.io.File.separator+"images" + java.io.File.separator + arg2;
			}
		};

		nWordToHtmlConverter.setPicturesManager(nPicturesManager);
		nWordToHtmlConverter.processDocument(nHWPFDocument);
		String nTempPath = PathMaster.getWebRootPath()  + java.io.File.separator + "temp" + java.io.File.separator + "images" + java.io.File.separator;
		File nFile = new File(nTempPath);
		
		if (!nFile.exists()) {
			nFile.mkdirs();
		}
		for (Picture nPicture : nHWPFDocument.getPicturesTable().getAllPictures()) {
			nPicture.writeImageContent(new FileOutputStream(nTempPath + nPicture.suggestFullFileName()));
		}
		Document nHtmlDocument = nWordToHtmlConverter.getDocument();
		OutputStream nByteArrayOutputStream = new FileOutputStream(OUTFILEFO);
		DOMSource nDOMSource = new DOMSource(nHtmlDocument);
		StreamResult nStreamResult = new StreamResult(nByteArrayOutputStream);

		
		TransformerFactory nTransformerFactory = TransformerFactory.newInstance();
		Transformer nTransformer = nTransformerFactory.newTransformer();
		
		nTransformer.setOutputProperty(OutputKeys.ENCODING, "GBK");
		nTransformer.setOutputProperty(OutputKeys.INDENT, "YES");
		nTransformer.setOutputProperty(OutputKeys.METHOD, "xml");
		
		nTransformer.transform(nDOMSource, nStreamResult);

		nByteArrayOutputStream.close();

		return "";
		
		}catch(Exception e){
			e.printStackTrace();
		}
		return "";
	}


2) Xml转换为pdf
这里我是使用fop通过xml转换为pdf,也是最近欣喜的一个发现,poi官网推荐的我一直没去仔细看,里面的架包和永中的很多高清包,一模一样,现在貌似路子对了。有兴趣者研究去吧。我的源码已经在githubhttps://github.com/liuxufeijidian/file.convert.master/tree/master上面,环境已经配置好,需要准备好doc和docx文档即可。
/*
	 * xml 转pdf
	 */
	public void xmlToPDF() throws SAXException, TransformerException{
		// Step 1: Construct a FopFactory by specifying a reference to the configuration file
		// (reuse if you plan to render multiple documents!)
		FopFactory fopFactory = null;
		new URIResolverAdapter(new URIResolver(){
			public Source resolve(String href, String base) throws TransformerException {
				try {
		            URL url = new URL(href);
		            URLConnection connection = url.openConnection();
		            connection.setRequestProperty("User-Agent", "whatever");
		            return new StreamSource(connection.getInputStream());
		        } catch (IOException e) {
		            throw new RuntimeException(e);
		        }
			}
		});
		OutputStream out = null;
		try {
			
			fopFactory = FopFactory.newInstance(new File(CONFIG));
			
			// Step 2: Set up output stream.
			// Note: Using BufferedOutputStream for performance reasons (helpful with FileOutputStreams).
			
			out = new BufferedOutputStream(new FileOutputStream(OUTFILEPDF));
		    
			// Step 3: Construct fop with desired output format
		    Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);

		    // Step 4: Setup JAXP using identity transformer
		    TransformerFactory factory = TransformerFactory.newInstance();
		    Transformer transformer = factory.newTransformer(); // identity transformer
		    
		    // Step 5: Setup input and output for XSLT transformation
		    // Setup input stream
		    Source src = new StreamSource(OUTFILEFO);

		    // Resulting SAX events (the generated FO) must be piped through to FOP
		    Result res = new SAXResult(fop.getDefaultHandler());
		    // Step 6: Start XSLT transformation and FOP processing
		    transformer.transform(src, res);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
		    //Clean-up
		    try {
				out.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}}


2.1.3

很多时候我们是使用word直接转的html,但是需要自己写二次渲染的代码,较为复杂,我是使用迂回方法,doc转xml,再用xml转换pdf,转换出来的pdf用pdfjs渲染即可实现和浏览器打开一样的预览,pdfjs预览方法详情见https://blog.csdn.net/liuxufeijidian/article/details/82260199


ending:大家都想看效果如何,https://github.com/litter-fish/transform,github获取改源码,配置好doc和docx文档即可实现转换,接下来会继续努力不间断优化和更新文档转换。
1
0
分享到:
评论

相关推荐

    uniapp H5 pdf、docx文档预览

    在开发H5应用时,有时候我们需要提供对PDF和DOCX文档的预览功能,以便用户可以在浏览器中查看这些文件而无需下载。`uniapp`是一个跨端开发框架,支持开发H5、iOS、Android等平台的应用。在这个场景下,我们将讨论...

    Spring boot 在线预览办公文件(doc、docx、xls等)

    其中一个常见的需求是在线预览各种办公文件,如文档(doc、docx)、电子表格(xls、xlsx)以及PDFs,而无需用户下载文件到本地。本文将详细介绍如何使用Spring Boot实现这一功能。 首先,我们需要引入相关的依赖库...

    HTML+JS实现浏览器在线预览文件(支持pdf、excel、ppt、doc、jpg、png格式)

    在现代Web应用中,提供用户在线预览各类文件的能力是一个重要的功能,这使得用户无需下载文件就能查看其内容。本文将详细介绍如何使用HTML和JavaScript技术实现在浏览器中预览PDF、Excel、PPT、DOC、JPG以及PNG格式...

    利用java后端实现文件在线预览

    本文将详细讲解如何利用Java后端技术实现文件在线预览,特别是针对文档(如.doc、.docx、.xls、.xlsx、.ppt、.pptx)和图片格式的预览。 首先,我们需要理解文件预览的基本原理:用户通过浏览器发送请求到服务器,...

    Linux服务上实现在线预览PPT,PPTX,DOC,DOCX,XLS,XLSX文件安装插件详细步骤

    ### Linux服务上实现在线预览PPT/PPTX/DOC/DOCX/XLS/XLSX文件的安装插件详细步骤 #### 环境准备 本文档主要介绍如何在Linux服务器上实现各种常见文档(包括PPT、PPTX、DOC、DOCX、XLS、XLSX)的在线预览功能。此...

    Java实现在线预览,支持doc/docx/pptx/ppt/xls/xlsx格式转为pdf进行在线预览

    要实现这样的功能,一种常见的方法是将这些文件转换为通用的PDF格式进行预览。本篇文章将深入探讨如何使用Java实现这一目标,以及涉及到的关键技术与库。 首先,我们要用到的是一些第三方库,它们能够处理不同的...

    .pdf/.doc/.docx/.xls/.xlsx/.ppt/.pptx 文件网页预览 ASP.NET MVC 项目

    总的来说,"PDF/DOC/DOCX/XLS/XLSX/PPT/PPTX文件网页预览ASP.NET MVC项目"是一个综合性的Web开发案例,涵盖了文件处理、前端展示、安全防护等多个方面,是学习和实践ASP.NET MVC框架,尤其是文件预览功能实现的好...

    Asp.net MVC 利用(aspose+pdfobject.js) 实现在线预览word、excel、ppt、pdf文件

    Aspose是一系列强大的文件处理组件,支持多种文件格式,如Word(.docx)、Excel(.xlsx)、PowerPoint(.pptx)和PDF。在Asp.NET MVC项目中,我们可以使用Aspose库将这些文件转换为HTML或其他适合在浏览器中显示的...

    office文件(含doc,docx,xls,xlsx,ppt,pptx等)转PDF生成(C#程序)

    在IT行业中,转换Office文档为PDF格式是一种常见的需求,特别是在跨平台分享、打印预览或长期存储时。本文将深入探讨如何使用C#编程语言来实现这个功能,涉及的文件类型包括doc、docx、xls、xlsx、ppt和pptx。 首先...

    Word转PDF在实现在线预览功能.rar

    在IT行业中,将Word文档转换为PDF格式是常见的需求,特别是在需要在线预览或跨平台兼容性时。这个"Word转PDF在实现在线预览功能.rar"压缩包提供了一个使用Java来实现这一功能的解决方案。Java作为一种广泛使用的编程...

    Vue实现文件预览,支持word excel pdf ppt image txt mp4等格式

    首先,你需要引入一个合适的库来处理各种文件类型的预览。例如,`file-saver` 可用于保存文件,`xlsx` 用于Excel文件,`pdfjs-dist` 用于PDF,`officegen` 处理Office文档,`html2canvas` 和 `jspdf` 可用于HTML和...

    亲测,以html形式显示或预览word,excel,pdf,txt

    3. **PDF转HTML**:转换PDF到HTML通常需要第三方库,如`PDFSharp`或`iTextSharp`,但这些库并不直接支持转换,可能需要借助PDF阅读器引擎,如PDFium或PDF.js。另外,Adobe提供了PDF-to-HTML SDK,可以更高效地完成...

    pdf、doc、docx、pptx文件转图片依赖包.zip

    在IT行业中,将PDF、DOC、DOCX和PPTX文件转换为图片是一种常见的需求,尤其是在需要预览文档内容、防止格式更改或者在网络上传输时。这个名为"pdf、doc、docx、pptx文件转图片依赖包.zip"的压缩包提供了一套工具和...

    以html形式显示或预览word,excel,pdf,txt

    Word文件的转换通常涉及读取DOC或DOCX文件,解析其内容,包括文本、样式、图像等,并将其转换为HTML标记。这需要对Office文档的结构有深入理解,以便准确地复制原始格式。 5. **Excel转HTML**: Excel文件转换...

    aspose实现在线预览word,ppt,excel,pdf文件架包(1)

    它能读取、创建、编辑和转换PDF文件,并且支持在Web应用中预览PDF内容。通过将PDF页面渲染为图像,开发者可以在浏览器中展示PDF内容,用户无需安装额外的PDF阅读器。 5. **在线预览实现流程** - **文件上传**:...

    php实现在线预览pdf生成

    “FileConvert.class.php”可能是用于文件转换的类,比如将其他格式的文档(如.doc、.docx)转换为PDF,以便于在线预览。这个类可能包含了一些关键函数,如convert(),它接收一个源文件路径和目标文件路径作为参数,...

    web项目使用OpenOffice实现前端在线预览office、pdf等文档源码

    在现代的Web应用中,提供在线预览功能已经成为一种常见的需求,尤其是对于处理各种文档格式如Office(Word、Excel、PowerPoint)和PDF时。本文将深入探讨如何使用OpenOffice技术在Web项目中实现在前端在线预览这些...

    文件批量转换pdf小工具升级版

    不需要打开.doc, .docx, .xls, .xlsx, .ppt, .pptx 直接批量转换成pdf文件,完成绿色和免费,转换成pdf的页面格式和源文件打印预览格式相同,win 7/win 10 .net 4.0 以上版本运行。

    poi将word、PPT、Excel转pdf实现在线预览的jar包

    转换后的PDF文件可以方便地在各种设备和浏览器上进行在线预览,因为它是一种开放标准,具有良好的跨平台兼容性。 在实际应用中,你可能会遇到以下技术挑战: 1. 文档格式兼容性:确保转换过程中保留原始格式和样式...

Global site tag (gtag.js) - Google Analytics