使用Java PDFBox库编写俄语PDF

我正在使用一个名为PDFBoxJava库,试图将文本写入PDF.它适用于英文文本,但是当我试图在PDF中写俄文文本时,这些信件看起来很奇怪.看来问题是在使用的字体,但我不太确定,所以我希望如果有人可以指导我通过这个.这里是重要的代码行:
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

解决方法

长的故事是这样的 – 为了以TrueType字体从PDF中输出unicode,输出必须包含大量详细和看似多余的信息.它归结为是 – 在TrueType字体内,字形存储为字形ids.这些字形与特定的unicode字符相关联(和IIRC,unicode字形内部可以指几个代码点,如é指e和尖锐的重音 – 我的记忆是朦胧的).除了表示存在从字符串中的UTF16BE值到TrueType字体中的字形ids以及从UTF16BE值到Unicode的映射(即使是标识)的映射之外,PDF还没有真正具有unicode支持.

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

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...