为有中文需求的客户提供多渠道中文技术支持.

Tue Mar 22, 2022 3:12 am

在doc中spire doc for java(5.2.0版本)可以识别占位符(orgName),但是在docx中缺无法识别,请帮忙看下。
另外在doc进行段落替换图片是,实际的表格宽高与picture.setWidth(200);不对应【注200是像素】
111.png

sofia.123
 
Posts: 14
Joined: Tue Mar 15, 2022 3:12 am

Tue Mar 22, 2022 8:41 am

您好,

感谢您的询价。
我调查了您的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
User avatar

Annika.Zhou
 
Posts: 1657
Joined: Wed Apr 07, 2021 2:50 am

Wed Mar 23, 2022 7:55 am

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


收到,十分感谢。我这边还有两个问题向您咨询:
1. 像素与磅请问有转换公式吗?
2. 替换图片是,本地图片可以替换,如果是互联网上的图片无法替换。
代码如下:
DocPicture picture = picParagraph.appendPicture("https://www.baidu.com/img/flexible/logo/pc/result.png");

报错信息:
Code: Select all
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)

sofia.123
 
Posts: 14
Joined: Tue Mar 15, 2022 3:12 am

Wed Mar 23, 2022 10:01 am

您好,

感谢您的反馈。
1) 像素和磅的转换公式:像素长度 = (dpi / 72)* 磅数
2) 我们产品不支持加载互联网上的图片,您需要将互联网上的图片保存到本地或使用IO流读取图片数据然后再使用picParagraph.appendPicture()。另外picParagraph.appendPicture()的参数可以是本地图片途径(String)、InputStream或byte[]。

Sincerely,
Annika
E-iceblue support team
User avatar

Annika.Zhou
 
Posts: 1657
Joined: Wed Apr 07, 2021 2:50 am

Thu Mar 24, 2022 3:07 am

Annika.Zhou wrote:您好,

感谢您的反馈。
1) 像素和磅的转换公式:像素长度 = (dpi / 72)* 磅数
2) 我们产品不支持加载互联网上的图片,您需要将互联网上的图片保存到本地或使用IO流读取图片数据然后再使用picParagraph.appendPicture()。另外picParagraph.appendPicture()的参数可以是本地图片途径(String)、InputStream或byte[]。

Sincerely,
Annika
E-iceblue support team

非常感谢,互联网图片问题已经解决了。
请问图片是否自适应表格大小呢?如果设置图片固定大小,需要硬编码,不具有通用性。
一。本人尝试用表格中的单元格属性填充,但是效果不好,代码如下:
Code: Select all
DocPicture picture = paragraph.appendPicture(PicUtils.getImageStreamFormUrl("https://www.baidu.com/img/flexible/logo/pc/result.png"));
picture.setWidth(cell.getWidth());
picture.setHeight(cell.getScaling());

二。如果网络资源是动态图片,程序执行报错(见下图)
动态图地址(网上随便找的):https://wimg.588ku.com/gif620/20/03/05/c5ed79735d5e36bb184e9e6519961880.gif
111.png

sofia.123
 
Posts: 14
Joined: Tue Mar 15, 2022 3:12 am

Thu Mar 24, 2022 10:15 am

您好,

感谢您的反馈。
1) 目前我们产品不支持图片自适应表格。我简单测试了您的代码,发现结果文档中图片显示很完美。请注意,您提供的word文件中的表格是正方形的,如果您插入的图片不是正方形,需要将图片按照某一比例进行缩放。请按照此方法再次尝试一下。
2) 我测试了一张保存在本地的.gif的图片,没有发现您提到的问题。请将“c5ed79735d5e36bb184e9e6519961880.gif”下载到本地测试一下。期待你的测试反馈。

Sincerely,
Annika
E-iceblue support team
User avatar

Annika.Zhou
 
Posts: 1657
Joined: Wed Apr 07, 2021 2:50 am

Mon Mar 28, 2022 12:31 pm

Annika.Zhou wrote:您好,

感谢您的反馈。
1) 目前我们产品不支持图片自适应表格。我简单测试了您的代码,发现结果文档中图片显示很完美。请注意,您提供的word文件中的表格是正方形的,如果您插入的图片不是正方形,需要将图片按照某一比例进行缩放。请按照此方法再次尝试一下。
2) 我测试了一张保存在本地的.gif的图片,没有发现您提到的问题。请将“c5ed79735d5e36bb184e9e6519961880.gif”下载到本地测试一下。期待你的测试反馈。

Sincerely,
Annika
E-iceblue support team

本人测试了还是无法加载动态图片(场景是模板中替换图片),代码如下:
Code: Select all
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();
   }

另外发现生成的docx在电脑打开正常,在手机上(无论是安卓还是iphone)显示都有问题。
请帮忙看下,多谢!!!!!!
其中代码xht_apply.doc与picTest.docx见附件
file.zip

sofia.123
 
Posts: 14
Joined: Tue Mar 15, 2022 3:12 am

Tue Mar 29, 2022 2:19 am

您好,

感谢您的反馈。
1)我测试了您使用的.GIF图片,确实复现了您提到的问题。我已将此问题以编号SPIREDOC-7590记录到了我们修复系统中。我们开发人员将进一步调查修复,一旦问题修复,我们会立即通知您。抱歉带来的不便。
2)我分别在安卓手机和iphone手机上使用微软office和WPS查看了您提供的结果文件,没有发现任何问题。请问您在手机上查看word文件使用的是什么软件?能否提供您在手机上查看的错误截图?

Sincerely,
Annika
E-iceblue support team
User avatar

Annika.Zhou
 
Posts: 1657
Joined: Wed Apr 07, 2021 2:50 am

Tue Mar 29, 2022 7:05 am

Annika.Zhou wrote:您好,

感谢您的反馈。
1)我测试了您使用的.GIF图片,确实复现了您提到的问题。我已将此问题以编号SPIREDOC-7590记录到了我们修复系统中。我们开发人员将进一步调查修复,一旦问题修复,我们会立即通知您。抱歉带来的不便。
2)我分别在安卓手机和iphone手机上使用微软office和WPS查看了您提供的结果文件,没有发现任何问题。请问您在手机上查看word文件使用的是什么软件?能否提供您在手机上查看的错误截图?

Sincerely,
Annika
E-iceblue support team

找到问题了,无论是在安卓还是苹果手机用微信打开picTest.docx就有问题,请帮忙看下(用wps软件直接打开确实是没有问题)。
微信问题截图:
111.jpg

sofia.123
 
Posts: 14
Joined: Tue Mar 15, 2022 3:12 am

Tue Mar 29, 2022 8:31 am

您好,

感谢您的反馈。
请注意我们的Spire.Doc遵循微软word的规则,目前仅兼容WPS。微软word和WPS打开结果文件均没有问题,但微信打开有问题,这是可能是您的微信使用的默认查看工具不符合微软word规则。这个问题不是由我们产品造成的,不能修复。希望您能理解。

Sincerely,
Annika
E-iceblue support team
User avatar

Annika.Zhou
 
Posts: 1657
Joined: Wed Apr 07, 2021 2:50 am

Tue Mar 29, 2022 8:41 am

Annika.Zhou wrote:您好,

感谢您的反馈。
请注意我们的Spire.Doc遵循微软word的规则,目前仅兼容WPS。微软word和WPS打开结果文件均没有问题,但微信打开有问题,这是可能是您的微信使用的默认查看工具不符合微软word规则。这个问题不是由我们产品造成的,不能修复。希望您能理解。

Sincerely,
Annika
E-iceblue support team

好的,我咨询下微信客服,多谢!

sofia.123
 
Posts: 14
Joined: Tue Mar 15, 2022 3:12 am

Tue Mar 29, 2022 8:49 am

您好,

不客气!
以后您在使用我们产品时,如果遇到任何其他问题,请随时联系我们。

Sincerely,
Annika
E-iceblue support team
User avatar

Annika.Zhou
 
Posts: 1657
Joined: Wed Apr 07, 2021 2:50 am

Fri Jul 01, 2022 8:08 am

您好,

感谢您的耐心等待。
关于问题SPIREDOC-7590,经过仔细调查,我们发现您提供的gif图片其真正格式是rif。对于rif格式的图片,Java识别不了的。因此我们建议你换成真正的gif格式的图片来测试。

Sincerely,
Annika
E-iceblue support team
User avatar

Annika.Zhou
 
Posts: 1657
Joined: Wed Apr 07, 2021 2:50 am

Return to 中文技术支持