Incorporate altchunks into docx document
Home › Forums › WordprocessingML › Incorporate altchunks into docx document
Tagged: AltChunk docx conversion images
This topic contains 2 replies, has 2 voices, and was last updated by Anonymous 4 years, 2 months ago.
-
AuthorPosts
-
May 26, 2020 at 2:12 am #8678
Hi,
Importing large number of AltChunks into docx, makes Word cannot open it. When I add about 30 AltChunks it’s fine, but a couple of more makes it impossible to open it by Word. I’m importing about 150 AltChunks – htmls containing images encoded with Base64.
It works when I add a batch of AltChunks then open docx and save with Word and then add another batch of AltChunks and save, and so on… Then afchunkxxx.htm are rearranged as media/imagexxx.png. Some text from AltChunk is then incorporated into document.xml and AltChunk references/nodes are changed to references/nodes from the catalog “Media”.
That “solution” is time consuming. Is there any way to do such a thing programatically? Some OpenXML trick? “OpenXmlPackage.saveToFlatOpc()” does not work. Opening the file and saving as a new file keeps AltChunks and is not creating images in “Media” catalog. Interop fails the same way Word fails. I’d be very thankful for any solution.I’ve found very similar issue on StackOverflow:
https://stackoverflow.com/questions/10067669/merge-altchunk-content-into-docx-source
That problem seems to be very old and there’s no programmatic solution.Thank you in advance,
Richard- This topic was modified 4 years, 7 months ago by Chunk. Reason: Corrected spelling and added detailed info on how I'm dealing with that issue right now
May 27, 2020 at 8:09 pm #8687Hi,
Actually I’ve found semi-solution with the use of Interop. I was able to open, tidy and update TOC for that document with the following code:
var wordApplication = new Application();
var document = wordApplication.Documents.Open(FileName: filePath, OpenAndRepair: true);document.TablesOfContents[1].Update();
document.SaveAs(filePath);document.Close();
wordApplication.Quit();Anyway if there’s some neat way to do it without the Interop I’d still be grateful.
October 12, 2020 at 2:27 pm #9780
AnonymousOk, so I managed to come up with a solution. In order to insert a document at a certain position I split the original document into two sources for the DocumentBuilder, then I created a source from the document to be inserted. In the end I built a new document with these 3 sources and it seems to be working just fine.
I am looking for the paragraph to split the original document by a placeholder, for example “@@insert@@”.
Bellow is the code if anyone needs it.
var paragraph = DestinationDocument.MainDocumentPart.Document.Descendants<OpenXmlParagraph>().FirstOrDefault(item => item.InnerText.Contains(placeHolder));
if (paragraph != null)
{
var idOfParagraph =
DestinationDocument.MainDocumentPart.Document.Descendants<OpenXmlParagraph>()
.ToList()
.IndexOf(paragraph);//save and close current destination document
SaveChanges(destinationFilePath, false);var sources = new List<Source>();
var originalDocument = new WmlDocument(destinationFilePath);
sources.Add(new Source(originalDocument, 0, idOfParagraph, true)); // add first part of initial document
var documentToBeInserted = new WmlDocument(docFilePath);
sources.Add(new Source(documentToBeInserted, true)); // add document to be insertedsources.Add(new Source(originalDocument, idOfParagraph + 1, true)); // add rest of initial document
var newDestinationDocument = DocumentBuilder.BuildDocument(sources); // build new document
newDestinationDocument.SaveAs(destinationFilePath); // save// re-open destination document
DestinationDocument = WordprocessingDocument.Open(Path.GetFullPath(destinationFilePath), true);
} -
AuthorPosts
You must be logged in to reply to this topic.