मैं इस सूत्र को अद्यतन करने और दूसरों के लाभ के लिए ऊपर एडम जवाब देने के लिए जोड़ना चाहते हैं।
मैं वास्तव में दूसरे दिन एक साथ काम करने वाले कोड को हैक करने में कामयाब रहा, (एडम ने अपना जवाब पोस्ट करने से पहले) लेकिन यह बहुत मुश्किल था। दस्तावेज वास्तव में गरीब है और वहां बहुत सारी जानकारी नहीं है।
मैं Inline
और Run
तत्व है जो एडम उसके जवाब में उपयोग करता है के बारे में पता नहीं था, लेकिन चाल Descendants<>
संपत्ति को प्राप्त करने में हो रहा है और फिर आप काफी एक सामान्य एक्सएमएल मानचित्रण की तरह किसी भी तत्व को पार्स कर सकते हैं।
byte[] docBytes = File.ReadAllBytes(_myFilePath);
using (MemoryStream ms = new MemoryStream())
{
ms.Write(docBytes, 0, docBytes.Length);
using (WordprocessingDocument wpdoc = WordprocessingDocument.Open(ms, true))
{
MainDocumentPart mainPart = wpdoc.MainDocumentPart;
Document doc = mainPart.Document;
// now you can use doc.Descendants<T>()
}
}
आप इस यह, बातों के लिए खोज करने के लिए काफी आसान है, हालांकि आप बाहर काम करने के क्या सब कुछ कहा जाता है मिल गया है एक बार। उदाहरण के लिए, <pic:nvPicPr>
Picture.NonVisualPictureProperties
, आदि
जैसा कि एडम सही ढंग से कहता है, छवि को प्रतिस्थापित करने के लिए आपको जिस तत्व को खोजने की आवश्यकता है वह Blip
तत्व है। लेकिन आपको उस सही क्लिप को ढूंढने की ज़रूरत है जो उस छवि से मेल खाती है जिसे आप प्रतिस्थापित करने का प्रयास कर रहे हैं।
एडम एक तरह से Inline
तत्व का उपयोग को दर्शाता है। मैं बस सीधे अंदर डाला और सभी तस्वीर तत्वों के लिए देखा। मुझे यकीन नहीं है कि कौन सा बेहतर या अधिक मजबूत तरीका है (मुझे नहीं पता कि एक्सएमएल संरचना दस्तावेजों के बीच कितनी सुसंगत है और यदि यह तोड़ने का कारण है)।
Blip GetBlipForPicture(string picName, Document document)
{
return document.Descendants<Picture>()
.Where(p => picName == p.NonVisualPictureProperties.NonVisualDrawingProperties.Name)
.Select(p => p.BlipFill.Blip)
.Single(); // return First or ToList or whatever here, there can be more than one
}
एडम के एक्सएमएल उदाहरण को यहां विभिन्न तत्वों को समझने के लिए देखें और देखें कि मैं क्या खोज रहा हूं।
ब्लिप में Embed
संपत्ति में एक आईडी है, उदाहरण के लिए: <a:blip r:embed="rId4" cstate="print" />
, यह क्या करता है मीडिया फ़ोल्डर में एक छवि को ब्लिप करें (यदि आप का नाम बदलते हैं तो आप इन सभी फ़ोल्डरों और फ़ाइलों को देख सकते हैं। ज़िप और इसे अनजिप करें)। आप _rels\document.xml.rels
में मानचित्रण पा सकते हैं:
<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.png" />
तो आप एक नई छवि को जोड़ने जाता है, और फिर अपने नव निर्मित छवि के आईडी पर इस ब्लिप बात करने के लिए की जरूरत है क्या:
// add new ImagePart
ImagePart newImg = mainPart.AddImagePart(ImagePartType.Png);
// Put image data into the ImagePart (from a filestream)
newImg .FeedData(File.Open(_myImgPath, FileMode.Open, FileAccess.Read));
// Get the blip
Blip blip = GetBlipForPicture("MyPlaceholder.png", doc);
// Point blip at new image
blip.Embed = mainPart.GetIdOfPart(newImg);
मुझे लगता है कि यह सिर्फ मीडिया फ़ोल्डर में पुरानी छवि को अनाथ बनाता है जो आदर्श नहीं है, हालांकि शायद यह कचरा करने के लिए पर्याप्त चालाक है ताकि वह बोल सके। ऐसा करने का एक बेहतर तरीका हो सकता है, लेकिन मुझे यह नहीं मिला।
वैसे भी, वहाँ तुम्हारे पास है। यह धागा अब वेब पर कहीं भी छवि को स्वैप करने के तरीके पर सबसे पूरा दस्तावेज है (मुझे पता है, मैंने घंटों की खोज में बिताया)। तो उम्मीद है कि कुछ लोगों को यह उपयोगी लगेगा।
एडम, एक महान उत्तर के लिए धन्यवाद। इसे पोस्ट करने से पहले मैं कुछ काम करने में कामयाब रहा, इसलिए मैंने नीचे अपने उत्तर में कुछ और जानकारी जोड़ दी है। – fearofawhackplanet
दूसरा कोडब्लॉक सबसे आसान है जिसे मैंने अभी तक एक नया स्थान जोड़ने के बजाय छवि को प्रतिस्थापित करने के लिए पाया है। अगर मैं कर सकता तो मैं 2x वोट दूंगा! –