使用Java PDFBox库编写俄语PDF

前端之家收集整理的这篇文章主要介绍了使用Java PDFBox库编写俄语PDF前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用一个名为PDFBoxJava库,试图将文本写入PDF.它适用于英文文本,但是当我试图在PDF中写俄文文本时,这些信件看起来很奇怪.看来问题是在使用的字体,但我不太确定,所以我希望如果有人可以指导我通过这个.这里是重要的代码行:
  1. PDTrueTypeFont font = PDTrueTypeFont.loadTTF( pdfFile,new File( "fonts/VREMACCI.TTF" ) ); // Windows Russian font imported to write the Russian text.
  2. font.setEncoding( new WinAnsiEncoding() ); // Define the Encoding used in writing.
  3. // Some code here to open the PDF & define a new page.
  4. contentStream.drawString( "отделом компьютерной" ); // Write the Russian text.

WinAnsiEncoding源代码是:Click here

———————编辑于2009年11月18日

经过一番调查,我现在确定这是一个编码问题,这可以通过使用有帮助的PDFBox类名为DictionaryEncoding定义我自己的编码来解决.

我不知道如何使用它,但这里是我迄今为止所尝试的:

  1. COSDictionary cosDic = new COSDictionary();
  2. cosDic.setString( COSName.getPDFName("Ercyrillic"),"0420 " ); // Russian letter.
  3. 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

我自己的工具中的一个单元测试的输出如下所示:

  1. 13 0 obj
  2. <<
  3. /BaseFont /DejaVuSansCondensed
  4. /DescendantFonts [ 4 0 R ]
  5. /ToUnicode 14 0 R
  6. /Type /Font
  7. /Subtype /Type0
  8. /Encoding /Identity-H
  9. >> endobj
  10.  
  11. 14 0 obj
  12. << /Length 346 >> stream
  13. /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo <<
  14. /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS
  15. def /CMapType 2 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 1
  16. beginbfrange <0000> <FFFF> <0000> endbfrange endcmap CMapName currentdict /CMap
  17. defineresource pop end end

endstream%请注意,流的格式是错误

>一个子类型CIDFontTYpe2的字体字典

> CIDSsytemInfo
>一个FontDescriptor
> DW和W
>将CIDToGIDMap映射到字符ID到字形ID

这是同一测试中的一个 – 这是DescendantFonts数组中的对象:

  1. 4 0 obj
  2. <<
  3. /Subtype /CIDFontType2
  4. /Type /Font
  5. /BaseFont /DejaVuSansCondensed
  6. /CIDSystemInfo 8 0 R
  7. /FontDescriptor 9 0 R
  8. /DW 1000
  9. /W 10 0 R
  10. /CIDToGIDMap 11 0 R
  11. >>
  12.  
  13. 8 0 obj
  14. <<
  15. /Registry (Adobe)
  16. /Ordering (UCS)
  17. /Supplement 0
  18. >>
  19. endobj

为什么我这么说?它与PDFBox有什么关系?只是这样:PDF中的Unicode输出是坦率地说,在对接的皇家痛苦. Acrobat是在Unicode之前开发的,从开始就没有Unicode的CJK编码是痛苦的(我知道 – 我在Acrobat上工作).后来的Unicode支持添加,但它真的感觉像是被压抑了.人们希望您只是说/ Encoding / Unicode,并且具有以刺和y-脱离字符开始的字符串,而不用你去.没有这样的运气.如果您没有将每个细节(真正的Acrobat,嵌入PostScript程序转换为Unicode?WTH?),您将在Acrobat中获得空白页面.我发誓,我没有这样做.

在这一点上,我为一个单独的公司(.NET现在,所以它不会帮助你)编写PDF生成工具,并且我做了一个隐藏所有这些废话的设计目标.所有文字都是unicode – 如果你只使用那些与WinAnsi相同的字符代码,那就是你所得到的.使用其他任何东西,你会得到所有这些其他的东西.如果PDFBox可以为您工作,我会感到惊讶 – 这是一个严重的麻烦.

猜你在找的Java相关文章