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.
WinAnsiEncoding源代码是:Click here
———————编辑于2009年11月18日
经过一番调查,我现在确定这是一个编码问题,这可以通过使用有帮助的PDFBox类名为DictionaryEncoding定义我自己的编码来解决.
我不知道如何使用它,但这里是我迄今为止所尝试的:
COSDictionary cosDic = new COSDictionary(); cosDic.setString( COSName.getPDFName("Ercyrillic"),"0420 " ); // Russian letter. font.setEncoding( new DictionaryEncoding( cosDic ) );
这不起作用,因为我似乎以错误的方式填写字典,当我用这个文本写一个PDF页面时,它显示为空白.
DictionaryEncoding源代码是:Click here
解决方法
> a类型为Type0的字体字典
>一个具有下面描述的条目的DescendantFonts数组
>将UTF16BE值映射为unicode的ToUnicode条目
>将一个编码设置为Identity-H
我自己的工具中的一个单元测试的输出如下所示:
13 0 obj << /BaseFont /DejaVuSansCondensed /DescendantFonts [ 4 0 R ] /ToUnicode 14 0 R /Type /Font /Subtype /Type0 /Encoding /Identity-H >> endobj 14 0 obj << /Length 346 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 1 beginbfrange <0000> <FFFF> <0000> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end
endstream%请注意,流的格式是错误的
>一个子类型CIDFontTYpe2的字体字典
> CIDSsytemInfo
>一个FontDescriptor
> DW和W
>将CIDToGIDMap映射到字符ID到字形ID
这是同一测试中的一个 – 这是DescendantFonts数组中的对象:
4 0 obj << /Subtype /CIDFontType2 /Type /Font /BaseFont /DejaVuSansCondensed /CIDSystemInfo 8 0 R /FontDescriptor 9 0 R /DW 1000 /W 10 0 R /CIDToGIDMap 11 0 R >> 8 0 obj << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> endobj
为什么我这么说?它与PDFBox有什么关系?只是这样:PDF中的Unicode输出是坦率地说,在对接的皇家痛苦. Acrobat是在Unicode之前开发的,从开始就没有Unicode的CJK编码是痛苦的(我知道 – 我在Acrobat上工作).后来的Unicode支持被添加,但它真的感觉像是被压抑了.人们希望您只是说/ Encoding / Unicode,并且具有以刺和y-脱离字符开始的字符串,而不用你去.没有这样的运气.如果您没有将每个细节(真正的Acrobat,嵌入PostScript程序转换为Unicode?WTH?),您将在Acrobat中获得空白页面.我发誓,我没有这样做.
在这一点上,我为一个单独的公司(.NET现在,所以它不会帮助你)编写PDF生成工具,并且我做了一个隐藏所有这些废话的设计目标.所有文字都是unicode – 如果你只使用那些与WinAnsi相同的字符代码,那就是你所得到的.使用其他任何东西,你会得到所有这些其他的东西.如果PDFBox可以为您工作,我会感到惊讶 – 这是一个严重的麻烦.