c# 百思不得其解:word一页得到的图片与原始大小不一致,有源码有数据,请测试

问题描述

c# 百思不得其解:word一页得到的图片与原始大小不一致,有源码有数据,请测试

根据网上的一些大神的代码及帮助文档,做了一个word转图片的程序.简要测试一下,发现转换出来的图片跟原始文档的页内容不一致.请教一下各位,有没有什么思路之类的,十分感谢.

解决方案

Check

解决方案二:

代码如下:

``` class Program
{
static void Main(string[] args)
{
//运行13版本word,请改一下引用的两个dll到dll的15版本,图片是透明的,想要不透明,转换成jpg即可

        ConvertWord2Png("c:\2.docx", "d:\");
        Console.WriteLine("已完成");
        Console.ReadKey();
    }

    private static void ConvertWord2Png(string wordFile,string destinationFileDirectory)
    {
        Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
        Document doc = null;
        object unknow = Type.Missing;
        app.Visible = false;
        object file = wordFile;
        doc = app.Documents.Open(ref file,
            ref unknow, ref unknow, ref unknow, ref unknow,
            ref unknow, ref unknow, ref unknow, ref unknow,
            ref unknow, ref unknow, ref unknow, ref unknow,
            ref unknow, ref unknow, ref unknow);

        //获取总页数
        int pages = doc.ComputeStatistics(WdStatistic.wdStatisticPages, ref  unknow);
        object What = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage;
        object Which = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToNext;

        for (int i = 1; i < pages + 1; i++)
        {
            object page = i + ""; // 页数 

            Microsoft.Office.Interop.Word.Range ran1 = doc.GoTo(ref What, ref Which, ref page, ref unknow);

            Microsoft.Office.Interop.Word.Range ran2 = ran1.GoToPrevious(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage);

            object start = ran2.End;
            object end = ran1.Start;
            Range ran3 = doc.Range(ref start, ref end);
            if (i == pages)//最后一页处理
            {
                ran3 = doc.Range(ref end);
            }
            string x = ran3.Text;
            SaveRangeToPng(ran3, destinationFileDirectory+ i + ".png");
        }
        doc.Close();
    }
    /// <summary>
    /// 把word文档的一个范围存储成png图片
    /// </summary>
    /// <param name="range"></param>
    private static void SaveRangeToPng(Range range, string saveFilePath)
    {
        byte[] bt = (byte[])range.EnhMetaFileBits;
        FileStream fs = new FileStream(saveFilePath, FileMode.Create);
        fs.Write(bt, 0, bt.Count());
        fs.Close();
       //用range.copytoPicture方法内存中找不到,所以用直接储存方式。
    }
}

解决方案三:

代码如下:

``` class Program
{
static void Main(string[] args)
{
//运行13版本word,请改一下引用的两个dll到dll的15版本,图片是透明的,想要不透明,转换成jpg即可

        ConvertWord2Png("c:\2.docx", "d:\");
        Console.WriteLine("已完成");
        Console.ReadKey();
    }

    private static void ConvertWord2Png(string wordFile,string destinationFileDirectory)
    {
        Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
        Document doc = null;
        object unknow = Type.Missing;
        app.Visible = false;
        object file = wordFile;
        doc = app.Documents.Open(ref file,
            ref unknow, ref unknow, ref unknow, ref unknow,
            ref unknow, ref unknow, ref unknow, ref unknow,
            ref unknow, ref unknow, ref unknow, ref unknow,
            ref unknow, ref unknow, ref unknow);

        //获取总页数
        int pages = doc.ComputeStatistics(WdStatistic.wdStatisticPages, ref  unknow);
        object What = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage;
        object Which = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToNext;

        for (int i = 1; i < pages + 1; i++)
        {
            object page = i + ""; // 页数 

            Microsoft.Office.Interop.Word.Range ran1 = doc.GoTo(ref What, ref Which, ref page, ref unknow);

            Microsoft.Office.Interop.Word.Range ran2 = ran1.GoToPrevious(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage);

            object start = ran2.End;
            object end = ran1.Start;
            Range ran3 = doc.Range(ref start, ref end);
            if (i == pages)//最后一页处理
            {
                ran3 = doc.Range(ref end);
            }
            string x = ran3.Text;
            SaveRangeToPng(ran3, destinationFileDirectory+ i + ".png");
        }
        doc.Close();
    }
    /// <summary>
    /// 把word文档的一个范围存储成png图片
    /// </summary>
    /// <param name="range"></param>
    private static void SaveRangeToPng(Range range, string saveFilePath)
    {
        byte[] bt = (byte[])range.EnhMetaFileBits;
        FileStream fs = new FileStream(saveFilePath, FileMode.Create);
        fs.Write(bt, 0, bt.Count());
        fs.Close();
       //用range.copytoPicture方法内存中找不到,所以用直接储存方式。
    }
}

解决方案四:

测试数据是百度文库的一个word文档(),
http://wenku.baidu.com/view/4ac2f0c38bd63186bcebbc0b.html?from=search
环境是,office2007,vs2010.

解决方案五:

用Aspose.Word不就可以了么,非得自己用Office组件?

解决方案六:

我觉得用截屏来的更方便,而且也不会有这些问题

时间: 2024-11-02 16:08:39

c# 百思不得其解:word一页得到的图片与原始大小不一致,有源码有数据,请测试的相关文章

框架调用-这个页面跳转是怎么实现的?百思不得其解

问题描述 这个页面跳转是怎么实现的?百思不得其解 这个网址,net34.blog.china.com,打开后直接跳转到一个页面,看了半天代码也没搞明白怎么实现的,感觉调用了这个js document.writeln("""");document.writeln(""""); 请高手指教. 解决方案 打开后没有发现页面有跳转,也没从源码中找到这段JS.

Word页面页边距怎么设置

  Word页面页边距怎么设置          1.在"页面布局"选项卡中单击"页面设置"组中的"页边距"按钮,在展开的下拉列表中选择需要使用的页边距设置项,如图1所示. 图1 使用预设页边距 2.在"页边距"列表中单击"自定义边距"选项打开"页面设计"对话框的"页边距"选项卡,对参数进行设置能够更为自由地实现页边距的设置.如,当文档需要装订时,为了不遮盖文字,需要

word跨页表格如何自动加标题头

  在Word中,有时因为数据繁多,我们需要制作一些超长的表格,这就导致一个问题出现,当表格延伸到下一页之后,因为没有了标题头,往往导致数据与内容对应不上,看起来很费劲. 解决方法之一,是通过复制粘贴的方式,一页一页地为每一页的开始处添加表格标题头.这一方法不但费事,而且当数据项有变动时,标题头容易错位,修改起来也非常麻烦. 当然还有一个简便有效的方法,就是让Word自动添加标题头.首先选中表格的标题头,然后右击,从右键菜单中选择"表格属性". 在打开的表格属性对话框中,切换到&quo

如何删除Word空白页?

  怎么删除Word中的空白页 对于电脑小白来说,Word编辑过程中总是容易遇到问题,其中之一便是空白页.有的人就会问怎样删除Word空白页?事实上,Word删除空白页的方法并不难,这里就为大家简单介绍一下. 方法一:按Delete 在Word中遇到空白页时,第一应该尝试的就是Delete键,一般来说Delete键就能解决空白页的问题. 方法二:删除分页符 有时候空白页是相当顽固的,Delete键根本无法与之相抗衡,这时一般问题就出现在"分页符"上了.只要删除了分页符就可以了. 通常情

word删除页眉页脚顶端底端横线的方法介绍

  word删除页眉页脚顶端底端横线的方法介绍.页眉横线一般在插入页眉后出现,有时也会在删除页眉页脚.页码后出现.相信很多朋友都遇到过这样的问题,在word中,插入页眉.页脚后,页眉.页脚有边框线,影像了整个文档的美观,但是又不知道怎么设置,让其去掉.今天我就跟大家分享一下其中的设置办法. 方法/步骤 插入页眉.页脚后,会像图中这样显示有底端或者顶端横线 在页眉或者页脚的地方,鼠标左键双击,使其进入编辑状态. 在word开始菜单栏里,找到[边框]按钮,点开,选择[边框和底纹] 如图,选择 弹开[

WPS中Word的页眉页脚怎么删除

  WPS中Word的页眉页脚怎么删除 方法一:在页面布局(页面设置),版式中,将页眉页脚边界设为0;页边距中,将上下页边距设为0. 方法二:双击页眉页脚处,页眉页脚进入编辑状态,这时点键盘上的Delete键就行了. 方法三:选择"插入"选项卡中的"页眉和页脚",也可以进入其编辑状态,这时就可以使用编辑键修改和删除了. 方法四:选择"插入"选项卡中的"页眉和页脚"删除内容,点选最右边的关闭按钮,页眉页脚将不显示. WPS (W

C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁

问题描述 C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁 C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁 // 在主界面中显示提示信息void CIOCPModel::_ShowMessage(const int columnconst CString szFormat...){ // 根据传入的参数格式化字符串 CString strMessage; va_list arglist; // 处理变长参数 va_start(arglist

关于初始化多个Form的问题,百思不得其解

问题描述 大致问题是这样的现在有一个WindowsForm名字是VOBC,VOBC中有一个richtext的控件我使用这个VOBC初始化了两个窗口VOBCvb1=newVOBC();vb1.show();VOBCvb2=newVOBC();vb2.show();问题来了,VB1中的richtext.text控件被改写后,vb2中的richtext.text也会被改写,无论在vb2还是在vb1中操作自己的控件,两个界面上两个控件都在显现.请问怎么单独控制一个form中的控件? 解决方案 解决方案二

Aspose.Words怎么计算word文件页数

问题描述 怎么计算word文件页数,我这样算的Aspose.Words.Documentdoc=newAspose.Words.Document(filePath);intnum=doc.PageCount;但是算出来文件页数比真实的少几页,不知道为什么,纠结我好久了,求大神!!! 解决方案 解决方案二:好像有的word文档是这样子的.解决方案三:你是说是word本身的问题吗,可是用word组件Microsoft.Office.Interop.Word算得都对呢,用aspose.words算得总