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);
}
}
好了,分享到此结束,如果错误或者问题,烦请评论下方留言。