TD:DR,跳至EDIT5。
我正在尝试通过iText将一些希腊文字写成pdf格式。我正在从数据库中检索字符串,该字符串在希腊文中,但是当我尝试将其打印为pdf形式时,它什么也没显示(pdf也是希腊文字)。我已经尝试了几乎所有找到的内容,在这里,在iText论坛中也是如此。
如您所见,字符串在希腊语中:
但未写入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);
答案 0 :(得分:0)
非ASCII符号的输入取决于字体。您应该寻找一种支持希腊符号的字体。如果您使用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 central和github上都可用。在本文中搜索以下段落:“ 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);