Word OpenXML изменить идентификатор отношения и URI для imagePart? - PullRequest
0 голосов
/ 26 марта 2019

Привет, как я могу изменить реализацию и URI. Я хочу объединить нижний колонтитул и верхний колонтитул из разных файлов, но идентификаторы uri и отношения в этом случае совпадают /word/media/image1.png в обоих файлах и в rId1.

То, что я хочу, перед объединением документов, я хочу изменить все отношения с уникальным GUID. и URI должен быть что-то вроде

/ слово / СМИ / rIddb654056-f112-4695-b38b-0f4f5f81a1ed.png

Что происходит сейчас, так это то, что только 1 изображение передается в целевой документ.

    public void ReplaceBlipRealtionShip(HeaderPart part)
    {
        foreach (var imgPart in part.GetPartsOfType<ImagePart>().Take(1).ToList())
        {
            var existingId = part.GetIdOfPart(imgPart);
            var blip = part.Header.Descendants<A.Blip>()
                .Where(x => x.Embed.Value == existingId).FirstOrDefault();



            if (blip != null)
            {
                var newId = OpenXmlGenericHelper.GenerateUniqueRId();
                var extension = Path.GetExtension(imgPart.Uri.ToString());
                Uri imageUri = new Uri($"/word/media/{newId}.{extension}", UriKind.Relative);
                // Create "image" part in /word/media
                // Change content type for other image types.
                var packageImagePart =
                  WordDoc.Package.CreatePart(imageUri, imgPart.ContentType);

                imgPart.GetStream().CopyTo(packageImagePart.GetStream());


                var packagePart = part.OpenXmlPackage.Package.GetPart(part.Uri);


                var imageReleationshipPart = packagePart.CreateRelationship(
                      new Uri($"/word/media/{newId}.{extension}", UriKind.Relative),
                      motpackaging::System.IO.Packaging.TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image");

                //part.ChangeIdOfPart(imgPart, newId);
                this.WordDoc.Save();
            }
        }
    }

Дополнительный код:

private List<KeyValuePair<Type, Stream>> CopyParts(OpenXmlPart srcPart, OpenXmlPart destPart)
    {
        if(srcPart is HeaderPart)
        {
            ReplaceBlipRealtionShip((HeaderPart)srcPart);
        }

        var listToAdd = new List<KeyValuePair<Type, Stream>>();
        foreach (var idPart in srcPart.Parts)
        {
            var part = srcPart.GetPartById(idPart.RelationshipId);
            if (part is ImagePart)
            {
                var newPart = destPart.AddNewPart<ImagePart>(part.ContentType, idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(ImagePart), part.GetStream()));
            }
            else if (part is DiagramStylePart)
            {
                destPart.AddNewPart<DiagramStylePart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(DiagramStylePart), part.GetStream()));
            }
            else if (part is DiagramColorsPart)
            {
                destPart.AddNewPart<DiagramColorsPart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(DiagramColorsPart),
                    part.GetStream()));
            }
            else if (part is DiagramDataPart)
            {
                destPart.AddNewPart<DiagramDataPart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(DiagramDataPart), part.GetStream()));
            }
            else if (part is DiagramPersistLayoutPart)
            {
                destPart.AddNewPart<DiagramPersistLayoutPart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(DiagramPersistLayoutPart),
                    part.GetStream()));
            }
            else if (part is StyleDefinitionsPart)
            {
                destPart.AddNewPart<StyleDefinitionsPart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(StyleDefinitionsPart),
                    part.GetStream()));
            }
            else if (part is StylesWithEffectsPart)
            {
                destPart.AddNewPart<StylesWithEffectsPart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(StylesWithEffectsPart),
                    part.GetStream()));
            }
            else if (part is ThemePart)
            {
                destPart.AddNewPart<ThemePart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(ThemePart),
                    part.GetStream()));
            }
            else if (part is PivotTablePart)
            {
                destPart.AddNewPart<PivotTablePart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(PivotTablePart),
                    part.GetStream()));
            }
            else if (part is TableDefinitionPart)
            {
                destPart.AddNewPart<TableDefinitionPart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(TableDefinitionPart),
                    part.GetStream()));
            }
            else if (part is TableStylesPart)
            {
                destPart.AddNewPart<TableStylesPart>(idPart.RelationshipId);
                listToAdd.Add(new KeyValuePair<Type, Stream>(typeof(TableStylesPart),
                    part.GetStream()));
            }
        }

        return listToAdd;
    }

    private void _PrependHeader(HeaderPart srcHeaderPart, HeaderPart destHeaderPart, MainDocumentPart destMainPart)
    {
        if (srcHeaderPart != null)
        {
            // Copy content of header to new header
            destHeaderPart.FeedData(srcHeaderPart.GetStream());

            if (destHeaderPart.Header != null)
            {
                // Keep formatting
                KeepParagraphStyle(destHeaderPart.Header);
            }

            // Get all ids of every 'Parts'
            var listToAdd = CopyParts(srcHeaderPart, destHeaderPart);
            // Foreach Part, copy stream to new header
            var i = 0;
            foreach (var idPart in destHeaderPart.Parts)
            {
                var part = destHeaderPart.GetPartById(idPart.RelationshipId);
                if (part.GetType() == listToAdd[i].Key)
                {
                    part.FeedData(listToAdd[i].Value);
                }
                i++;
            }
        }
        else
        {
            destMainPart.DeleteParts(destMainPart.HeaderParts);
            var sectToRemovePrs = destMainPart.Document.Body.Descendants<SectionProperties>();
            foreach (var sectPr in sectToRemovePrs)
            {
                // Delete reference of old header
                sectPr.RemoveAllChildren<HeaderReference>();
            }
        }
    }
...