【问题标题】:How to copy specific pages of Word document如何复制Word文档的特定页面
【发布时间】:2018-10-14 22:11:00
【问题描述】:

我有一个包含多个页面的 Word 文档,我想使用 OpenXml SDK 将一些页面复制到新的 Word 文档中。我做了一些网络搜索,得到了下面的代码,它读取整个文档并复制到新文档中

 string documentURL = filelocation;
 byte[] docAsArray = File.ReadAllBytes(documentURL);

 using (MemoryStream stream = new MemoryStream())
  {
    stream.Write(docAsArray, 0, docAsArray.Length);    // THIS performs doc copy
    using (DocumentFormat.OpenXml.Packaging.WordprocessingDocument doc = DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open(stream, true))
    {
                // perform content control substitution here, making sure to call .Save()
                // on any documents Part's changed.
    }

 File.WriteAllBytes(outputSplitDocpath, stream.ToArray());
 }

现在,在上面的代码中,我怎样才能只读取特定页面并复制到新页面?请帮忙提出建议。谢谢

【问题讨论】:

    标签: c# ms-word openxml openxml-sdk


    【解决方案1】:

    除非使用手动分页符来生成文档中的每一页,否则您想要做的事情是不可能的。

    Word 会在运行时在 Word 应用程序中打开文档时生成自动分页符。分页符的实际位置是完全动态的,基于正在进行的编辑,并且在编辑期间“一直”重新计算。

    当文档关闭时,此信息可靠地保存在文档中。造成这种情况的一个原因是,当在不同的机器上打开文档或选择不同的打印机(驱动程序)时,文档的布局可能会有所不同。

    因此,除非有某种方式可以识别每个页面,例如手动分页符,否则无法使用 Office Open XML 文件格式处理单个页面。

    【讨论】:

      【解决方案2】:

      使用Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application(); 而不是 OpenXML

      //dummy value to satisfy params
      object oMissing = System.Reflection.Missing.Value;
      
      //copy specific page/s
      object what = WdGoToItem.wdGoToPage;
      object which = WdGoToDirection.wdGoToFirst;
      object count1 = 1;
      Range startRange = word.Selection.GoTo(ref what, ref which, ref count1, ref oMissing);
      object count2 = (int)count + 1;
      Range endRange = word.Selection.GoTo(ref what, ref which, ref count2, ref oMissing);
      endRange.SetRange(startRange.Start, endRange.End - 1);
      endRange.Select();
      word.Selection.Copy();
      //save...
      

      【讨论】:

      • 有什么可以投反对票的 cmet 吗?
      • 可能是因为 OP 在询问 OpenXML。显然,您可以使用互操作来完成此操作,但这很可能需要不同的架构。 OpenXML 可以部署到没有安装 Office 的服务器上,而 Interop 则不行。
      猜你喜欢
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多