- 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可以为您工作,我会感到惊讶 – 这是一个严重的麻烦.