Aspose Вызов UpdateFields () для документа теряет данные поля слияния - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь экспортировать документ 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 () при экспорте.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вы можете обойти эту проблему, используя следующий код:

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 в качестве разработчика Evangelist.

0 голосов
/ 28 октября 2018

Звучит так, будто вам нужно специально обойти ваш документ.

Я написал следующий код, чтобы воспроизвести и решить вашу проблему.Вы можете настроить это для своих нужд.Вы можете просто получить тип поля, как в этом примере Перечисление FieldType

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());
    }
  }
}

Надеюсь, это поможет.

PS: не забудьте использовать using или избавиться отпотоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...