spire.office for java 9.1.4已发布。在该版本中,spire.pdf for java 提高了绘制水印的效率;spire.doc for java 增加了添加图像水印的新方法;spire.presentation for java 提升了从powerpoint 到 svg格式的转换速度。此外,一些已知问题也在该版本中得到修复。详情请阅读以下内容。
获取 spire.office for java 9.1.4请点击:https://www.e-iceblue.cn/downloads/spire-office-java.html
spire.pdf for java
新功能:
- 提高绘制水印的效率。
- 新增pdftextreplacer接口来实现替换文本的功能。
- 新增pdfimagehelper接口来实现删除图片、提取图片、替换图片和压缩图片的功能。 关键代码如下:
pdfdocument pdf = new pdfdocument();
pdf.loadfromfile("sample.pdf");
pdfpagebase page = pdf.getpages().get(0);
pdftextreplacer replacer = new pdftextreplacer(page);
pdftextreplaceoptions options= new pdftextreplaceoptions();
options.setreplacetype(enumset.of(replaceactiontype.wholeword));
replacer.replacetext("www.google.com", "1234567");
pdf.savetofile(outputfile);
pdfimagehelper imagehelper = new pdfimagehelper();
pdfimageinfo[] imageinfocollection= imagehelper.getimagesinfo(page);
delete image:
imagehelper.deleteimage(imageinfocollection[0]);
extract image:
int index = 0;
for (com.spire.pdf.utilities.pdfimageinfo img : imageinfocollection) {
bufferedimage image = img.getimage();
file output = new file(outputfile_img string.format("img_%d.png", index));
imageio.write(image, "png", output);
index ;
}
pdfimage image = pdfimage.fromfile("imgfiles/e-iceblue logo.png");
imagehelper.replaceimage(imageinfocollection[i], image);
compress image:
for (pdfpagebase page : (iterable)doc.getpages())
{
if (page != null)
{
if (imagehelper.getimagesinfo(page) != null)
{
for (com.spire.pdf.utilities.pdfimageinfo info : imagehelper.getimagesinfo(page))
{
info.trycompressimage();
}
}
}
}
问题修复:
- 修复了保存文档时程序抛出java.lang.stringindexoutofboundsexception异常的问题。
- 修复了多线程下批量对多个pdf文档执行取代文本的操作后进行保存但没有生成结果文档的问题。
spire.xls for java
问题修复:
- 修复了用wps工具进行打印预览被保存出的xlsx文档时页边距不正确的问题。
- 修复了获取没有填充色的单元格的填充色值为(0,0,0)的问题。
- 修复了转换html文档到xlsx文档时单元格的边框样式丢失的问题。
spire.doc for java
调整:
- 移除了对spire.pdf.jar的依赖。
- 将应用授权方法更改为com.spire.doc.license.licenseprovider.setlicensekey(key)。
- 将命名空间com.spire.ms.printing.*更改为com.spire.doc.printing.*。
新功能:
- 回收以下方法、类和接口。
- 声明废弃了tablecell类中的getwidth() 和 setwidth() 方法,并使用getcellwidth()和setcellwidth()方法替代。
- 变更以下命名空间。
- 变更继承关系:将shapegroup implements shapeobject 变更为 shapegroup implements shapebase。
- 支持在销毁document时,同时销毁自定义字体的相关数据。
- 变更以下枚举类。
- 变更以下方法。
- 新增添加图片水印的方法。
- shape公开了getfill()方法用于操作图形的填充:使用getfill().seton(false)替代setfillcolor(null)方法。
- 新增支持添加图表。
- 提供了页模型spire.doc.pages以获取页面的内容。
- 新增支持添加svg图形。
document构造中设置newengine不再起作用,内部默认采用新引擎
headertype枚举
groupedshapecollection类
shapeobjecttextcollection类
mailmergedata接口
enuminterface接口
public picturewatermark(inputstream inputestream,boolean washout)
public picturewatermark(string filename,boolean washout)
field类中downloadimage方法
idocoleobject接口
pointsconverter类
com.spire.license.licenseprovider -> com.spire.doc.license.licenseprovider
// 设置自定义字体
document.setcustomfontsfolders(string filepath);
// 处理自定义字体
document.clearcustomfontsfolders();
// 清除缓存中占用内存的系统字体缓存
document.clearsystemfontcache();
example code:
document doc = new document();
doc.loadfromfile("inputfile.docx");
doc.setcustomfontsfolders(@"d:\fonts");
doc.savetofile("output.pdf", fileformat.pdf);
doc.close();
doc.dispose();
com.spire.doc.fileformat.wps -> com.spire.doc.fileformat.wps
com.spire.doc.fileformat.wpt -> com.spire.doc.fileformat.wpt
comparisonlevel -> textdiffmode
comparisonlevel getlevel() -> gettextcomparelevel()
setlevel(comparisonlevel value) -> settextcomparelevel(textdiffmode)
ispasswordprotect() -> isencrypted()
getfillefects() -> getfilleffects()
file imagefile = new file("data/e-iceblue.png");
bufferedimage bufferedimage = imageio.read(imagefile);
// 通过输入 bufferedimage 创建 picturewatermark 类的新实例,并设置水印图像的缩放因子
picturewatermark picture = new picturewatermark(bufferedimage,false);
// 或者使用另一种创建 picturewatermark 的方法
// picturewatermark picture = new picturewatermark();
// picture.setpicture(bufferedimage);
// picture.iswashout(false);
// 设置水印图片的缩放比例
picture.setscaling(250);
// 设置要应用于文档的水印
document.setwatermark(picture);
// 创建一个新的 document 实例
document document = new document();
// 向文档添加一个节
section section = document.addsection();
// 将段落添加到该节并向其附加文本
section.addparagraph().appendtext("line chart.");
// 添加一个新段落到该节
paragraph newpara = section.addparagraph();
// 将折线图形状附加到指定宽度和高度的段落
shapeobject shape = newpara.appendchart(charttype.line, 500, 300);
// 从形状中获取图表对象
chart chart = shape.getchart();
// 获取图表的标题
charttitle title = chart.gettitle();
// 设置图表标题的文本
title.settext("my chart");
// 清除图表中任何现有的系列
chartseriescollection seriescoll = chart.getseries();
seriescoll.clear();
// 定义类别(x 轴值)
string[] categories = { "c1", "c2", "c3", "c4", "c5", "c6" };
// 将两个具有指定类别和 y 轴值的系列添加到图表中
seriescoll.add("aw series 1", categories, new double[] { 1, 2, 2.5, 4, 5, 6 });
seriescoll.add("aw series 2", categories, new double[] { 2, 3, 3.5, 6, 6.5, 7 });
// 将文档保存为docx格式的文件
document.savetofile("appendlinechart.docx", fileformat.docx_2016);
// 释放文档资源
document.dispose();
// 创建一个新的 document 实例
document doc = new document();
// 从指定文件加载文档
doc.loadfromfile(inputfile);
// 使用加载的文档创建一个fixedlayoutdocument对象
fixedlayoutdocument layoutdoc = new fixedlayoutdocument(doc);
// 创建一个stringbuilder来存储提取的文本
stringbuilder stringbuilder = new stringbuilder();
// 获取第一页的第一行并将其附加到 stringbuilder
fixedlayoutline line = layoutdoc.getpages().get(0).getcolumns().get(0).getlines().get(0);
stringbuilder.append("line: " line.gettext() "\r\n");
// 检索与该行关联的原始段落并将其文本附加到 stringbuilder
paragraph para = line.getparagraph();
stringbuilder.append("paragraph text: " para.gettext() "\r\n");
// 检索第一页上的所有文本,包括页眉和页脚,并将其附加到 stringbuilder
string pagetext = layoutdoc.getpages().get(0).gettext();
stringbuilder.append(pagetext "\r\n");
// 遍历文档中的每一页并打印每页的行数
for (object obj : layoutdoc.getpages()) {
fixedlayoutpage page = (fixedlayoutpage) obj;
layoutcollection lines = page.getchildentities(layoutelementtype.line, true);
stringbuilder.append("page " page.getpageindex() " has " lines.getcount() " lines." "\r\n");
}
// 对第一段的布局实体执行反向查找并将它们附加到 stringbuilder
stringbuilder.append("\r\n");
stringbuilder.append("the lines of the first paragraph:" "\r\n");
for (object object : layoutdoc.getlayoutentitiesofnode(((section) doc.getfirstchild()).getbody().getparagraphs().get(0))) {
fixedlayoutline paragraphline = (fixedlayoutline) object;
stringbuilder.append(paragraphline.gettext().trim() "\r\n");
stringbuilder.append(paragraphline.getrectangle().tostring() "\r\n");
stringbuilder.append("");
}
// 将提取的文本写入文件
filewriter filewriter = new filewriter(new file(outputfile));
filewriter.write(stringbuilder.tostring());
filewriter.flush();
filewriter.close();
// 释放文档资源
doc.close();
doc.dispose();
// 创建一个新的文档对象
document document = new document();
// 在文档中添加一个新的节
section section = document.addsection();
// 添加一个新的段落到该节
paragraph paragraph = section.addparagraph();
// 将图片 (svg) 附加到段落中
paragraph.appendpicture(inputsvg);
// 将文档保存到指定的输出文件
document.savetofile(outputfile, fileformat.docx_2013);
// 关闭文档
document.dispose();
问题修复:
- 修复了在将doc文档转换为docx文档时,程序抛出“error loading file: unsupported file format”异常的问题。
- 修复了将word文档转换为pdf文档时形状位置偏移的问题。
- 修复了将word文档转换为pdf文档时,程序抛出"java.lang.outofmemoryerror"异常的问题。
- 修复了将word文档转换为pdf文档时图片多出边框的问题。
- 修复了将word文档转换为pdf文档时表格宽度不正确的问题。
- 修复了将word文档转换为pdf文档时分页不正确的问题。
- 修复了将doc文档转换为xml文档时内容丢失的问题。
- 修复了保存文档数据到内存流时程序挂起的问题。
- 修复了将word文档转换为pdf文档时文字乱码的问题。
- 修复了将word文档转换为pdf文档时,程序抛出"this is not a structured storage file."异常的问题。
- 修复了将word文档转换为pdf文档时表格样式不正确的问题。
- 修复了将word文档转换为pdf文档时,程序抛出"java.lang.assertionerror"异常的问题。
- 修复了将word文档转换为pdf文档时内容丢失的问题。
- 修复了新增行和合并行后表格格式不正确的问题。
- 修复了将word文档转换为pdf文档时,程序抛出"java.lang.nullpointerexception"异常的问题。
- 修复了将word文档转换为pdf文档时,程序抛出"java.lang.classcastexception"异常的问题。
- 修复了合并word文档后导致公式无法编辑的问题。
- 修复了将word文档转换为pdf文档时图表数据格式不正确的问题。
- 修复了加载word文档时,程序抛出"java.lang.nullpointerexception"异常的问题。
- 修复了设置文档密码保护后部分内容多出黑色背景的问题。
- 修复了拆分单元格后表格错乱的问题。
spire.ocr for java
问题修复:
- 修复了在jdk17和jdk21下运行时程序抛出 “java.lang.noclassdeffounderror” 异常的问题。
spire.presentation for java
新功能:
- 提高转换ppt到svg的速度。
- 新增加载带密码的流文件的方法。
- 支持通过坐标创建不规则的多边形的功能。
- 支持通过两个点来绘制线条的功能。
presentation.loadfromstream(inputstream, fileformat.auto,"password");
presentation ppt = new presentation();
islide slide = ppt.getslides().get(0);
list points = new arraylist<>();
points.add(new point2d.float(50f, 50f));
points.add(new point2d.float(50f, 150f));
points.add(new point2d.float(60f, 200f));
points.add(new point2d.float(200f, 200f));
points.add(new point2d.float(220f, 150f));
points.add(new point2d.float(150f, 90f));
points.add(new point2d.float(50f, 50f));
iautoshape autoshape = slide.getshapes().appendfreeformshape(points);
autoshape.getfill().setfilltype(fillformattype.none);
ppt.savetofile("out.pptx", fileformat.pptx_2013);
ppt.dispose();
presentation ppt = new presentation();
ppt.getslides().get(0).getshapes().appendshape(shapetype.line, new point2d.float(50, 70), new point2d.float(150, 120));
ppt.savetofile( "result.pptx ,fileformat.ppix_2013),
ppt.dispose().