Utilisation de la bibliothèque Java PDFBox pour écrire un PDF en russe
Je suis l'aide d'une bibliothèque Java appelé PDFBox essaie d'écrire du texte dans un fichier PDF. Il fonctionne parfaitement pour le texte anglais, mais quand j'ai essayé d'écrire du texte russe à l'intérieur de la PDF les lettres semblait si étrange. Il semble que le problème est dans la police de caractères utilisée, mais je ne suis pas sûr à ce sujet, alors j'espère que si quelqu'un pouvait me guider à travers ce. Ici est le plus important de lignes de code :
PDTrueTypeFont font = PDTrueTypeFont.loadTTF( pdfFile, new File( "fonts/VREMACCI.TTF" ) ); //Windows Russian font imported to write the Russian text.
font.setEncoding( new WinAnsiEncoding() ); //Define the Encoding used in writing.
//Some code here to open the PDF & define a new page.
contentStream.drawString( "отделом компьютерной" ); //Write the Russian text.
La WinAnsiEncoding code source est : Cliquez ici
--------------------- Modifier le 18 novembre 2009
Après quelques recherches, je suis maintenant sûr que c'est un problème d'Encodage, ce pourrait être résolu par la définition de mon propre Codage à l'aide de l'PDFBox classe appelée DictionaryEncoding.
Je ne suis pas sûr de la façon de l'utiliser, mais voici ce que j'ai essayé jusqu'à maintenant :
COSDictionary cosDic = new COSDictionary();
cosDic.setString( COSName.getPDFName("Ercyrillic"), "0420 " ); //Russian letter.
font.setEncoding( new DictionaryEncoding( cosDic ) );
Cela ne fonctionne pas, comme il semble que je suis en remplissant le dictionnaire dans un mauvais sens, quand j'écris une page PDF à l'aide de cela, il apparaît vide.
La DictionaryEncoding code source est : Cliquez ici
source d'informationauteur Brad
Vous devez vous connecter pour publier un commentaire.
La longue histoire est en ordre à faire l'unicode sortie en format PDF à partir d'une police TrueType, la sortie doit inclure une tonne de détails en apparence les informations superflues. Ce qui me vient à l'intérieur d'une police TrueType les glyphes sont stockés en tant que glyphe id. Ces glyphes id sont associés à un caractère unicode (et autant que je me souvienne, une unicode glyphe en interne peut se référer à plusieurs points de code - comme é se référant à l'e et d'un accent aigu - ma mémoire est floue). PDF n'a pas vraiment de support de l'unicode autre que de dire qu'il existe une correspondance entre UTF16BE valeurs dans une chaîne de glyphes id dans une police TrueType ainsi qu'une cartographie de l'UTF16BE valeurs Unicode - même si c'est de l'identité.
La sortie d'un de mes tests unitaires sur mes propres outils ressemble à ceci:
endstream % il est à noter que le formatage est mauvais pour le flux
Ici est celui de la même test - c'est l'objet de la DescendantFonts tableau:
Pourquoi je vous raconte tout cela? Que faut-il avoir à faire avec PDFBox? Juste ceci: Unicode de sortie au format PDF est, franchement, une douleur royale dans le cul. Acrobat a été développé avant il y avait Unicode et c'était douloureux de le commencer à avoir des CJK encodages sans Unicode (je sais - j'ai travaillé sur Acrobat). Plus tard, support de l'Unicode a été ajouté, mais il a vraiment l'impression que c'était, sur. On espère que vous dirais simplement //Encodage Unicode et des chaînes qui commencent avec l'épine et y-la diérèse caractères et vous partez. Pas de chance. Si vous ne mettez pas dans tous détaillée de la chose (et vraiment, Acrobat, l'incorporation d'un programme PostScript à traduire en Unicode? WTH?), vous obtenez une page blanche dans Acrobat. Je vous jure, je ne fais pas cela.
À ce point, j'écris la génération de PDF outils pour une société distincte (.NET en ce moment, donc il ne vous aide pas), et je me suis fait un objectif de conception pour cacher tout ce non-sens. Tout le texte est en unicode si vous ne l'utilisez ces codes de caractères qui sont les mêmes d'un WinAnsi, c'est ce que vous obtenez sous le capot. Utiliser autre chose, vous obtenez tous ces trucs-là avec elle. Je serais surpris si PDFBox cela fonctionne pour vous - c'est un grave souci.
Peut-être le russe, le codage de la classe doivent être écrites, il devrait ressembler à la WinAnsiEncodingje suppose.
Maintenant, je n'ai aucune idée de quoi mettre là!
Ou, si ce n'est pas ce que vous faites déjà, peut-être vous devez encoder votre fichier source au format UTF-8 et l'utilisation d'un codage par défaut.
J'ai vu quelques messages d'liées à des problèmes avec l'extraction de texte russe à partir de fichiers PDF existants (à l'aide de PDFBox bien sûr) mais je ne sais pas si la sortie est reliée.
Vous pouvez également écrire à l'PDFBox liste de diffusion.
Essayez d'utiliser cette construction:
La solution est très Simple.
1) Vous devez trouver les polices compatibles avec les caractères que vous souhaitez afficher.
2) Télécharger localement l' .ttf fichier de polices.
3) le Chargement de polices à partir de votre application
Par Exemple c'est ce que vous avez à faire dans le cas où vous souhaitez utiliser des caractères grecs:
Juste essayer celui-ci:
Phrase leftTitle = new membre de Phrase("САНКТ-ПЕТЕРБУРГ", FontFactory.getFont("Tahoma", "Cp1251", true, 25));
Cela fonctionne au moins avec la dernière (5.0.1) iText