2016-08-02 20 views
0

Ich habe etwas Text, der das Omega-Zeichen (0x3A9) enthält, und wenn ich dieses Zeichen in der Standardschrift Helvetica anzeigen, wird nichts in der PDF angezeigt.iTextSharp - nicht alle Zeichen in Helvetica Schriftart

ich meine Fonts erschaffe

BaseFont Helvetica = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 

und Verwendung, wie erwartet, Helvetica.CharExists (0x3A9) gibt false zurück.

Ich habe auch CharExists (0x3A9) für die Schriftarten TIMES_ROMAN, SYMBOL und ZAPF_DINGBATS aufgerufen. Alle geben false zurück.

  1. Erstelle ich die Schriftart falsch? Gibt es eine bessere Möglichkeit, die Schriftart zu erstellen, die den Omega-Charakter enthält?
  2. Gibt es eine allgemeine Möglichkeit, fehlende Zeichen wie diese zu behandeln? Sollte ich nur über alle verfügbaren Schriftarten auflisten, bis ich eine finde, wo CharExists (0x3A9) wahr zurückgibt?

Mein Dokument in Englisch, aber ein paar Brocken von Sonderzeichen hat - plus/minus, links und rechts doppelte Anführungszeichen, Mikron usw.

P. S. Ich sehe, dass ich eine Schriftart Arial erstellen:

BaseFont arial = BaseFont.CreateFont("c:\\windows\\fonts\\arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 

und das macht eine Glyphe für Zeichen 0x3A9 enthalten. Aber anscheinend kann ich die HELVETICA Schrift nicht mit der IDENTITY_H Kodierung erstellen.

+1

Helvetica, TIMES_ROMAN, Symbol- und ZAPF_DINGBATS sind Standard-14-Schriftarten, die jeweils PDF-Betrachter mit einem bestimmten, begrenzten Zeichensatz zur Verfügung stellen muss. Wenn Sie mehr Zeichen benötigen, müssen Sie selbst eine Schriftart bereitstellen, wie Sie es für Arial tun. – mkl

Antwort

0

Womit ich letztendlich fertig bin, ist irgendwie kompliziert, aber scheint solide. Jedes Mal, wenn ich Text zu meinem Dokument hinzufüge, was ich bis jetzt getan hatte, indem ich einfach eine neue Phrase erstellte, nummeriere ich zuerst jedes Zeichen in der Zeichenkette und rufe BaseFont.CharExists() auf. Wenn die Antwort für ein beliebiges Zeichen falsch ist, teile ich den Text in Abschnitte auf, basierend auf kontinuierlichen Sequenzen von CharExists(), die wahr oder falsch sind. Für die Brocken, die in Helvetica existieren, erstelle ich einen Chunk in Helvetica, und die anderen erzeuge einen Chunk in Arial und setze diese Chunks in meine Phrase zusammen.

Der Grund, warum ich dies tue (was wahrscheinlich für die meisten Leser offensichtlich ist, aber nur für den Fall) ist, dass ich die Arial-Schriftart nicht immer zu meinen PDF-Dateien hinzufügen möchte (um die Größe niedrig zu halten) und 95 % meiner Dokumente enthalten keine Zeichen wie Omega, für die Arial erforderlich wäre. Auf diese Weise füge ich nur die Arial-Schriftart zu den wenigen Dokumenten hinzu, die sie tatsächlich benötigen.

Phrase phrase = null; 
string s = ""; 
for (int i = 0 ; i < text.Length ; i++) 
{ 
    char c = text[i]; 
    if (fonts.Regular.BaseFont.CharExists(c)) 
     s += c; // Accumulate Helvetica characters in 's' 
    else 
    { 
     // Try adding the Arial font 
     iTextSharp.text.Font arial = fonts.Arial;  // Creates the Arial font and adds it to the document if not already there 
     if (arial == null) 
     { 
     Debug.WriteLine(" Arial font not found"); 
     s += c; 
     } 
     else if (!arial.BaseFont.CharExists(c)) 
     { 
     Debug.WriteLine(" Arial does not contain the required glyph"); 
     s += c; 
     } 
     else 
     { 
     // We have a character that Helvetica doesn't have, that Arial does 
     if (phrase == null) 
     { 
      // This is the first time we've realize that we need a split phrase 
      if (s.Length > 0) 
      { 
       // There was Helvetica text before the Arial character. 
       phrase = new Phrase(s, fonts.Regular); 
       // This code assumes that non-Helvetica characters generally come singly 
       phrase.Add(new Chunk(c, arial)); 
       s = ""; 
      } 
      else 
      { 
       // The Arial character is the first one in the string 
       phrase = new Phrase(new Chunk(c, arial)); 
      } 
     } 
     else 
     { 
      // This is not the first Arial character in the string 
      if (s != "") 
      { 
       // There were Helvetica characters before this Arial character 
       phrase.Add(new Chunk(s, fonts.Regular); 
       s = ""; 
      } 
      phrase.Add(new Chunk(c, arial)); 
     } 
     } 
    } 
} 

if (phrase == null) 
{ 
    // We did not encounter any Arial characters, create a simple Phrase 
    phrase = new Phrase(text, fonts.Regular); 
} 
else if (s.Length > 0) 
{ 
    // There were Helvetica characters at the end of the string, add them now 
    phrase.Add(new Chunk(s, fonts.Regular)); 
}