java:将字符串翻译为希腊字符

时间:2018-07-23 12:31:07

标签: java character-encoding itext

TD:DR,跳至EDIT5。

我正在尝试通过iText将一些希腊文字写成pdf格式。我正在从数据库中检索字符串,该字符串在希腊文中,但是当我尝试将其打印为pdf形式时,它什么也没显示(pdf也是希腊文字)。我已经尝试了几乎所有找到的内容,在这里,在iText论坛中也是如此。

如您所见,字符串在希腊语中:

as you can see, the string is in greek

但未写入pdf:

but it is not written into the pdf

编辑:

我忘记了如何实现这一目标。将字符串转换为字节数组,然后再编码回去,这是我能做的最接近的操作之一。可悲的是,没有太多代码要显示。如之前所言,我有一个字符串qich,其中显示了dfata,然后在将其打印到pdf形式并带有form.getField("municipality").setValue(municipio); 这样的句子时,再次显示了输出。

EDIT2:

使用itext 7.0.4,现在我们无法创建字体,因为baseforn或字体类也不会被识别为itext类。

import com.itextpdf.*;
...

final String f = "resources/fonts/FreeSans.ttf";
Font font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
...
form.getField("municipality").setValue(municipio);

EDIT3:

在插入以下maven依赖项之后,现在我可以使用de basefonts类:

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.10</version>
</dependency>


float fontSize = (float) 10.0;  
PdfFont font = null;
final String f = (String) VarGlobales.getHTTPApplication().get("ruta.fuentes") + "/FreeSans.ttf";  
    try {
        font = PdfFontFactory.createFont(f, true);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }  
PdfReader pdfReader = null;
try {
    pdfReader = new PdfReader(new FileInputStream(
            (String) VarGlobales.getHTTPApplication().get("ruta.tenderForms") + "/" + tenderFormFile));
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();           
PdfWriter pdfWriter = new PdfWriter(baos);
PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
form.getField("municipality").setValue(municipio, font, fontSize);

但是,该字符串再一次没有被涂漆。我使用正确吗?

仅供参考,以pdf格式创建的字段是通过Adobe Acrobat 9创建的。

EDIT4:

好,所以现在只有iText7

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>root</artifactId>
    <version>7.1.2</version>
    <type>pom</type>
  </dependency>
  <dependency>
  <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.1.2</version>
    <type>pom</type>
  </dependency>             
  <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>kernel</artifactId>
    <version>7.1.2</version>
  </dependency>
  <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>forms</artifactId>
    <version>7.1.2</version>
  </dependency>
  <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>layout</artifactId>
    <version>7.1.2</version>
  </dependency>
  <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>typography</artifactId>
    <version>2.0.0</version>
  </dependency>

以及创建字体和托盘更改字体的方式

final String rutaFuente = (String) VarGlobales.getHTTPApplication().get("ruta.fuentes") + "/FreeSans.ttf";  
try {
    font = PdfFontFactory.createFont(rutaFuente, "Cp1250", true);
    normalFont = PdfFontFactory.createFont("C:\\Windows\\Fonts\\arial.ttf", PdfEncodings.IDENTITY_H);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}       
    PdfReader pdfReader = null;
    try {
    pdfReader = new PdfReader(new FileInputStream((String)VarGlobales.getHTTPApplication().get("ruta.tenderForms") + "/" + tenderFormFile));
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();           
PdfWriter pdfWriter = new PdfWriter(baos);
PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);   
form.getField("district").setFont(normalFont);      
form.getField("district").setValue(distrito);

没有打印结果。

EDIT5-TL:DR:

最后,我做到了! Jus wanto感谢每个人在此过程中提供的帮助。

我不确定问题出在哪里,可能有时候无法解决我最初的问题。现在,它可以通过以下方式解决:

normalFont = PdfFontFactory.createFont("C:\\Windows\\Fonts\\arial.ttf", PdfEncodings.IDENTITY_H);
...
form.getField("district").setFont(normalFont);          
form.getField("district").setValue(distrito);   

3 个答案:

答案 0 :(得分:0)

非ASCII符号的输入取决于字体。您应该寻找一种支持希腊符号的字体。如果您使用IText中的主要字体之一,则不会有任何麻烦。如果没有,您应该嵌入 IText手册中描述的字体。

Ps:您应该使用自己的代码,精力和版本。

答案 1 :(得分:0)

好吧,当所有其他方法都失败时,您可以将希腊字符串转换为unicode序列,然后将其发送。然后,您将确定要发送的是希腊字符字符串,如果问题仍然存在,则可以正确显示它,而不是内容。我编写了一个名为MgntUtils的开源Java库,该库具有可将任何String转换为unicode序列,反之亦然的实用程序。您所要做的就是:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Hello world");

它将返回字符串"\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"

这对于任何语言(包括特殊字符)的任何String都适用。这里是文章Open Source Java library with stack trace filtering, Silent String parsing Unicode converter and Version comparison的链接,该文章说明了库及其获取位置(在Maven centralgithub上都可用。在本文中搜索以下段落:“ String Unicode转换器”

答案 2 :(得分:0)

最后,我做到了! Jus wanto感谢每个人在此过程中提供的帮助。

我不确定问题出在哪里,可能有时候无法解决我最初的问题。现在,它可以通过以下方式解决:

normalFont = PdfFontFactory.createFont("C:\\Windows\\Fonts\\arial.ttf", PdfEncodings.IDENTITY_H);
...
form.getField("district").setFont(normalFont);          
form.getField("district").setValue(distrito);