Itext PDF se nezobrazí správně Myanmar Unicode Font

hlasů
4

Itext 5 se nezobrazuje správně v generovaném souboru PDF pro fonty Myanmar Unicode .

Itextová verze : 5.5.13.1

Výsledek očekávání : သီဟိုဠ် မှ ဉာဏ် ကြီး ရှင် သည် အာယု ဝဎ္ န န ဆေး ညွှန်း ကို ကို ဇလွန် ဘေး ဗာ ဒံ ပင် ထက် အဓိဋ္ဌာန် လျက် ဂဃနဏ ဖတ် ဖတ် ခဲ့သည်။

Skutečný výsledek :

zde

Google Drive Link pro vygenerovaný PDF.

Můj testovací řetězec je podobný anglickému textu „Rychlý skok hnědá liška přes líného psa“. Obsahuje většinu barmských abeced.

Java program, který jsem použil k produkci nad pdf

    String fileName = sample.pdf;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        Document doc = new Document();
        PdfWriter writer = PdfWriter.getInstance(doc, baos);
        writer.setCloseStream(false);

        BaseFont unicode = BaseFont.createFont(/fonts/NotoSansMyanmar-Regular.ttf, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font myanmarUniCodeFont = new Font(unicode, 11, Font.NORMAL, BaseColor.BLACK);
        Rectangle pageSize = new Rectangle(PageSize.A4);
        doc.setPageSize(pageSize);
        doc.open();
        String textStr = သီဟိုဠ်မှ ဉာဏ်ကြီးရှင်သည်အာယုဝဎ္ဍနဆေးညွှန်းစာကို ဇလွန်ဈေးဘေးဗာဒံပင်ထက် အဓိဋ္ဌာန်လျက် ဂဃနဏဖတ်ခဲ့သည်။;
        doc.add(new Paragraph(textStr, myanmarUniCodeFont));
        doc.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }

    response.setCharacterEncoding(StandardCharsets.UTF_8.name());
    response.setHeader(Cache-Control, no-cache,no-store,max-age=0);
    response.setHeader(Pragma, No-cache);
    response.setHeader(Content-Disposition, inline; filename= + fileName);
    response.setContentType(application/pdf);
    response.setContentLength(baos.size());
    OutputStream os = response.getOutputStream();
    baos.writeTo(os);
    os.flush();
    os.close();
    baos.close();

Ouputové texty jsou správné (můžete je zkopírovat a vložit do textových editorů, jako je Poznámkový blok a zobrazit výsledek), ale nesprávné zobrazení v souboru PDF.

Co udělat, abych správně zobrazil písmo Myanmar Unicode pomocí itext-pdf-5?

Nyní používám špinavý způsob, jak vidět písma čitelná. Převedl jsem všechny řetězce Unicode na "Zawgyi Font" (Toto je další písmo Myanmaru a neměli bychom ho nikdy používat .) A vložit do pdf. Toto není dobré řešení a nemůžeme slíbit, že všechny unicody jsou správně převedeny na řetězec písma Zawgyi-One a nechci převádět texty Unicode na nestandardní texty. Proto nechci používat tento způsob.

Položena 15/05/2020 v 10:08
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

(Úplné zveřejnění: Pracuji pro software iText.)

iText 5 nepodporuje správné zpracování systému Myanmar pro psaní založené na Unicode. Přestože iText 5 má specifickou implementaci pro arabštinu, inherentní omezení jeho infrastruktury písma brání podpoře funkcí písma, které jsou potřebné pro různé jiné systémy psaní.

iText 7 to vylepšuje díky nové implementaci písma a volitelnému modulu (pdfCalligraph, ne open source) pro podporu různých systémů psaní. Myanmar však (zatím) není podporován.

Odpovídající kód iText 7 vypadá takto:

PdfWriter writer = new PdfWriter(baos);
PdfDocument pdfdoc = new PdfDocument(writer);
Document doc = new Document(pdfdoc);

PdfFont f = PdfFontFactory.createFont("/fonts/NotoSansMyanmar-Regular.ttf",
    PdfEncodings.IDENTITY_H, true);

String textStr =
    "သီဟိုဠ်မှ ဉာဏ်ကြီးရှင်သည်အာယုဝဎ္ဍနဆေးညွှန်းစာကို ဇလွန်ဈေးဘေးဗာဒံပင်ထက် အဓိဋ္ဌာန်လျက် ဂဃနဏဖတ်ခဲ့သည်။";
// Explicit writing system
//doc.add(new Paragraph(textStr).setFont(f).setFontScript(Character.UnicodeScript.MYANMAR));
// Rely on autodetection
doc.add(new Paragraph(textStr).setFont(f));
doc.close();

Bez ohledu na to, zda je pdfCalligraph používán nebo ne, je vykreslování stále chybné:

Špatné vykreslení Myanmaru

Pokud je pro vás možnost komerční licence, odešlete prosím tuto žádost o funkci. Další psací systémy jsou stále aktivně přidávány. Pokud ne, obávám se, že to nebude možné s iText a budete muset najít jiné řešení.

Odpovězeno 25/05/2020 v 23:56
zdroj uživatelem

hlasů
0

Také jsem čelil stejnému problému. Ale s iTextem jsem použil tymián. Používám balíček písem ttf jazyka (nikoli unicode) a pomocí převaděče převádím unicode do mého jazyka a připojuji jej do PDF jako normální řetězec. funguje to jako kouzlo. pokud máte možnost použít tymián, zkuste tento přístup.

umístit pod značku CSS pod značku stylu.

@font-face {
    font-family: 'myfont-family';
    src: url('/fonts/myfont.ttf');
    -fs-pdf-font-embed: embed;
    -fs-pdf-font-encoding: Identity-H;
}

.mylanguage{
    font-family: 'myfontfamily';
}

<p class="mylanguage">your converted font text</p>

Java kód pro generování pdf.

context.setVariable("myvariable", myvariable);
String html = templateEngine.process("mypdf", context);
html = templateEngine.process("mythymeleaf", context);
String fileName = "myfile.pdf";
PDFEncryption pdfEncryption  = new PDFEncryption();
String password = "0000";
pdfEncryption.setUserPassword(password.getBytes());

ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.setPDFEncryption(pdfEncryption);
renderer.createPDF(outputStream);
outputStream.flush();
outputStream.close();
Odpovězeno 25/05/2020 v 15:04
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more