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 Slideselect 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 outputreturn (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:
casenullwhen 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
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.