Aspose.Words - изображения MailMerge

Я пытаюсь пройти через Dataset, создав страницу для каждого элемента, используя функцию слияния почты Aspose.Words. Приведенный ниже код проходит через Dataset - и передает некоторые значения в функцию Mail-Merge Execute.

var blankDocument = new Document();
var pageDocument = new Document(sFilename);
...
foreach (DataRow row in ds.Tables[0].Rows){
    var sBarCode = row["BarCode"].ToString();
    var imageFilePath = HttpContext.Current.Server.MapPath("\\_temp\\") + sBarCode + ".png";

    var tempDoc = (Document)pageDocument.Clone(true);

    var fieldNames = new string[] { "Test", "Barcode" };
    var fieldData = new object[] { imageFilePath, imageFilePath };

    tempDoc.MailMerge.Execute(fieldNames, fieldData);

    blankDocument.AppendDocument(tempDoc, ImportFormatMode.KeepSourceFormatting);
}
var stream = new MemoryStream();
blankDocument.Save(stream, SaveFormat.Docx);
// I then output this stream using headers, 
// to cause the browser to download the document.

Элемент слияния почты { MERGEFIELD Test } получает правильные данные от Dataset. Однако фактическое изображение отображает изображение страницы 1 на всех страницах, используя:

{ INCLUDEPICTURE "{MERGEFIELD Barcode }" \* MERGEFORMAT \d }

Скажем, это мои данные для поля «Штрих-код»:

c:\img1.png
c:\img2.png
c:\img3.png

На первой странице этого документа отображается c:\img1.png в тексте для поля «Тест». И изображение, которое показано, это img1.png.

Однако Страница 2 показывает c:\img2.png как текст, но отображает img1.png как фактическое изображение.

Кто-нибудь знает об этом?

Изменить: похоже, это скорее проблема Word. Когда я переключаюсь между режимами Alt + F9 внутри Word, изображение фактически отображает c:\img1.png в качестве источника. Вот почему он отображается на каждой странице.

Я упростил это до:

{ INCLUDEPICTURE "{MERGEFIELD Barcode }" \d }

Также добавлены тестовые данные для этого поля в список получателей рассылки Word. Когда я просматриваю, он не втягивает данные, меняя изображение. Итак, это основная проблема.


person tcarter2005    schedule 06.06.2012    source источник


Ответы (2)


Если бы вывод выполнял Word (не уверен насчет Aspose), здесь были бы две возможные проблемы.

  1. INCLUDEPICTURE ожидает, что обратная косая черта будет удвоена, например "c\\img2.png", или (что менее надежно) использовать косую черту или ":" разделители Mac на этой платформе. Однако это может быть нормально, если данные поступают через поле result, как вы это делаете здесь.

  2. INCLUDEPICTURE результаты не обновлялись автоматически «по дизайну», так как Microsoft изменила ряд поведений полей по соображениям безопасности около 10 лет назад. Если вы выполняете слияние с выходным документом, вы, вероятно, можете обойти это, используя следующие вложенные поля:

    { INCLUDEPICTURE { IF TRUE "{ MERGEFIELD Barcode }" } }
    

    или удалить поля в итоговом документе,

    { IF { INCLUDEPICTURE { IF TRUE "{ MERGEFIELD Barcode }" } } {
    INCLUDEPICTURE { IF TRUE "{ MERGEFIELD Barcode }" } } }
    

Все { } необходимо вставить с помощью Ctrl + F9 обычным способом.
(Не спрашивайте меня, где задокументировано использование «ИСТИНА» - поскольку насколько я знаю, это не так.)

person Community    schedule 08.06.2012

Я знаю, что это старый вопрос. Но все же я хотел бы на него ответить.

Используя Aspose.Words, очень легко вставлять изображения при выполнении слияния писем. Для этого вы должны просто использовать поле слияния со специальным именем, например Image: MyImageFieldName. https://docs.aspose.com/words/net/insert-checkboxes-html-or-images-during-mail-merge/#how-to-insert-images-from-a-database

Кроме того, не требуется перебирать строки в наборе данных и выполнять слияние почты для каждой строки. Просто передайте все данные в метод MailMerge.Execute, и Aspose.Words будет дублировать шаблон для каждой записи в данных. Вот простой пример такого шаблона  Снимок экрана шаблона

После выполнения слияния почты с использованием следующего кода:

// Create dummy data.
DataTable dt = new DataTable();
dt.Columns.Add("FirstName");
dt.Columns.Add("LastName");
dt.Columns.Add("MyImage");
dt.Rows.Add("John", "Smith", @"C:\Temp\1.png");
dt.Rows.Add("Jane", "Smith", @"C:\Temp\2.png");

// Open template, execute mail merge and save the result.
Document doc = new Document(@"C:\Temp\in.docx");
doc.MailMerge.Execute(dt);
doc.Save(@"C:\Temp\out.docx");

Результат будет выглядеть следующим образом:  Снимок экрана с результатами

Раскрытие информации: я работаю в команде Aspose.Words.

person Alexey Noskov    schedule 22.10.2020
comment
Привет, я пытаюсь сделать то же самое, но безуспешно. У меня есть путь к изображению в одной переменной, и мне нужно изменить размер изображения перед добавлением ширины 50, высоты 50. row [mergeFieldName] = imagePath; вот как я, наконец, добавляю строку в таблицу. - person BritSys; 26.02.2021
comment
@BritSys. IFieldMergingCallback можно реализовать apireference.aspose.com/words/net/ aspose.words.mailmerging /, чтобы управлять тем, как изображение вставляется в документ при слиянии писем. В вашем конкретном случае вы можете использовать свойства ImageFieldMergingArgs.ImageHeight и ImageFieldMergingArgs.ImageWidth apireference.aspose.com/words/net/aspose.words.mailmerging/ - person Alexey Noskov; 01.03.2021