Author: jghali
Date: Thu Aug 24 19:28:57 2017
New Revision: 22142

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22142
Log:
#14960 related: generate PDF ToUnicode map also for Type3 fonts

Modified:
    trunk/Scribus/scribus/pdflib_core.cpp

Modified: trunk/Scribus/scribus/pdflib_core.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=22142&path=/trunk/Scribus/scribus/pdflib_core.cpp
==============================================================================
--- trunk/Scribus/scribus/pdflib_core.cpp       (original)
+++ trunk/Scribus/scribus/pdflib_core.cpp       Thu Aug 24 19:28:57 2017
@@ -1459,13 +1459,20 @@
        double miny =  std::numeric_limits<double>::max();
        double maxx = -std::numeric_limits<double>::max();
        double maxy = -std::numeric_limits<double>::max();
+
        QList<uint> glyphWidths;
        QList<QByteArray> charProcs;
+       QStringList toUnicodeMaps;
+       QList<int> toUnicodeMapsCount;
+       QString toUnicodeMap = "";
+       int toUnicodeMapCounter = 0;
        QByteArray encoding = "<< /Type /Encoding\n/Differences [ 0\n";
        QByteArray fon;
        QMap<uint, uint> glyphMapping;
+
        ScFace::FaceEncoding gl;
        face.glyphNames(gl);
+
        QMap<uint,FPointArray>::ConstIterator ig;
        for (ig = RealGlyphs.cbegin(); ig != RealGlyphs.cend(); ++ig)
        {
@@ -1517,6 +1524,7 @@
                maxx = qMax(maxx, np1.x());
                maxy = qMax(maxy, np1.y());
                glyphWidths.append(qRound(np1.x()));
+
                PdfId charProcObject = writer.newObject();
                charProcs.append(Pdf::toName(gl[ig.key()].second)+" 
"+Pdf::toPdf(charProcObject)+" 0 R\n");
                encoding += Pdf::toName(gl[ig.key()].second)+" ";
@@ -1529,6 +1537,20 @@
                        PutDoc("\n/Filter /FlateDecode");
                PutDoc("\n>>\nstream\n"+EncStream(fon, 
charProcObject)+"\nendstream");
                writer.endObj(charProcObject);
+
+               QString tmp, tmp2;
+               tmp.sprintf("%02X", glyphCount);
+               tmp2.sprintf("%04X", gl[ig.key()].first);
+               toUnicodeMap += "<" + Pdf::toAscii(tmp) + "> <" + 
Pdf::toAscii(tmp2) + ">\n";
+               toUnicodeMapCounter++;
+               if (toUnicodeMapCounter == 100)
+               {
+                       toUnicodeMaps.append(toUnicodeMap);
+                       toUnicodeMapsCount.append(toUnicodeMapCounter);
+                       toUnicodeMap = "";
+                       toUnicodeMapCounter = 0;
+               }
+
                glyphCount++;
                int glyphsLeft = RealGlyphs.count() - SubFonts * 256;
                if ((glyphCount > 255) || (glyphCount == glyphsLeft))
@@ -1557,6 +1579,40 @@
                        PutDoc("]\n");
                        PutDoc(">>");
                        writer.endObj(fontEncoding);
+
+                       if (toUnicodeMapCounter != 0)
+                       {
+                               toUnicodeMaps.append(toUnicodeMap);
+                               toUnicodeMapsCount.append(toUnicodeMapCounter);
+                       }
+
+                       QByteArray toUnicodeMapStream = "";
+                       toUnicodeMapStream += "/CIDInit /ProcSet findresource 
begin\n";
+                       toUnicodeMapStream += "12 dict begin\n";
+                       toUnicodeMapStream += "begincmap\n";
+                       toUnicodeMapStream += "/CIDSystemInfo <<\n";
+                       toUnicodeMapStream += "/Registry (Adobe)\n";
+                       toUnicodeMapStream += "/Ordering (UCS)\n";
+                       toUnicodeMapStream += "/Supplement 0\n";
+                       toUnicodeMapStream += ">> def\n";
+                       toUnicodeMapStream += "/CMapName /Adobe-Identity-UCS 
def\n";
+                       toUnicodeMapStream += "/CMapType 2 def\n";
+                       toUnicodeMapStream += "1 begincodespacerange\n";
+                       toUnicodeMapStream += "<0000> <FFFF>\n";
+                       toUnicodeMapStream += "endcodespacerange\n";
+                       for (int uniC = 0; uniC < toUnicodeMaps.count(); uniC++)
+                       {
+                               toUnicodeMapStream += 
Pdf::toPdf(toUnicodeMapsCount[uniC]);
+                               toUnicodeMapStream += " beginbfchar\n";
+                               toUnicodeMapStream += toUnicodeMaps[uniC];
+                               toUnicodeMapStream += "endbfchar\n";
+                       }
+                       toUnicodeMapStream += "endcmap\n";
+                       toUnicodeMapStream += "CMapName currentdict /CMap 
defineresource pop\n";
+                       toUnicodeMapStream += "end\n";
+                       toUnicodeMapStream += "end\n";
+                       PdfId fontToUnicode = 
WritePDFStream(toUnicodeMapStream);
+
                        PdfId font3Object = writer.newObject();
                        writer.startObj(font3Object);
                        PutDoc("<<\n/Type /Font\n/Subtype /Type3\n");
@@ -1568,12 +1624,16 @@
                        PutDoc("/FontBBox ["+Pdf::toPdf(qRound(minx))+" 
"+Pdf::toPdf(qRound(miny))+" "+Pdf::toPdf(qRound(maxx))+ " 
"+Pdf::toPdf(qRound(maxy))+"]\n");
                        PutDoc("/FontMatrix [0.001 0 0 0.001 0 0]\n");
                        PutDoc("/Encoding "+Pdf::toPdf(fontEncoding)+" 0 R\n");
+                       PutDoc("/ToUnicode " + Pdf::toPdf(fontToUnicode) + " 0 
R\n");
                        PutDoc(">>");
                        writer.endObj(font3Object);
                        pageData.FObjects[name+"S"+Pdf::toPdf(SubFonts)] = 
font3Object;
                        charProcs.clear();
                        glyphWidths.clear();
-                       //                                              
glyphMapping.clear();
+                       toUnicodeMaps.clear();
+                       toUnicodeMapsCount.clear();
+                       toUnicodeMap.clear();
+                       toUnicodeMapCounter = 0;
                        glyphCount = 0;
                        ++SubFonts;
                        minx =  std::numeric_limits<double>::max();


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to