2016-01-13 68 views
0

我目前正在研究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文本仍然以相同的數量跳轉,就好像一個標籤在它之前或之前一樣..

回答

0

好的,問題已修復..作爲測試我試圖臨時改變了,放到.docx代替.pdf,這樣我就可以更好地看標籤和這種轉換後的文件中:

doc.Save(memoryStream, SaveFormat.Pdf); 
// changed to 
doc.Save(memoryStream, SaveFormat.Docx); 

return File(documentAsByteArray, "application/pdf"); 
// changed to 
return File(documentAsByteArray, "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 

當我打開轉換後的.docx我很快發現了這個問題。它與MailMerging沒有任何關係,但與文檔本身的統治者有關。 Word-doc統治者既有灰色部分也有沙漏 - 有點兒(我的問題中的X)。

它被設置爲這樣:enter image description here

,而不是這樣的:enter image description here

對準兩個沙漏啄並在彼此頂部我的Word文檔的灰色部分後,HTML文本也與MailMerging後的其餘部分正確對齊。

+0

你試過** 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合作。 –

+0

@AwaisHafeez好吧,正如我在回答中所說的那樣,這只是我自己的錯誤,因爲錯誤地使用了字尺。我通過使用屏幕截圖更改了我的答案,以更好地反映解決方案和我的問題的原因。 –