Изменение гиперссылки с помощью openxml
Я пытаюсь изменить гиперссылку в текстовом документе. Гиперссылка изначально указывает на закладку во внешнем документе. То, что я хочу сделать, это изменить его, чтобы указать на внутреннюю закладку, что и тот же Anchor.
Вот код, который я использую... Кажется, что работает, когда я, что переменные, но когда я смотрю на сохраненный документ, это точно так же, как оригинал.
По какой причине мои шансы не сохраняются?
// read file specified in stream
MemoryStream stream = new MemoryStream(File.ReadAllBytes("C:\\TEMPO\\smartbook\\text1.docx"));
WordprocessingDocument doc = WordprocessingDocument.Open(stream, true);
MainDocumentPart mainPart = doc.MainDocumentPart;
// The first hyperlink -- it happens to be the one I want to modify
Hyperlink hLink = mainPart.Document.Body.Descendants<Hyperlink>().FirstOrDefault();
if (hLink != null)
{
// get hyperlink's relation Id (where path stores)
string relationId = hLink.Id;
if (relationId != string.Empty)
{
// get current relation
HyperlinkRelationship hr = mainPart.HyperlinkRelationships.Where(a => a.Id == relationId).FirstOrDefault();
if (hr != null)
{
// remove current relation
mainPart.DeleteReferenceRelationship(hr);
// add new relation with relation
// mainPart.AddHyperlinkRelationship(new Uri("C:\\TEMPO\\smartbook\\test.docx"), false, relationId);
}
}
// change hyperlink attributes
hLink.DocLocation = "#";
hLink.Id = "";
hLink.Anchor = "TEST";
}
// save stream to a new file
File.WriteAllBytes("C:\\TEMPO\\smartbook\\test.docx", stream.ToArray());
doc.Close();
1 ответ
Вы еще не сохранили свой OpenXmlPackage при записи потока...
// types that implement IDisposable are better wrapped in a using statement
using(var stream = new MemoryStream(File.ReadAllBytes(@"C:\TEMPO\smartbook\text1.docx")))
{
using(var doc = WordprocessingDocument.Open(stream, true))
{
// do all your changes
// call doc.Close because that SAVES your changes to the stream
doc.Close();
}
// save stream to a new file
File.WriteAllBytes(@"C:\TEMPO\smartbook\test.docx", stream.ToArray());
}
Close
метод заявляет явно:
Сохраняет и закрывает пакет OpenXml плюс все основные потоки компонентов.
Вы также можете установить AutoSave
свойство true, и в этом случае OpenXMLPackage будет сохранен, когда Dispose
называется. using
Заявление, которое я использовал выше, будет гарантировать, что это произойдет.