使用PDFBox将UTF-8编码的字符串写入PDF

问题描述:

我无法使用PDFBox将unicode字符写入PDF。以下是一些生成垃圾字符而不是输出“š”的示例代码。我可以添加什么来获得对UTF-8字符串的支持?使用PDFBox将UTF-8编码的字符串写入PDF

PDDocument document = new PDDocument(); 
PDPage page = new PDPage(); 
document.addPage(page); 
PDPageContentStream contentStream = new PDPageContentStream(document, page); 

PDType1Font font = PDType1Font.HELVETICA; 
contentStream.setFont(font, 12); 
contentStream.beginText(); 
contentStream.moveTextPositionByAmount(100, 400); 
contentStream.drawString("š"); 
contentStream.endText(); 
contentStream.close(); 
document.save("test.pdf"); 
document.close(); 

您正在使用随Adobe Reader一起提供的内置“Base 14”字体之一。这些字体不是Unicode;它们实际上是一个标准的拉丁字母,尽管有一些额外的字符。它看起来像你提到的字符,小写字母s带有一个caron(š),不可用PDF拉丁文...虽然大写Š可用,但在Windows上很好奇。有关详细信息,请参见http://www.adobe.com/devnet/pdf/pdf_reference.html的PDF规范的附录D.

无论如何,如果你想使用Unicode字符,你需要嵌入一个Unicode字体。确保你被授权嵌入你决定的任何字体......我可以推荐开源的GentiumDoulos字体,因为它们是免费的,高质量的并且有全面的Unicode支持。

+0

感谢您的信息。我尝试嵌入Gentium字体,但打开PDF时出现以下错误信息“字体'Gentium'包含坏/宽度”。我试图嵌入其他ttf文件,并得到相同的消息。我用PDTrueTypeFont font = PDTrueTypeFont.loadTTF(文档,“GenR102.TTF”)替换字体行; – 2011-03-25 17:37:54

+0

我确信我曾经遇到过这个问题......我记不起来了,但我认为这可能是一个不兼容的编码问题。换句话说,PDFBox可能会认为字体是拉丁字体而不是Unicode字体。尝试使用'font.setEncoding(...)'设置编码,并参阅http://*.com/questions/1713751/using-java-pdfbox-library-to-write-russian-pdf获取关于'setEncoding( )' – gutch 2011-03-28 03:06:05

+2

我切换到iText。使用Unicode来显示Unicode字符已经很容易了。 – 2011-03-29 16:20:21