MailMerge TaleStart-TableEnd: добавить ввод в конце страницы с многострочными строками

У нас есть документ MailMerge со следующей таблицей:

_____________________________________________________________________________
Date         Id        Description                                Amount
_____________________________________________________________________________
{{TableStart {{Id}}    {{Description}}                            € {{Amount 
:Lines}}{{Da                                                      \# 0,00}}{{
te \@"dd-MM-                                                      TableEnd:Li
yyyy"}}                                                           nes}}
_____________________________________________________________________________
                                                        Total    € {{Total \#
                                                                 0,00}}
_____________________________________________________________________________

Вот пример строки результата:

____________________________________________________________________________
Date         Id        Description                                Amount
____________________________________________________________________________
03-09-2015   0001      Company Name                               € 25,00
                       Buyer Name 1, Buyer Name 2
                       Product description
                       Extra description line

Как видите, описание состоит из нескольких строк. Когда достигнут конец страницы, он просто продолжается на следующей странице. Таким образом, в приведенном выше примере строка может быть такой в ​​конце страницы 1:

03-09-2015   0001      Company Name                               € 25,00
                       Buyer Name 1, Buyer Name 2

И вот так в начале страницы 2:

                       Product description
                       Extra description line

Вместо этого я хотел бы следующее: когда элемент больше не помещается на странице, весь элемент должен перейти в начало следующей страницы. В основном я хочу предотвратить разделение элементов между страницами. Есть ли способ сделать это с помощью MailMerge?

Кроме того, мы используем C# в нашем проекте. Вот код, который мы используем для MailMerge. Я думаю, что было бы слишком амбициозно спрашивать, есть ли настройка, разрешающая поведение, которое я хочу, в библиотеках MailMerge. Во всяком случае, вот код, который мы используем для преобразования данных и docx в pdf:

var pdf = _documentService.CreateTableFile(new TableFileData(date, companyId, 
    dataList.Select(x => new TableRowData
    {
        Description = x.Description,
        Amount = x.Amount,
        Date = x.Date,
        Id = x.Id
    }).ToList()));

var path = Path.Combine(FileService.GetTemporaryPath(), Path.GetRandomFileName());
var file = Path.ChangeExtension(path, "pdf");

using (var fs = File.OpenWrite(file))
{
    fs.Write(pdf, 0, pdf.Length);
}

Process.Start(file);

С методом CreateTableFile:

public byte[] CreateTableFile(TableFileData data)
{
    if (data == null) throw new ArgumentNullException("data");

    const string fileName = "TableFile.docx";
    var path = Path.Combine(_templatePath, fileName);

    using (var fs = File.OpenRead(path))
    {
        var dataSource = new DocumentDataSource(data);
        return GenerateDocument(fs, dataSource);
    }
}

С методом GenerateDocument:

private static byte[] GenerateDocument(Stream template, DocumentDataSource dataSource, IFieldMergingCallback fieldMergingCallback = null)
{
    var doc = new Document(template);

    doc.MailMerge.FieldMergingCallback = fieldMergingCallback;
    doc.MailMerge.UseNonMergeFields = true;
    doc.MailMerge.CleanupOptions = MailMergeCleanupOptions.RemoveContainingFields |
        MailMergeCleanupOptions.RemoveUnusedFields |
        MailMergeCleanupOptions.RemoveUnusedRegions |
        MailMergeCleanupOptions.RemoveEmptyParagraphs;

    doc.MailMerge.Execute(dataSource);
    doc.MailMerge.ExecuteWithRegions((IMailMergeDataSourceRoot)dataSource);

    doc.UpdateFields();

    using (var ms = new MemoryStream())
    {
        var options = new PdfSaveOptions { WarningCallback = new AsposeWarningCallback() };
        doc.Save(ms, options);
        return ms.ToArray();
    }
}

person Kevin Cruijssen    schedule 11.09.2015    source источник
comment
Похоже, вы используете стороннюю функцию слияния, а не встроенную функцию слияния. Но не уверен, что это на самом деле проблема программирования, если вы можете решить ее, выбрав строку таблицы в основном документе слияния и сняв флажок Разрешить разбиение строки на страницы (это/с в строке вкладку диалогового окна «Свойства таблицы»). Может все еще быть проблема вдовы/сироты, когда строка заголовка находится на одной странице, а строка данных заканчивается на следующей.   -  person    schedule 12.09.2015
comment
@bibadia Большое спасибо, это помогло. Я проверил опцию в настройках таблицы в .docx, и она работает. Не могли бы вы дать ответ, который я могу принять, или вы хотите, чтобы я сделал ответ за вас?   -  person Kevin Cruijssen    schedule 14.09.2015
comment
Не могли бы вы создать ответ? (Например, у меня нет под рукой подробных инструкций).   -  person    schedule 14.09.2015
comment
@bibadia Я создал ответ. Еще раз спасибо за исправление.   -  person Kevin Cruijssen    schedule 14.09.2015


Ответы (1)


После предложения @bibadia в первом комментарии к вопросу я снял флажок с предложенного флажка настроек таблицы в docx: введите здесь описание изображения

Это сработало, так что большое спасибо bibadia!

person Kevin Cruijssen    schedule 14.09.2015