java中各种文件的相互转化

java中各种文件的相互转化

前几天一直在进行rtf文件流转化为HTML,折腾了好久,文件的格式转化都无法成功。后来找到了一个新的包(aspose),总算解了我的燃眉之急。现在记录分享一下。

1.使用aspose.words将doc,docx,txt,rtf等转化为HTML

Aspose.Words是一个商业.NET类库,可以使得应用程序处理大量的文件任务。Aspose.Words支持Doc,Docx,RTF,HTML,OpenDocument,PDF,XPS,EPUB和其他格式。使用Aspose.Words可以在不使用Microsoft.Word的情况下生成、修改、转换和打印文档。在项目中使用Aspose.Words可以有以下好处。
其丰富的功能特性主要有以下4个方面:
1)格式转换。Aspose.Words具有高质量的文件格式转换功能,可以和Doc,OOXL,RTF,TXT等格式互相转换。
2)文档对象模型。通过丰富的API以编程方式访问所有的文档元素和格式,允许创建,修改,提取,复制,分割,加入,和替换文件内容。
3)文件渲染。可以在服务器端转换整个文档或者页面为PDF,XPS,SWF格式,同样可以转换文档页面为图像格式,或者 .NET Graphics对象,这些功能和Microsoft.Word是一样的。
4)报表。可以从对象或者数据源填充模版生成文件。
Aspose.Words可以在没有安装Microsoft Office的机器上工作。所有的Aspose组件都是独立,不需要微软公司的授权。总之, Aspose.Words在安全性、稳定性、可扩展性、速度、价格和自动化功能方面,是一个很不错的选择。
Aspose包的基本介绍到此结束,详细的介绍请参考:http://www.cnblogs.com/asxinyu/p/3242754.html
我这里就不多做赘述了。java中具体使用如下:首先添加依赖,注明仓库地址:

<repositories>
		<repository>
			<id>AsposeJavaAPI</id>
			<name>Aspose Java API</name>
			<url>https://repository.aspose.com/repo/</url>
		</repository>
</repositories>
<dependency>
		<groupId>com.aspose</groupId>
	   	<artifactId>aspose-words</artifactId>
		<version>18.6</version>
		<classifier>jdk16</classifier>
</dependency>

下面在代码中就可以直接使用了,使用时,他会有水印,注明包的出处,如果不想要,可以直接替换掉水印的HTML代码。下面我只是使用doc转化为HTML。简单方便。

//			AnnouncementDO announcement = announcementDao.getFirst();
//			ByteArrayInputStream bais = new ByteArrayInputStream(announcement.getAnnouncement());
			File file=new File("C:/Users/Desktop/1111.doc");
			FileInputStream bais=new FileInputStream(file);
			Document doc = new Document(bais);
			result = doc.toString(SaveFormat.HTML);
			//替换掉水印
			result = result.replace("<p style=\"margin-top:0pt; margin-bottom:0pt; text-align:justify; widows:0; orphans:0; font-size:12pt\"><span style=\"font-family:Calibri; font-weight:bold; color:#ff0000\">Evaluation Only. Created with Aspose.Words. Copyright 2003-2018 Aspose Pty Ltd.</span></p>", "");
			return result;

2.直接读取RTF,PDF等文件的内容的方式。

这个是使用RTFEditorKit来直接读取RTF中的文件,其中注意中文乱码的情况。


	public InfoResult getAnnouncementDocument() {
		AnnouncementDO announcement = announcementDao.getFirst();
		ByteArrayInputStream bais = new ByteArrayInputStream(announcement.getAnnouncement());
			  DefaultStyledDocument styledDoc = new DefaultStyledDocument();   
			  String document=null;
		            try {
						new RTFEditorKit().read(bais, styledDoc, 0);	
						//直接读取rtf的内容,并且转化编码	
						document = new String(toGb2312(styledDoc.getText(0, styledDoc.getLength())));  
					} catch (IOException e) {
						log.error(e.getMessage(),e);
					} catch (BadLocationException e1) {
						log.error(e1.getMessage(),e1);
					}
		            return new InfoResult(ActionResultEnum.SUCCESS, document);
	}
	
	private  String toGb2312(String str) {
		if (str == null)
			return null;
		String retStr = str;
		byte b[];
		try {
			b = str.getBytes("ISO8859_1");
			for (int i = 0; i < b.length; i++) {
				byte b1 = b[i];
				if (b1 == 63)
					break; // 1
				else if (b1 > 0)
					continue;// 2
				else if (b1 < 0) { // 不可能为0,0为字符串结束符
					// 乱码
					retStr = new String(b, "gb2312");
					break;
				}
			}
		} catch (UnsupportedEncodingException e) {
			log.error(e.getMessage());
		}
		return retStr;
	}

3.直接生成PDF,然后转化为图片

这个也是在挣扎的过程中想到的方法。虽然并没有为最后的结果最初贡献,但是还是要记录一下,方便以后需要。
这个是利用了itext和pdfbox的包来实现的,首先创建一个PDF,存于本地,然后再将PDF的内容转化为图片。
关于itext。iText是用于生成PDF文档的一个开放源码的java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html等文件转化为PDF文件。详细信息可参考:https://www.cnblogs.com/chenpi/p/5534595.html
pdfbox也是一个用于pdf文档的开源的java项目工具,帮助新建的PDF处理文档和手动提取PDF文档中的内容等。pdfbox的API可参考:https://pdfbox.apache.org/
添加两个包的依赖。

		<dependency>
    		<groupId>com.lowagie</groupId>
    		<artifactId>itext</artifactId>
    		<version>4.2.1</version>
		</dependency>
		<dependency>
    		<groupId>org.apache.pdfbox</groupId>
    		<artifactId>pdfbox</artifactId>
    		<version>2.0.0-RC3</version>
		</dependency>

然后创建一个简单的PDF。并生成图片。PDF生成之后,再加载生成图片之前,一定要先关闭编写器和文档。不然会报错。本来我是想把close()都放在finally里面。但是发现显示文档最后一行出错。

public void getAnnouncementIMG() {
		String fileName = "D:/demo.pdf";
		String imgName="D:/demo.png";
		Document document = new Document();
		PdfWriter writer = null;
		try {
			// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。
			writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
			// 添加文档元数据信息
			document.open();
			document.add(new Paragraph("A Hello World PDF document."));
			document.close();
			writer.close();
			PDDocument doc = PDDocument.load(new File(fileName));
			PDFRenderer renderer = new PDFRenderer(doc);
			int pageCount = doc.getNumberOfPages();
			for (int i = 0; i < pageCount; i++) {
				BufferedImage image = renderer.renderImageWithDPI(i, 296);
				ImageIO.write(image, "PNG", new File(imgName));
			}
		} catch (DocumentException | IOException e) {
			log.info(e.getMessage(), e);
		}
	}

好了,分享到此结束,如果错误或者问题,烦请评论下方留言。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页