ITnetwork Flashka zdarma C# týden
Akce! Pouze tento týden sleva až 80 % na kurzy C# .NET. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!
Avatar
Martin Petrovaj
Překladatel
Avatar
Martin Petrovaj:28.8.2018 14:26

Parsujem PP prezentáciu pomocou OpenXML SDK a mám problém so získaním defaultnej veľkosti fontu v prezentácii. Momentálne môj kód vyzerá nejako takto (ospravedlňujem sa za dĺžku, imbecilné formátovanie aj abundanciu var):

public List<List<float>> GetIndexedFontSize()
{
    var result = new List<List<float>>();
    var allRuns = from slide in GetRawSlides() //GetRawSlides len vráti zoradené objekty typu Slide
                  select slide.Descendants<Run>()
                                .Where(r => !string.IsNullOrWhiteSpace(r.InnerText));
    foreach (var slide in allRuns)
        result.Add(GetFontSizesFromRuns(slide).ToList());
    return result;
}

private IEnumerable<float> GetFontSizesFromRuns(IEnumerable<Run> runs)
{
    //todo: fix incorrect output
    return (from run in runs
                let size = run.GetFirstChild<RunProperties>()?.FontSize
                let sizePoints = size?.Value ??
                                GetMasterLevelParagraphProperties(
                                        run.Ancestors<Shape>().FirstOrDefault(),
                                        run.Parent.GetFirstChild<ParagraphProperties>()?
                                                .Level?.Value ?? 1)
                                .GetFirstChild<DefaultRunProperties>().FontSize.Value
                select sizePoints / 100.0f);
}

private OpenXmlElement GetMasterLevelParagraphProperties(Shape shape, int level = 1)
{
    var typeName = $"DocumentFormat.OpenXml.Drawing.Level{level}ParagraphProperties, DocumentFormat.OpenXml";
    var type = Type.GetType(typeName);
    var textStyles = presentation.PresentationPart
                                .SlideMasterParts.First()
                                .SlideMaster.TextStyles;
    TextListStyleType styleType;
    var placeholderShape = shape?.NonVisualShapeProperties?.ApplicationNonVisualDrawingProperties
                                ?.PlaceholderShape;
    switch (placeholderShape?.Type?.Value)
    {
        case PlaceholderValues.Title:
        case PlaceholderValues.CenteredTitle:
        case PlaceholderValues.SubTitle:
            styleType = textStyles.TitleStyle;
            break;
        case PlaceholderValues.Body:
        case null when placeholderShape?.Index?.Value == null ||
                        placeholderShape.Index.Value == 1:
            styleType = textStyles.BodyStyle;
            break;
        default:
            styleType = textStyles.OtherStyle;
            break;
    }
    return (from descendant in styleType.Descendants()
                where descendant.GetType() == type
                select descendant).SingleOrDefault() ??
                styleType.Level1ParagraphProperties;
}

Problém je, že daný kód vracia pre objekty, kt. používajú defaultnú veľkosť fontu nesprávne hodnoty. Problém je zrejme v tom, že vlastne ani neviem, odkiaľ presne ten font size ťahať. Hore uvedený kód sa ho snaží získať zo slide masteru, kde sú ale spomínané nezmyselné hodnoty (napr. prezentácia používa FS pre title 60, v slide masteri je uložená hodnota 44 a pod.) Zmysluplnejšie hodnoty som našiel v slide layoute, avšak font size je definovaná len v jednom, pričom prezentácia ich obsahuje viacero a v ostatných (okrem prvého slide layoutu) font size definovaný nie je. Brať hodnoty paušálne z prvého slide layoutu mi nepripadá ako systémové riešenie, na ktoré sa v aplikácii môžem spoľahnúť (budú ňou denne prechádzať stovky prezentácií od napr. od lokalizátorov).

Zkusil jsem: Mlátiť hlavou o klávesnicu

Chci docílit: Načítanie správnej veľkosti fontu pre každý shape v danom slide

Editováno 28.8.2018 14:27
Odpovědět 28.8.2018 14:26
if (this.motto == "") { throw new NotImplementedException(); }
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.