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