2009-11-13 5 views
12

Ho una tabella nella pagina di asp.net, e cercando di esportare come file PDF, ho paio di caratteri internazionali che non sono visualizzati nel file PDF generato, qualche suggerimento,iTextSharp testo internazionale

Grazie a advance

risposta

0

Si può provare a impostare la codifica per il carattere che si sta utilizzando. In Java sarebbe qualcosa del genere:

BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.EMBEDDED); 

dove BaseFont.CP1252 è la codifica. Prova a cercare la codifica esatta di cui hai bisogno per visualizzare i caratteri.

+0

Questo non funziona per me. Stavo cercando di stampare simboli greci come mu e sigma in un documento inglese (font romano). Credo che i caratteri interni non supportino le lettere greche, indipendentemente dalla codifica. –

+0

Non funziona anche per me. – Jovica

16

Il tasto per la visualizzazione corretta di set di caratteri alternativi (russo, cinese, giapponese, ecc.) Consente di utilizzare la codifica IDENTITY_H durante la creazione di BaseFont.

Dim bfR As iTextSharp.text.pdf.BaseFont 
    bfR = iTextSharp.text.pdf.BaseFont.CreateFont("MyFavoriteFont.ttf", iTextSharp.text.pdf.BaseFont.IDENTITY_H, iTextSharp.text.pdf.BaseFont.EMBEDDED) 

IDENTITY_H fornisce supporto Unicode per il carattere scelto, così si dovrebbe essere in grado di visualizzare praticamente qualsiasi carattere. L'ho usato per il russo, il greco e tutte le diverse lettere in lingua europea.

EDIT - 2013-mag-28

Questo funziona anche per v5.0.2 di iTextSharp.

EDIT - 2015-Giugno-23

Dato che segue è un esempio completo di codice (in C#):

private void CreatePdf() 
{ 
    string testText = "đĔĐěÇøç"; 
    string tmpFile = @"C:\test.pdf"; 
    string myFont = @"C:\<<valid path to the font you want>>\verdana.ttf"; 
    iTextSharp.text.Rectangle pgeSize = new iTextSharp.text.Rectangle(595, 792); 
    iTextSharp.text.Document doc = new iTextSharp.text.Document(pgeSize, 10, 10, 10, 10); 
    iTextSharp.text.pdf.PdfWriter wrtr; 
    wrtr = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, 
     new System.IO.FileStream(tmpFile, System.IO.FileMode.Create)); 
    doc.Open(); 
    doc.NewPage(); 
    iTextSharp.text.pdf.BaseFont bfR; 
    bfR = iTextSharp.text.pdf.BaseFont.CreateFont(myFont, 
    iTextSharp.text.pdf.BaseFont.IDENTITY_H, 
    iTextSharp.text.pdf.BaseFont.EMBEDDED); 

    iTextSharp.text.BaseColor clrBlack = 
     new iTextSharp.text.BaseColor(0, 0, 0); 
    iTextSharp.text.Font fntHead = 
     new iTextSharp.text.Font(bfR, 12, iTextSharp.text.Font.NORMAL, clrBlack); 

    iTextSharp.text.Paragraph pgr = 
     new iTextSharp.text.Paragraph(testText, fntHead); 
    doc.Add(pgr); 
    doc.Close(); 
} 

Questo è uno screenshot del file PDF che viene creato:

sample pdf

Un punto importante da ricordare è che se il font che hai scelto non supporta i personaggi che stai cercando di inviare al file pdf, nulla che fai in iTextSharp cambierà quello. Verdana mostra bene i personaggi di tutti i caratteri europei che conosco. Altri caratteri potrebbero non essere in grado di visualizzare tutti i caratteri.

+0

Il secondo argomento di BaseFont.CreateFont() è la codifica. E "Identity-H" non è un nome di codice di codifica valido, ne sei sicuro? –

+0

@ManitraAndriamitondra, valido per iTextSharp v4.1.2. Non l'ho usato da un po ', quindi non sono sicuro se questo è ancora valido per qualunque sia la versione corrente. – Stewbob

+0

Devi specificare il percorso completo del file di font. Non è possibile utilizzare i caratteri interni. Se si desidera utilizzare Helvetica 12, ad esempio, è necessario specificare 'BaseFont.CreateFont (" C: \ Windows \ Fonts \ Ariel.ttf ", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)'. Se si utilizza il carattere interno (ad esempio BaseFont.HELVETICA), si otterrà che "Identity-H" non è un nome di corpo di codifica valido. –

5

Ci sono due possibili ragioni caratteri non vengono resi:

  1. La codifica. Come ha sottolineato Stewbob, Identity-H è un ottimo modo per evitare completamente il problema, anche se richiede di incorporare un sottoinsieme del font. Questo ha due conseguenze.
    1. Aumenta la dimensione del file un po 'rispetto ai caratteri non incorporati.
    2. Il font deve essere concesso in licenza per i sottoinsiemi incorporati. La maggior parte sono, alcuni non lo sono.
  2. Il carattere deve contenere quel carattere. Se chiedi delle legature arabe con un carattere cirillico (russo), non ci sono buone probabilità che sia lì. Ci sono pochissimi tipi di carattere che coprono una varietà di lingue e tendono ad essere ENORME. Il font più grande/completo che ho incontrato è "Arial Unicode MS". Oltre 23 megabyte.

Questa è un'altra buona ragione per richiedere l'incorporamento di SUBSET.Tacking su alcuni megabyte perché volevi aggiungere un paio di glifi cinesi è un po 'ripido.

Se ti senti paranoico, puoi controllare le tue stringhe contro una determinata istanza di BaseFont (che a mio avviso tiene conto anche della codifica) con myBaseFont.charExists(someChar). Se hai un font di cui ti fidi, non mi preoccuperei.

PS: C'è un'altra buona ragione per cui Identity-H richiede un sottoinsieme incorporato. Identity-H legge i byte dal flusso di contenuti come gli indici di glifi. L'ordine dei glifi può variare da un font all'altro, o anche tra versioni dello stesso font. Affidarsi a un sistema di visualizzatori per avere lo stesso font ESATTO è una cattiva idea, quindi è illegale ... in particolare quando Acrobat/Reader inizia a sostituire i font perché non riesce a trovare il font esatto che hai richiesto e non lo hai incorporato. .

0

E 'causato da font predefinito iTextSharp - Helvetica - che non supporta diverso da caratteri di base (o non supportare tutti gli altri personaggi

In realtà ci sono 2 opzioni:

  1. uno è quello di riscrivere la il contenuto della tabella a mano nel codice. Questo approccio potrebbe sembrare più veloce, ma richiede anche la modifica della tabella originale nel codice (interruzione del principio DRY). In questo caso, puoi facilmente impostare il font come desideri
  2. L'altro è per estrarre il PDF da HTML estratto da Ht mlEngine. Questo potrebbe sembrare un po 'più complicato e complesso (ed è), tuttavia, la soluzione di lavoro è molto più flessibile e universale. Ho sofferto la lotta con personaggi speciali io solo poco fa e ho deciso di pubblicare una soluzione alquanto completa con altre soluzioni simili qui su stackoverflow: https://stackoverflow.com/a/24587745/1138663