unicode - पीडीएफ बॉक्स 2.0 पर truetype0font में यूनिकोड कैसे जोड़ें?



pdfbox glyph (1)

किसी फ़ॉन्ट में ToUnicode CMap स्ट्रीम जोड़ने के लिए यहां कुछ कोड दिए गए हैं। जाहिर है मैं इसे आपकी फ़ाइल के साथ नहीं कर सकता, इसलिए मैंने अपनी एक परीक्षण फ़ाइल का उपयोग किया, जिसे here पाया जा सकता here । मुझे प्रत्येक प्रविष्टि पर अलग से काम करना था और सभी को नहीं करना था। हालांकि परिणाम हरे रंग के प्रिंट ("बेडिंगुंगेन") में पहला शब्द निकालने के लिए पर्याप्त है।

परिदृश्य कुछ हद तक आपके अनुरूप है:

  • पहचान-एच प्रविष्टि
  • नो टूयुनोडे एंट्री
  • विशिष्ट फ़ॉन्ट नाम

    try (PDDocument doc = PDDocument.load(f))
    {
        for (int p = 0; p < doc.getNumberOfPages(); ++p)
        {
            PDPage page = doc.getPage(p);
            PDResources res = page.getResources();
            for (COSName fontName : res.getFontNames())
            {
                PDFont font = res.getFont(fontName);
                COSBase encoding = font.getCOSObject().getDictionaryObject(COSName.ENCODING);
                if (!COSName.IDENTITY_H.equals(encoding))
                {
                    continue;
                }
                // get real name
                String fname = font.getName();
                int plus = fname.indexOf('+');
                if (plus != -1)
                {
                    fname = fname.substring(plus + 1);
                }
                if (font.getCOSObject().containsKey(COSName.TO_UNICODE))
                {
                    continue;
                }
                System.out.println("File '" + f.getName() + "', page " + (p + 1) + ", " + fontName.getName() + ", " + font.getName());
                if (!fname.startsWith("Calibri-Bold"))
                {
                    continue;
                }
                COSStream toUnicodeStream = new COSStream();
                try (PrintWriter pw = new PrintWriter(toUnicodeStream.createOutputStream(COSName.FLATE_DECODE)))
                {
                    // "9.10 Extraction of Text Content" in the PDF 32000 specification
                    pw.println ("/CIDInit /ProcSet findresource begin\n" +
                            "12 dict begin\n" +
                            "begincmap\n" +
                            "/CIDSystemInfo\n" +
                            "<< /Registry (Adobe)\n" +
                            "/Ordering (UCS) /Supplement 0 >> def\n" +
                            "/CMapName /Adobe-Identity-UCS def\n" +
                            "/CMapType 2 def\n" +
                            "1 begincodespacerange\n" +
                            "<0000> <FFFF>\n" +
                            "endcodespacerange\n" +
                            "10 beginbfchar\n" + // number is count of entries
                            "<0001><0020>\n" + // space
                            "<0002><0041>\n" + // A
                            "<0003><0042>\n" + // B
                            "<0004><0044>\n" + // D
                            "<0013><0065>\n" + // e
                            "<0012><0064>\n" + // d
                            "<0017><0069>\n" + // i
                            "<001B><006E>\n" + // n
                            "<0015><0067>\n" + // g
                            "<0020><0075>\n" + // u
                            "endbfchar\n" +
                            "endcmap CMapName currentdict /CMap defineresource pop end end");
                }
                font.getCOSObject().setItem(COSName.TO_UNICODE, toUnicodeStream);
            }
        }
        doc.save("huhu.pdf");
    }
    

Btw के बिना रिलीज़ किए गए 2.1 संस्करण PDFDebugger में फोंट दिखाने के लिए कुछ बेहतर सुविधाएँ हैं, आप इसे here प्राप्त कर सकते here :

आप इसका उपयोग यह सत्यापित करने के लिए कर सकते हैं कि आपका ToUnicode CMap अर्थ रखता है। यहाँ मुझे अपने परिवर्तनों के साथ मिला है:

मैं pdfs को पाठ में बदलने के लिए एक Java प्रोजेक्ट में PDFBOX संस्करण 2.0.0 का उपयोग कर रहा हूं।

मेरे कई pdfs को टूनोएनोड विधि याद आ रही है, इसलिए मैं उन्हें निर्यात करते समय गिर्बिश में आता हूं।

2016-09-14 10:44:55 WARN org.apache.pdfbox.pdmodel.font.PDSimpleFont(1):322 - No Unicode mapping for 694 (30) in font MPBAAA+F1

ऊपर के WARN में, वास्तविक चरित्र के बजाय, एक अस्पष्ट यूनिकोड (30) प्रस्तुत किया गया था।

मैं पीडीएफ बॉक्स में additional.txt फ़ाइल को संपादित करके इसे दूर करने में सक्षम था, क्योंकि परीक्षण और त्रुटि से मैं समझ गया था कि चरित्र का कोड (इस मामले में 694) एक निश्चित हिब्रू पत्र (צ) का प्रतिनिधित्व करता है।

यहाँ मैंने फ़ाइल के अंदर जो कुछ भी संपादित किया है उसका एक छोटा उदाहरण है:

-694;05E6 #HexaDecimal value for the letter צ
-695;05E7
-696;05E8

बाद में मैंने लगभग एक ही चेतावनी को एक अलग पीडीऍफ़ पर रखा है, लेकिन इसके बजाय मुझे कोई चरित्र नहीं मिला। इस मुद्दे का अधिक विस्तृत अन्वेषण यहाँ देखा जा सकता है - पीडीएफ़ के माध्यम से पीडीएफ को जावा में पढ़ना

2016-09-14 11:07:10 WARN org.apache.pdfbox.pdmodel.font.PDType0Font(1):431 - No Unicode mapping for CID+694 (694) in font ABCDEE+Tahoma,Bold

जैसा कि आप देख सकते हैं, चेतावनी पहले चेतावनी ( PDType0Font ) के बजाय एक अलग वर्ग ( PDType0Font ) से आई थी, लेकिन कोड नाम (694) उन दोनों में समान है और वे दोनों एक ही चरित्र के बारे में बात कर रहे हैं।

क्या कोई अलग फ़ाइल है जिसे मुझे 694 कोड (हिब्रू अक्षर צ) को इंगित करने के लिए additional.txt से अलग संपादित करना चाहिए। यह सही नहीं है?

धन्यवाद





glyph