xps glyphs richtig rendern ***gelöst***
-
Hallo Leute,
wie kann ich xps glyphs richtig rendern?
if (null != p.Indices) { double xPos = 0.0; for (int i = 0; i < p.Indices.Count; i++) { double charWidth = 0; charWidth += CalcWidth(g.LeftSideBearings[(ushort)indize.GlyphIndex], p.FontRenderingEmSize); using (var gr = System.Drawing.Graphics.FromImage(b)) { System.Drawing.Text.PrivateFontCollection ttf; var fam = LoadFontFamily(fontPath, out ttf); var font = new System.Drawing.Font(fam, (float)p.FontRenderingEmSize); double x = p.OriginX + xPos + charWidth; double y = (p.OriginY - CalcWidth(g.CapsHeight, p.FontRenderingEmSize)); gr.DrawString(oneChar, font, System.Drawing.Brushes.Black, new System.Drawing.PointF((float)x, (float)y)); font.Dispose(); fam.Dispose(); ttf.Dispose(); } if (indize.HasAdvanceWidth) { charWidth = CalcWidth(indize.AdvanceWidth / 100, p.FontRenderingEmSize); } else charWidth = CalcWidth(g.AdvanceWidths[(ushort)indize.GlyphIndex], p.FontRenderingEmSize); xPos += charWidth; } }
<Glyphs Fill="#ff000000" FontUri="/Documents/1/Resources/Fonts/F1F21704-B051-488D-AED2-2A048DA59521.odttf" FontRenderingEmSize="3.98002" StyleSimulations="None" OriginX="0" OriginY="33.92" Indices="3,3015;100,48;455;393,51;286,49;3,24;876,40;3,24;100,48;455,44;393,57;3,776;18,52;381,52;437,52;374;410,32;396,36;455,44;3,25;18,52;381,52;282,56;286,49;3,24;876,40;3,24;62,44;263;374;282,52;286,48;396,36;272,45;381,52;282,52;286,48;3,386;87,53;258;400,40;400,40;393,52;381;396,36;410,32;3,24;69,64;437;373;271,52;286,49;396,36;3,24;876,40;3,24;87;258,49;400,36;400,40;374,52;437;373;373;286,48;396,36;3" UnicodeString=" Type / Typ Country Code / Ländercode Passport Number / Passnummer " /> <Glyphs Fill="#ff000000" FontUri="/Documents/1/Resources/Fonts/F1F21704-B051-488D-AED2-2A048DA59521.odttf" FontRenderingEmSize="5.25363" StyleSimulations="None" OriginX="0" OriginY="42.72" Indices="3,2284;47,24;24,64;3,826;39,64;28,48;90;3,975;1005,52;1006,52;1007,52;1008;1009,52;1010,52;1011,52;1012,52;1013;1004,49;3" UnicodeString=" ID GER 1234567890 " /> <Glyphs Fill="#ff000000" FontUri="/Documents/1/Resources/Fonts/F1F21704-B051-488D-AED2-2A048DA59521.odttf" FontRenderingEmSize="5.25363" StyleSimulations="None" OriginX="120" OriginY="59.36" Indices="68,85;437,52;400,40;410,36;286,49;396,36;373;258,51;374,52;374,55;3" UnicodeString="Mustermann " />
Wenn ich jetzt mehrere Zeilen Zeichne die in meinem XPS Dokument genau untereinander beginnen, hat jede Zeile auf meinem Bild dann einen anderen Beginn von links her.
Wie verhält sich das mit dem Left und Rightbearing? Muß ich das zu der AdvancedWidth des Buchstaben addieren oder ist das schon mit eingeschlossen? Was passiert wenn in dem XPS indice eine AdvancedWidth gegeben ist ersetzt es dann die AdvancedWidth des Buchstaben?
Wie bekomme ich es hindas die Buchstabenabstände stimmen, die sind immer viel zu klein im Moment?
MfG
-
mit der Variante habe ich auch keinen Erfolg gehabt:
charWidth += CalcWidth(g.LeftSideBearings[(ushort)indize.GlyphIndex], p.FontRenderingEmSize); //if (" " != oneChar) { using (var gr = System.Drawing.Graphics.FromImage(b)) { System.Drawing.Text.PrivateFontCollection ttf; var fam = LoadFontFamily(fontPath, out ttf); var font = new System.Drawing.Font(fam, (float)p.FontRenderingEmSize); double x = p.OriginX + xPos + charWidth; double y = (p.OriginY - CalcWidth(g.CapsHeight, p.FontRenderingEmSize));// -font.Height / 2.0; gr.DrawString(oneChar, font, System.Drawing.Brushes.Black, new System.Drawing.PointF((float)x, (float)y)); font.Dispose(); fam.Dispose(); ttf.Dispose(); } } if (indize.HasAdvanceWidth) { charWidth += CalcWidth(indize.AdvanceWidth / 100, p.FontRenderingEmSize); } else charWidth += CalcWidth(g.AdvanceWidths[(ushort)indize.GlyphIndex], p.FontRenderingEmSize); charWidth += CalcWidth(g.RightSideBearings[(ushort)indize.GlyphIndex], p.FontRenderingEmSize);
wenn ich das left und right bearing dazu nehme bringt das auch nichts
-
also eventuell bin ich einen Schritt weiter.
Der Fehler ist wahrscheinlich in der Funktion CalcWidth zu finden
private double CalcWidth(double advancedWidth, double fontSize) { double ret = advancedWidth * fontSize; return ret; }
Hier muß ich ja noch irgendwie die DPI (96) des xps Dokumentes einrechnen. Die Frage ist nur wie?
MfG
-
also nochmal das Problem ist das die Buchstabenabstände zu klein sind. Also anders als beim angezeigten XPS
-
also ich probier das jetzt mal mit der microsoft klasse:
var msxps = new System.Windows.Xps.Packaging.XpsDocument(file,System.IO.FileAccess.Read); System.Windows.Xps.Packaging.IXpsFixedPageReader page = msxps.FixedDocumentSequenceReader.FixedDocuments[0].FixedPages[0];
Wie bekomme ich jetzt die Größe, Bilder, Schriftarten und Strings da raus?
MfG
-
http://msdn.microsoft.com/en-us/library/system.windows.xps.packaging.ixpsfixedpagereader.aspx
Wie du sehen kannst gibts für Fonts und Bilder ne Property
Leider kann ich dir dazu auch nicht mehr sagen wie auf der msdn Seite steht.
-
das habe ich auch schon gesehen
foreach (var font in page.Fonts) { } foreach (var image in page.Images) { }
nur wie geht es weiter. Ich benötige als erstes erst mal die Pagegröße. Dann kann ich mmir die Fonts und Bilder holen. Doch wo sind die Strings oder Glyphs?
MfG
-
ich habe das Problem gelöst:
if (indize.HasAdvanceWidth) charWidth += CalcWidth(indize.AdvanceWidth / 100, p.FontRenderingEmSize); else charWidth += CalcWidth(g.AdvanceWidths[(ushort)indize.GlyphIndex], p.FontRenderingEmSize);
diese Variante ist schon richtig. Nur das Problem war nicht das die Abstände zwischen den Buchstaben zu klein waren sondern die Buchstaben einfach zu groß.
Nachdem ich die FontRenderingEmSize korrekt weiter gegeben habe ging es.
MfG