在doc中spire doc for java(5.2.0版本)可以识别占位符(orgName),但是在docx中缺无法识别,请帮忙看下。
另外在doc进行段落替换图片是,实际的表格宽高与picture.setWidth(200);不对应【注200是像素】
Document doc = new Document();
doc.loadFromFile("mytest.docx");
//获取第一个表格
Table table = doc.getSections().get(0).getTables().get(0);
//加载图片
DocPicture picture = new DocPicture(doc);
picture.loadImage(imagePath);
//设置图片高宽,单位为磅
picture.setWidth(110);
picture.setHeight(110);
//变量单元格
for (int r=0; r < table.getRows().getCount(); r++){
for (int c = 0; c < table.getRows().get(r).getCells().getCount();c++){
TableCell cell = table.getRows().get(r).getCells().get(c);
for (int p = 0; p < cell.getParagraphs().getCount();p++){
Paragraph paragraph = cell.getParagraphs().get(p);
for (int ch = 0; ch < paragraph.getChildObjects().getCount();ch++){
//找到StructureDocumentTagInline
if (paragraph.getChildObjects().get(ch) instanceof StructureDocumentTagInline) {
StructureDocumentTagInline sdt = (StructureDocumentTagInline) paragraph.getChildObjects().get(ch);
SdtType type = sdt.getSDTProperties().getSDTType();
//判断sdt的类型是否为Citation
if (type == SdtType.Citation){
//获取sdt的文本
String texts = sdt.getSDTContent().getText();
if (texts.equals(" (orgName)")){
TextRange range = new TextRange(doc);
System.out.println(texts + "is correctly identified");
}
//使用图片替换" (phTouXiang)"
if (texts.equals(" (phTouXiang)")){
int index = paragraph.getChildObjects().indexOf(sdt);
paragraph.getChildObjects().insert(index,picture);
paragraph.getChildObjects().remove(sdt);
}
}
}
}
}
}
}
doc.saveToFile("result.docx",FileFormat.Docx_2010);
Annika.Zhou wrote:您好,
感谢您的询价。
我调查了您的word文件,发现您提到的两处“占位符”实际是“内容控件”且类型为“Citation”。另外,我们的Spire.Doc获取的表格宽高的单位是磅,不是像素。所以设置替换图片宽高时需要进行单位转换,且我通过测试发现您提到的单元格宽度为110磅。请使用下面的代码来实现获取Word中的内容控件并使用图片替换内容控件。
- Code: Select all
Document doc = new Document();
doc.loadFromFile("mytest.docx");
//获取第一个表格
Table table = doc.getSections().get(0).getTables().get(0);
//加载图片
DocPicture picture = new DocPicture(doc);
picture.loadImage(imagePath);
//设置图片高宽,单位为磅
picture.setWidth(110);
picture.setHeight(110);
//变量单元格
for (int r=0; r < table.getRows().getCount(); r++){
for (int c = 0; c < table.getRows().get(r).getCells().getCount();c++){
TableCell cell = table.getRows().get(r).getCells().get(c);
for (int p = 0; p < cell.getParagraphs().getCount();p++){
Paragraph paragraph = cell.getParagraphs().get(p);
for (int ch = 0; ch < paragraph.getChildObjects().getCount();ch++){
//找到StructureDocumentTagInline
if (paragraph.getChildObjects().get(ch) instanceof StructureDocumentTagInline) {
StructureDocumentTagInline sdt = (StructureDocumentTagInline) paragraph.getChildObjects().get(ch);
SdtType type = sdt.getSDTProperties().getSDTType();
//判断sdt的类型是否为Citation
if (type == SdtType.Citation){
//获取sdt的文本
String texts = sdt.getSDTContent().getText();
if (texts.equals(" (orgName)")){
TextRange range = new TextRange(doc);
System.out.println(texts + "is correctly identified");
}
//使用图片替换" (phTouXiang)"
if (texts.equals(" (phTouXiang)")){
int index = paragraph.getChildObjects().indexOf(sdt);
paragraph.getChildObjects().insert(index,picture);
paragraph.getChildObjects().remove(sdt);
}
}
}
}
}
}
}
doc.saveToFile("result.docx",FileFormat.Docx_2010);
Sincerely,
Annika
E-iceblue support team
DocPicture picture = picParagraph.appendPicture("https://www.baidu.com/img/flexible/logo/pc/result.png");
Exception in thread "main" com.spire.doc.packages.sprlzt: Can't find file: https://www.baidu.com/img/flexible/logo/pc/result.png.
File name: 'https://www.baidu.com/img/flexible/logo/pc/result.png'
com.spire.doc.packages.spriau.<init>(FileStream.java:127)
com.spire.doc.packages.spriau.<init>(FileStream.java:144)
com.spire.doc.packages.spriau.<init>(FileStream.java:149)
com.spire.doc.packages.sprjhu.spr┨℃(File.java:238)
com.spire.doc.packages.sprjhu.spr┰╖(File.java:323)
com.spire.doc.documents.Paragraph.appendPicture(Unknown Source)
com.spire.doc.documents.Paragraph.appendPicture(Unknown Source)
Annika.Zhou wrote:您好,
感谢您的反馈。
1) 像素和磅的转换公式:像素长度 = (dpi / 72)* 磅数
2) 我们产品不支持加载互联网上的图片,您需要将互联网上的图片保存到本地或使用IO流读取图片数据然后再使用picParagraph.appendPicture()。另外picParagraph.appendPicture()的参数可以是本地图片途径(String)、InputStream或byte[]。
Sincerely,
Annika
E-iceblue support team
DocPicture picture = paragraph.appendPicture(PicUtils.getImageStreamFormUrl("https://www.baidu.com/img/flexible/logo/pc/result.png"));
picture.setWidth(cell.getWidth());
picture.setHeight(cell.getScaling());
Annika.Zhou wrote:您好,
感谢您的反馈。
1) 目前我们产品不支持图片自适应表格。我简单测试了您的代码,发现结果文档中图片显示很完美。请注意,您提供的word文件中的表格是正方形的,如果您插入的图片不是正方形,需要将图片按照某一比例进行缩放。请按照此方法再次尝试一下。
2) 我测试了一张保存在本地的.gif的图片,没有发现您提到的问题。请将“c5ed79735d5e36bb184e9e6519961880.gif”下载到本地测试一下。期待你的测试反馈。
Sincerely,
Annika
E-iceblue support team
public static void handlerFormTable(){
//加载Word测试文档
Document doc = new Document();
doc.loadFromFile("xht_apply.doc");
//获取第一节
Section section = doc.getSections().get(0);
ParagraphCollection pConll = section.getParagraphs();
for(int i = 0; i < pConll.getCount(); i++){
String text = pConll.get(i).getText();
System.err.println(text);
}
//获取第一个表格
ITable table = section.getTables().get(0);
//遍历表格中的行
for (int i = 0; i < table.getRows().getCount(); i++)
{
TableRow row = table.getRows().get(i);
//遍历每行中的单元格
for (int j = 0; j < row.getCells().getCount(); j++)
{
TableCell cell = row.getCells().get(j);
//遍历单元格中的段落
for (int k = 0; k < cell.getParagraphs().getCount(); k++)
{
Paragraph paragraph = cell.getParagraphs().get(k);
if("(vipMemberImage)".equals(paragraph.getText())){
paragraph.setText("");
DocPicture picture = paragraph.appendPicture("C:\\Users\\gb\\Desktop\\c5ed79735d5e36bb184e9e6519961880.gif");
// DocPicture picture = paragraph.appendPicture(PicUtils.getImageStreamFormUrl("https://www.baidu.com/img/flexible/logo/pc/result.png"));
picture.setWidth(cell.getWidth());
picture.setHeight(cell.getScaling());
System.err.println("添加图片成功!");
}
}
}
}
doc.saveToFile("picTest.docx", FileFormat.Docx_2013);
doc.dispose();
}
Annika.Zhou wrote:您好,
感谢您的反馈。
1)我测试了您使用的.GIF图片,确实复现了您提到的问题。我已将此问题以编号SPIREDOC-7590记录到了我们修复系统中。我们开发人员将进一步调查修复,一旦问题修复,我们会立即通知您。抱歉带来的不便。
2)我分别在安卓手机和iphone手机上使用微软office和WPS查看了您提供的结果文件,没有发现任何问题。请问您在手机上查看word文件使用的是什么软件?能否提供您在手机上查看的错误截图?
Sincerely,
Annika
E-iceblue support team
Annika.Zhou wrote:您好,
感谢您的反馈。
请注意我们的Spire.Doc遵循微软word的规则,目前仅兼容WPS。微软word和WPS打开结果文件均没有问题,但微信打开有问题,这是可能是您的微信使用的默认查看工具不符合微软word规则。这个问题不是由我们产品造成的,不能修复。希望您能理解。
Sincerely,
Annika
E-iceblue support team