2013-08-16 41 views
0

我想嵌入一個Word文檔(稱爲「hidden.docx」)到另一個Word文檔中(稱之爲「host.docx」)。當最終用戶在Word中打開host.docx時,hidden.docx文檔根本不可見。文檔hidden.docx只能在host.docx內攜帶,可以作爲非結構化貨物數據。我可以使用VSTO而不是Open XML來操作altChunk功能嗎?

我所做的所有研究都指出使用Open XML SDK提供的所​​謂altChunk。我已經安裝了Open XML SDK並獲得了一個示例工作:http://msdn.microsoft.com/en-us/library/gg490656%28v=office.14%29.aspx

我的問題:爲了將altChunk插入到docx中,我真的需要Open XML SDK嗎?這不能用VSTO來完成嗎?如果是這樣,怎麼樣?

[PS:我的最終目標是,對於一對文檔,其中一個文檔是原始文本,另一個是其翻譯版本的另一種語言,以便能夠保留翻譯文檔中的原始文檔,例如不要失去它。對於任何文件對,總是有這兩個文件成爲通過他們的一個錯位分離的風險。]

+2

我懷疑使用VSTO插入Altchunk XML代碼的唯一方法是使用Range.InsertXml。但是這可能會導致塊與文檔的其餘部分集成,而不是添加隱藏部分。我可能會做的是創建一個自定義XML部分,並查看是否可以將文檔的全部文本(以Flat OPC格式)放在那裏。如果你只需要保存文本,另一種格式可能是合適的。用於使用PRIVATE字段來存儲這些內容的詞,例如從WordPerfect格式轉換時,它們很容易被意外銷燬。 – 2013-08-18 07:44:22

+0

@bibadiak謝謝你,我不知道平面OPC格式,並認爲我將不得不單獨處理zip文件夾中的每個文件。您的評論非常有幫助。我發現使用定製XML部件的複雜性越多,我越傾向於序列化文件(Flat OPC,然後是base64),並將其嵌入settings.xml中的XML註釋中。我試過這個,它的工作原理。歡迎您的意見。 – Sabuncu

+0

Re。嵌入在評論中,如果它有效,它就可以工作。我想研究的主要事情是什麼簡單的操作會導致數據丟失(例如,保存爲.doc可能&如果可以,可能值得測試當您以非兼容模式和/或嚴格ISO保存時發生的情況格式從Word 2013)。建議您修改原始郵件以包含您用於填充設置的代碼,前提是您徵求其他人的意見。 – 2013-08-18 13:00:29

回答

1

是和

1)這不是什麼AltChunks做。 AltChunks是一種將一個文檔嵌入到另一個文檔中的方法,以便它們合併在一起。他們不隱藏。如果您創建一個包含AltChunk的docx包,然後打開Word,Word將立即將該AltChunk合併到文檔中。 (如果AltChunk是另一個也包含子AltChunks的Word文檔,它們將遞歸合併到父項中。)基本上,這是一種將內容合併到一起而不必重新整合所有樣式,rID等的簡單方法。 - if您保存文​​檔並檢查它,AltChunk將會消失,並且您會注意到Word已將文檔重新合併爲單個文檔。

2.)Range.InsertXML如果提供了一個完整的Word文檔的有效的Flat Package將引發相同的合併功能(直到具有相同的錯誤等),你會從一個AltChunk獲得。這兩者的行爲完全相同,您甚至可以使用包含嵌入式AltChunks的OpenXML SDK創建文檔包,並插入這些文件(我在Word 2007,2010和2013中完成了這些) - 當然,正如我上面提到的那樣, AltChunks永遠不會持久,它們會立即合併到文檔中。

如果要將隱藏數據保存在文檔中,我建議使用自定義XML(請參閱Document.CustomXMLParts)。請記住,至少在Word 2010中,撤銷不會恢復對CustomXML部件的更改。

1

如果您只是想將一些文件包含到Open XML包中,那麼最簡單的方法就是使用System.IO.Packaging命名空間中的API(首先獲取對主機部分主文檔部分的引用):

EmbeddedPackagePart hiddenDocumentPart = mainDocumentPart.AddEmbeddedPackagePart(@"application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
hiddenDocumentPart.FeedData(File.Open(hiddenDocumentFile, FileMode.Open)); 

只是可以肯定,這種方式隱藏的文件將在主文檔內容的沒有辦法的一部分。它只會是其文件(包)的一部分。稍後可以用類似的方法提取它:獲取主機文檔的主要部分,找到嵌入(隱藏)部分並從中讀取/讀取數據。

相關問題