首页 新闻 会员 周边

asp.net读写word问题!

0
悬赏园豆:50 [已解决问题] 解决于 2014-07-23 14:24

我在读取word中的图片时,发现读取到的图片与实际的图片大小不一样,相对偏大,但是好像没有规律。求高手赐教,以增长知识!

张小瑜的主页 张小瑜 | 初学一级 | 园豆:102
提问于:2014-07-16 14:42
< >
分享
最佳答案
0

你是不是这样测试的:

1、选取一张 400 X 600 的图片插入到 Word 文档;

2、设置插入的图片的格式,缩小 10%;

3、用 Asp.Net 读取 Work 中刚插入的图片;

4、获取读取出的图片的大小属性:360 X 540;

收获园豆:50
Launcher | 高人七级 |园豆:45045 | 2014-07-16 15:11

word是人家下了给我的,具体是怎么设的不清楚,但我自己画了张400*600大小的图片,读出来变到2200多*2000多像素。每张图片都变大的,但是放大的没规律

张小瑜 | 园豆:102 (初学一级) | 2014-07-16 16:42

@张小瑜: 你有用 Windows 照片查看器看下你读出来的 2200 * 2000 的图片是什么样子吗?

Launcher | 园豆:45045 (高人七级) | 2014-07-16 16:46

@Launcher:看了,正常是正常的,等比放大了

张小瑜 | 园豆:102 (初学一级) | 2014-07-16 16:49

@张小瑜: 把读取的代码贴出来。

Launcher | 园豆:45045 (高人七级) | 2014-07-16 16:55

@Launcher: foreach (Paragraph item in doc.Paragraphs)
                {
                    if (item != null)
                    {
                        if (item.Range.Text.Trim() != "")
                        {
                            //判断该范围内是否存在图片
                            if (item.Range.InlineShapes.Count != 0)
                            {
                                foreach (InlineShape shape in item.Range.InlineShapes)
                                {
                                    //判断类型
                                    if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
                                    {
                                        byte[] img = (byte[])shape.Range.EnhMetaFileBits;
                                        Bitmap bmp = new Bitmap(new MemoryStream(img));
                                        fileName = DateTime.Now.ToString("yyyyMMdd") + "_" + Guid.NewGuid() + ".png";
                                        bmp.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png);
                                        if (i++ == 0)
                                        {
                                            pic = getPicInfo(sid, fileName, 1);
                                            pic.Height = bmp.Height;
                                            pic.Width = bmp.Width;
                                            wordList.Add(pic);

张小瑜 | 园豆:102 (初学一级) | 2014-07-16 16:58

@张小瑜: 你插入图片后,是不是把图片放大了啊?

Launcher | 园豆:45045 (高人七级) | 2014-07-16 17:21

@Launcher:没有啊,他自己变大的啊

张小瑜 | 园豆:102 (初学一级) | 2014-07-17 08:02

@张小瑜: 用这个 shape.Range.CopyAsPicture() ,然后从剪贴板中粘贴。EnhMetaFileBits 是增强的图元格式。

Launcher | 园豆:45045 (高人七级) | 2014-07-17 09:37

@Launcher: 能代码全一点吗?谢谢!

张小瑜 | 园豆:102 (初学一级) | 2014-07-19 09:43

@张小瑜: shape.Range.CopyAsPicture();

 Image image = Clipboard.GetImage();

 image.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png);

Launcher | 园豆:45045 (高人七级) | 2014-07-21 09:08

@Launcher: 不好意思,有点愚笨,那上面那个 shape.Range.CopyAsPicture();从哪里得出来?

张小瑜 | 园豆:102 (初学一级) | 2014-07-22 08:14

@张小瑜: 

//判断类型
                                    if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
                                    {

shape.Range.CopyAsPicture();

Launcher | 园豆:45045 (高人七级) | 2014-07-22 08:44

@Launcher: 这方法还是有问题, Image image = Clipboard.GetImage();取的时候是空值。

张小瑜 | 园豆:102 (初学一级) | 2014-07-23 11:36

@张小瑜: 

shape.Select(); 或者 shape.Range.Select(); /// 哪个能编译过就用哪个

shape.Range.CopyAsPicture();

 Image image = Clipboard.GetImage();

 image.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png);

Launcher | 园豆:45045 (高人七级) | 2014-07-23 11:45

@Launcher: 写一起也是空值

张小瑜 | 园豆:102 (初学一级) | 2014-07-23 12:36

@张小瑜: 二个都能编译,都结果都是空

张小瑜 | 园豆:102 (初学一级) | 2014-07-23 12:39

@张小瑜: 把你的完整代码贴出来。

Launcher | 园豆:45045 (高人七级) | 2014-07-23 13:07
 if (item.Range.InlineShapes.Count != 0)
                            {
                                foreach (InlineShape shape in item.Range.InlineShapes)
                                {
                                    //判断类型
                                    if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
                                    {
                                        //byte[] img = (byte[])shape.Range.EnhMetaFileBits;
                                        //Bitmap bmp = new Bitmap(new MemoryStream(img));
                                        shape.Range.Select();
                                        shape.Range.CopyAsPicture();
                                        Image bmp = Clipboard.GetImage();
                                        fileName = DateTime.Now.ToString("yyyyMMdd") + "_" + Guid.NewGuid() + ".png";
                                        bmp.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png);
                                        if (i++ == 0)
                                        {
                                            pic = getPicInfo(sid, fileName, 1);
                                            pic.Height = bmp.Height;
                                            pic.Width = bmp.Width;
                                            wordList.Add(pic);

                                            pic = getPicInfo(sid, fileName, 2);
                                            pic.Height = bmp.Height;
                                            pic.Width = bmp.Width;
                                            pic.PicFirst = "";
                                            pic.PicSec = "图片";
                                            wordList.Add(pic);
                                        }
                                        else
                                        {
                                            pic = getPicInfo(sid, fileName, 2);
                                            pic.Height = bmp.Height;
                                            pic.Width = bmp.Width;
                                            pic.PicFirst = "";
                                            pic.PicSec = "图片";
                                            wordList.Add(pic);
                                        }
                                    }
                                }

 

@张小瑜: 

张小瑜 | 园豆:102 (初学一级) | 2014-07-23 13:19

@张小瑜: 你这代码没啥问题,你把这段代码放到 Winform 或 Console 程序中去看下效果。问题出在 Asp.Net 无法使用 Clipboard。

Launcher | 园豆:45045 (高人七级) | 2014-07-23 13:44

@Launcher: 好!

张小瑜 | 园豆:102 (初学一级) | 2014-07-23 13:47

@张小瑜: 那我这个是不是没办法改了?

张小瑜 | 园豆:102 (初学一级) | 2014-07-23 14:03

@张小瑜: Clipboard 要求线程单元模型为 STA,我还是给你贴代码吧!

Thread staThread = new Thread(new ThreadStart(myMethod));

staThread.SetApartmentState(ApartmentState.STA);

staThread.Start();

 

public static void myMethod()

{

    // 从 Word 文档中读取图片的代码
}

Launcher | 园豆:45045 (高人七级) | 2014-07-23 14:36

@Launcher:还记得上次读word取图片的问题吗?现在全解决了,不过到最后发布程序时,导入那个word时一直报内存不足,这个问题有遇到过吗?

张小瑜 | 园豆:102 (初学一级) | 2014-08-05 13:34

@张小瑜: 是不是真的内存不够了?看一下进程列表是不是有多个 word.exe 存在?

Launcher | 园豆:45045 (高人七级) | 2014-08-05 13:49

@Launcher: 应该不是内存不够。进程里就一个winword.exe.然后我在开发工具里编号执行是完成没有问题的。不知道是代码里还是配置有问题

张小瑜 | 园豆:102 (初学一级) | 2014-08-05 14:16

@张小瑜: 只保留打开关闭文档的功能测试下。

Launcher | 园豆:45045 (高人七级) | 2014-08-05 15:45
其他回答(1)
0

请教一下为什么取到了图片,但是图片生成后就是一个红叉了

zhao69222 | 园豆:204 (菜鸟二级) | 2014-11-10 11:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册