簡體   English   中英

java:將字符串轉換為希臘字符

[英]java: translating string to greek characters

TD:DR,跳至EDIT5。

我正在嘗試通過iText將一些希臘文字寫成pdf形式。 我正在從數據庫中檢索字符串,該字符串在希臘文中,但是當我嘗試將其打印為pdf形式時,它什么也沒顯示(pdf也是希臘文字)。 我已經嘗試了幾乎所有找到的內容,在這里,在iText論壇中都一樣。

如您所見,字符串在希臘語中:

如您所見,字符串在希臘語中

但未寫入pdf:

但它沒有寫進pdf

編輯:

我忘了如何努力實現這一目標。 將字符串轉換為字節數組,然后再編碼回去,這是我能做的最接近的操作之一。 可悲的是,沒有太多代碼要顯示。 如之前所言,我有一個字符串qich,其中顯示了dfata,然后在將其打印到pdf格式的托盤中時,使用諸如form.getField("municipality").setValue(municipio);這樣的語句form.getField("municipality").setValue(municipio); 輸出再次如圖所示。

編輯2:

使用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);

編輯3:

插入以下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創建的。

編輯4:

好的,所以現在只有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);

Sitll沒有打印結果。

編輯5-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);   

非ASCII符號的編碼取決於字體。 您應該尋找一種支持希臘符號的字體。 如果您使用IText中的主要字體之一,則不會有任何麻煩。 如果不是,則應按照IText手冊中所述嵌入字體。

附:您應該使用自己的代碼,工作量和版本。

好吧,當所有其他方法都失敗時,您可以將希臘字符串轉換為unicode序列,然后將其發送。 然后,您將確定要發送的是希臘字符字符串,如果問題仍然存在,則可以正確顯示它,而不是內容。 我編寫了一個名為MgntUtils的開源Java庫,該庫具有可將任何String轉換為unicode序列,反之亦然的實用程序。 您要做的就是:

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

它將返回字符串"\H\e\l\l\o\ \W\o\r\l\d"

對於包括特殊字符在內的任何語言的任何String而言,同樣適用。 這是文章開放源Java庫的鏈接,該庫具有堆棧跟蹤過濾,Silent String解析Unicode轉換器和版本比較 ,說明了該庫及其獲取位置(可在Maven Centralgithub上找到 。在本文中搜索以下段落: “字符串Unicode轉換器”

最后,我做到了! Jus wanto感謝每個人在此過程中提供的幫助。

我不確定問題出在哪里,可能有時候無法解決我最初的問題。 現在可以通過以下方式解決:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM