Aspose Calling UpdateFields () в документе теряет данные поля слияния почты

Я пытаюсь экспортировать документ Word (ниже приведена ссылка на образец файла, который не работает должным образом) в PDF с помощью Aspose. 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 () при экспорте.


person Ananthan Unni    schedule 27.10.2018    source источник


Ответы (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 в качестве евангелиста разработчиков.

person Awais Hafeez    schedule 28.10.2018
comment
❤ Вперед. Это сработало :) Отличная работа, Аваиз. Большое Вам спасибо - person Ananthan Unni; 29.10.2018

Похоже, вам нужно специально просмотреть ваш документ.

Я написал следующий код, чтобы воспроизвести и решить вашу проблему. Вы можете настроить это под свои нужды. Вы можете просто получить тип поля, как в этом примере 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 или удалять свои потоки.

person Anton Komyshan    schedule 27.10.2018
comment
Спасибо за ответ. Но это как бы влечет за собой некоторые накладные расходы. - person Ananthan Unni; 29.10.2018
comment
@AnanthanUnni, да, решение Awais Hafeez более точное и простое. - person Anton Komyshan; 29.10.2018