Aspose在文档上调用UpdateFields()会丢失邮件合并字段数据

时间:2018-10-27 19:56:45

标签: c# aspose mailmerge aspose.words

我正在尝试使用Aspose将Word文档(以下给出的无法正常工作的示例文件链接)导出为PDF。 https://1drv.ms/w/s!AheHNqR6oXmSmd5H80L0vzCTfVVrTg

相同的代码如下。

var doc=new Document(<streamFromTheFile>); // Aspose.Words.Document
doc.UpdateFields();// This is required for any possible formula
var outStream=new MemoryStream();
doc.Save(outStream, SaveFormat.Pdf); // Aspose.Words.SaveFormat
File.WriteAllBytes(<exportPdfFilePath>, outStream.ToArray());

除在示例文档中具有合并字段的文件外,其他所有文件都可以正常工作,在示例文件中,即使当前值也会丢失,并被诸如«AtpIssueDate»之类的合并字段名称所替代。取消UpdateFields()方法调用可解决此问题,但无法完成,因为这破坏了逻辑。请帮助如何保留合并字段的值,而无需在导出时删除UpdateFields()调用。

2 个答案:

答案 0 :(得分:2)

您可以通过使用以下代码来解决此问题:

Document doc = new Document("D:\\temp\\so.docx");

// LOCK merge fields before Updatefields method call
foreach(Field field in doc.Range.Fields)
{
    if (field.Type == FieldType.FieldMergeField)
    {
        field.IsLocked = true;
    }
}

doc.UpdateFields();

// UN-LOCK merge fields after Updatefields method call
foreach (Field field in doc.Range.Fields)
{
    if (field.Type == FieldType.FieldMergeField)
    {
        field.IsLocked = false;
    }
}

doc.Save("D:\\temp\\18.10.pdf");

希望,这会有所帮助。我和Aspose一起担任开发人员推广人员。

答案 1 :(得分:1)

听起来像您需要特别遍历文档。

我写了下一个代码来重现并解决您的问题。您可以根据需要自定义它。您只需要像本示例FieldType Enumeration

中那样获取字段类型
using System.IO;
using System.Linq;
using Aspose.Words;
using Aspose.Words.Fields;

namespace ConsoleApplication1
{
  public class Program
  {
    public static void Main()
    {
      Stream file = new FileStream("SO.docx", FileMode.Open);
      var doc = new Document(file);

      var nodes = doc.GetChildNodes(NodeType.Any, true);

      foreach (var node in nodes)
      {
        if (node.NodeType != NodeType.Paragraph)
          continue;
        if (!(node is Paragraph paragraph))
          continue;

        if (paragraph.ChildNodes.Any(x => x.NodeType == NodeType.FieldStart))
        {
          var childNodes = paragraph.ChildNodes;
          var isParagraphContainsMergedField = childNodes.Any(x => (x as FieldChar)?.FieldType == FieldType.FieldMergeField);
          if (isParagraphContainsMergedField)
            continue;
        }

        node.Range.UpdateFields();
      }

      var outStream = new MemoryStream();
      doc.Save(outStream, SaveFormat.Pdf);
      File.WriteAllBytes("test.pdf", outStream.ToArray());
    }
  }
}

希望它会有所帮助。

P.S .:不要忘记使用using或处置流。