我目前正在研究MailMerge Word-doc。它部分用字符串填充,部分用html(可以包含表格,圖片,粗體/斜體/帶下劃線的文本等)填充。該Word文檔也有比默認的文字對齊自定義對齊(所以left, top, right, bottom
標尺是一樣的東西在我的郵件合併字文檔1.5, 0.3, 0.3, 0.3
,而字默認情況下它像2.5, 2.5, 2.5, 2.5
。)MailMerge InsertHtml遵循Word-doc對齊
現在的問題是, InsertHtml
跳轉(並且似乎遵循默認的單詞對齊,而不是我們自定義的單詞對齊),而不是通過word-doc中存在的靜態文本和表進行對齊。
我知道MailMerging使用默認的MS Word函數插入HTML,所以也許問題在於默認函數而不是Apose的MailMerging。我只是想知道如果有人知道一個解決方案。
下面是結果的一個可視化示例。我已經包括了統治者,其中X
是在統治者上設置的位置。假設我們在HTML部分插入的文本是非常基本的,比如純文本:「這是一個測試HTML文本」。字文檔模板看起來是這樣的:
+ . 2 . | X 1 ............................................... 17 . | . X . |
X *Start of a table*
. ...
. Value: | {{Value}}
. *End of the table*
.
. *A bold title*
.
. {{html_Text}}
.
. *Another bold title*
.
X
29
+
但MailMerging後的結果是這樣的:而不是自定義一個
+ . 2 . | X 1 ............................................... 17 . | . X . |
X *Start of a table*
. ...
. Value: | 2500
. *End of the table*
.
. *A bold title*
.
. this is a test HTML text
.
. *Another bold title*
.
X
29
+
HTML文本不正確對齊下默認的Word統治者,該文件。
(PS:我知道用括號{{Something}}
比<<Something>>
較少使用的MailMerging,但兩者的工作方式相同,我不得不讓人質疑郵件合併語法,我們在過去的使用,因此該擡頭)
這裏是我們的.NET項目的相關代碼:
打印DTO對象:當我們點擊下一步
public class OurObjectPrintDto
{
public OurObjectPrintDto(OurObject ob)
{
...
Value = ob.Value;
...
html_Text = ob.Text;
}
public string Value { get; private set; }
public string html_Text { get; private set; }
}
方法他生成文檔按鈕:
[HttpGet]
public ActionResult Print(Guid id)
{
var ourObject = NhSession.GetByGuid<OurObject>(id);
var printData = new OutObjectPrintDto(ourObject);
var documentAsByteArray = _documentService.CreateMyObjectPrintAsBytes(printData);
return File(documentAsByteArray, "application/pdf");
}
CreateMyObjectPrintAsBytes
- 方法:
public byte[] CreateMyObjectPrintAsBytes(MyObject printData)
{
return GenerateDocument("myobject.docx", printData);
}
private byte[] GenerateDocument(string fileName, object printData)
{
if (printData == null) throw new ArgumentNullException("printData");
var path = Path.Combine(_templatePath, fileName);
using (var fileStream = new File.OpenRead(path))
{
var dataSource = new DocumentDataSource(printData);
return DocumentConverter.GenerateDocument(fileStream, dataSource);
}
}
DocumentConvert.GenerateDocument
- 方法:
public byte[] GenerateDocument(Stream template, DocumentDataSource dataSource)
{
var doc = new Document(template);
doc.MailMerge.UseNonMergeFields = true;
doc.MailMerge.CleanupOptions = MailMergeCleanupOption.RemoveContainingFields |
MailMergeCleanupOptions.RemoveUnusedFields |
MailMergeCleanupOptions.RemoveUnusedRegions |
MailMergeCleanupOptions.RemoveEmptyParagraphs;
doc.ResourceLoadingCallback = new ImageLoadingHandler();
// Support html MailMerge-fields
doc.MailMerge.FieldMergingCallback = new HandleMergeFieldInsertHtml();
doc.MailMerge.Execute(dataSource);
doc.MailMerge.ExecuteWithRegions((IMailMergeDataSourceRoot) dataSource);
doc.UpdateFields();
using (var memoryStream = new MemoryStream())
{
doc.Save(memoryStream, SaveFormat.Pdf);
return memoryStream.ToArray();
}
}
HandleMailMergeFieldInsertHtml
-class:
using Aspose.Words;
using Aspose.Words.Reporting;
namespace Sogyo.Util.Pdf
{
public class HandleMergeFieldInsertHtml : IFieldMergingCallback
{
// This is called when merge field is atually merged with data in the document
void IFieldMergingCallback.FieldMerging(FieldMergingArgs e)
{
// All merge field that expect HTML data should be marked with the prefix 'html_'
if (e.DocumentFieldName.StartsWith("html_") && e.FieldValue != null)
{
// Insert the text for this merge field as HTML data
var documentBuilder = new DocumentBuilder(e.Document);
documentBuilder.MoveToMergeField(e.DocumentFieldName);
documentBuilder.InsertHtml((string) e.FieldValue);
// The HTML text itself should not be inserted.
// We have already inserted it as an HTML.
e.Text = "";
}
}
void IFieldMergingCallback.ImageFieldMerging(ImageFieldMergingArgs e)
{
}
}
}
我確實嘗試在代碼中設置documentBuilder
的.PageSetup.LeftMargin
以更改文檔的標尺。這確實會改變文檔的標尺對齊方式,但插入的html文本仍然以相同的數量跳轉,就好像一個標籤在它之前或之前一樣..
你試過** DocumentBuilder.InsertHtml(String,Boolean)**方法是否超載?當第二個參數爲true時,插入文本的格式基於DocumentBuilder格式,文本看起來好像是用_DocumentBuilder.Write_方法插入的。您也可以在[Aspose.Words論壇](http://www.aspose.com/community/forums/aspose.words-product-family/75/showforum.aspx)中報告此問題。請在您的線程中附上您的輸入/輸出Word文檔和源代碼(控制檯應用程序)以進行測試。我以開發者傳播者的身份與Aspose合作。 –
@AwaisHafeez好吧,正如我在回答中所說的那樣,這只是我自己的錯誤,因爲錯誤地使用了字尺。我通過使用屏幕截圖更改了我的答案,以更好地反映解決方案和我的問題的原因。 –