Itext PDF nie wyświetla poprawnie Myanmar Unicode Font

głosy
44

Itext 5 nie wyświetla się poprawnie w wygenerowanym pliku pdf dla czcionek Myanmar Unicode.

Wersja tekstowa : 5.5.13.1

Wynik oczekiwany : သီဟိုဠ်မှ ဉာဏ်ကြီးရှင်သည်အာယုဝဎ္ဍနဆေးညွှန်းစာကို ဇလွန်ဈေးဘေးဗာဒံပင်ထက် အဓိဋ္ဌာန်လျက် ဂဃနဏဖတ်ခဲ့သည်။

Rzeczywisty wynik

enter

Google Drive Link dla wygenerowanego pliku PDF.

Mój ciąg testowy jest podobny do The quick brown fox jump over the lazy dog w języku angielskim. Zawiera on większość alfabetów Myanmaru.

Program Java, którego używałem do produkcji powyżej 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();

Teksty wyjściowe są poprawne (możesz skopiować i wkleić do edytora tekstu takiego jak Notatnik i zobaczyć wynik), ale błędne wyświetlanie w pliku pdf.

Co należy zrobić, aby poprawnie wyświetlić Myanmar Unicode Font używając itext-pdf-5 ?

Teraz używam brudnego sposobu, żeby zobaczyć, że czcionki są czytelne. Przekonwertowałem wszystkie ciągi unicode na Czcionkę Zawgyi (Jest to kolejna czcionka z Myanmaru i nigdy nie powinniśmy jej używać) i osadziłem ją w pdf. To nie jest dobre rozwiązanie i nie możemy obiecać, że wszystkie unicode zostaną poprawnie przekonwertowane na łańcuch czcionki Zawgyi-One i nie chcę konwertować tekstów unicode na niestandardowe teksty. Dlatego nie chcę używać w ten sposób.

Utwórz 15/05/2020 o 10:08
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

(Pełne ujawnienie: pracuję dla iText Software)

iText 5 nie obsługuje prawidłowego przetwarzania opartego na Unicode systemu pisania Myanmar. Chociaż iText 5 posiada specyficzną implementację dla języka arabskiego, nieodłączne ograniczenia jego infrastruktury fontów uniemożliwiają obsługę funkcji fontów, które są potrzebne dla różnych innych systemów pisania.

iText 7 poprawia to dzięki nowej implementacji czcionek i opcjonalnemu modułowi (pdfCalligraph, nie open source) do obsługi różnych systemów zapisu. Jednak Myanmar nie jest (jeszcze) obsługiwany.

Odpowiedni kod iText 7 wygląda tak:

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();

Niezależnie od tego, czy pdfCalligraph jest używany, czy nie, renderowanie jest nadal błędne:

Wrong Myanmar rendering

Jeśli licencja komercyjna jest dla Państwa opcją, prosimy o przesłanie tego zapytania. Dodatkowe systemy zapisu są nadal aktywnie dodawane. Jeśli nie, obawiam się, że nie będzie to możliwe z iTextem i będziesz musiał znaleźć inne rozwiązanie.

Odpowiedział 25/05/2020 o 23:56
źródło użytkownik

głosy
0

Ja również stanąłem przed tym samym problemem. Ale użyłem thymeleaf z iTextem. Używam pakietu czcionek ttf języka (nie unicode) i używam konwertera do konwersji unicode na mój język i załączyć go do pliku PDF jako normalny ciąg znaków. to działa jak urok. jeśli masz możliwość użycia thymeleaf, spróbuj tego podejścia.

umieścić pod CSS wewnątrz znacznika 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>

Kod Java do wygenerowania 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();
Odpowiedział 25/05/2020 o 15:04
źródło użytkownik

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