예제 #1
0
        internal override void WriteFont(PdfWriter writer, PdfIndirectReference piref, Object[] parms)
        {
            IntHashtable         cjkTag   = (IntHashtable)parms[0];
            PdfIndirectReference ind_font = null;
            PdfObject            pobj     = null;
            PdfIndirectObject    obj      = null;

            pobj = GetFontDescriptor();
            if (pobj != null)
            {
                obj      = writer.AddToBody(pobj);
                ind_font = obj.IndirectReference;
            }
            pobj = GetCIDFont(ind_font, cjkTag);
            if (pobj != null)
            {
                obj      = writer.AddToBody(pobj);
                ind_font = obj.IndirectReference;
            }
            pobj = GetFontBaseType(ind_font);
            writer.AddToBody(pobj, piref);
        }
예제 #2
0
        internal void AddDocument(PdfReader reader)
        {
            if (!reader.IsOpenedWithFullPermissions)
            {
                throw new BadPasswordException("PdfReader not opened with owner password");
            }
            OpenDoc();
            if (readers2intrefs.ContainsKey(reader))
            {
                reader = new PdfReader(reader);
            }
            else
            {
                if (reader.Tampered)
                {
                    throw new DocumentException("The document was reused.");
                }
                reader.ConsolidateNamedDestinations();
                reader.Tampered = true;
            }
            reader.ShuffleSubsetNames();
            readers2intrefs[reader] = new IntHashtable();
            readers.Add(reader);
            int          len  = reader.NumberOfPages;
            IntHashtable refs = new IntHashtable();

            for (int p = 1; p <= len; ++p)
            {
                refs[reader.GetPageOrigRef(p).Number] = 1;
                reader.ReleasePage(p);
            }
            pages2intrefs[reader] = refs;
            visited[reader]       = new IntHashtable();
            fields.Add(reader.AcroFields);
            UpdateCalculationOrder(reader);
        }
예제 #3
0
 /**
  * This method feeds in the source document
  * @param reader The PDF reader containing the source document
  * @throws DocumentException
  */
 public void CopyDocumentFields(PdfReader reader)
 {
     if (!reader.IsOpenedWithFullPermissions)
     {
         throw new BadPasswordException("PdfReader not opened with owner password");
     }
     if (readers2intrefs.ContainsKey(reader))
     {
         reader = new PdfReader(reader);
     }
     else
     {
         if (reader.Tampered)
         {
             throw new DocumentException("The document was reused.");
         }
         reader.ConsolidateNamedDestinations();
         reader.Tampered = true;
     }
     reader.ShuffleSubsetNames();
     readers2intrefs[reader] = new IntHashtable();
     fields.Add(reader.AcroFields);
     UpdateCalculationOrder(reader);
 }
예제 #4
0
 private static ArrayList BookmarkDepth(PdfReader reader, PdfDictionary outline, IntHashtable pages)
 {
     ArrayList list = new ArrayList();
     while (outline != null) {
         Hashtable map = new Hashtable();
         PdfString title = (PdfString)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.TITLE));
         map["Title"] = title.ToUnicodeString();
         PdfArray color = (PdfArray)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.C));
         if (color != null && color.Size == 3) {
             ByteBuffer outp = new ByteBuffer();
             outp.Append(color.GetAsNumber(0).FloatValue).Append(' ');
             outp.Append(color.GetAsNumber(1).FloatValue).Append(' ');
             outp.Append(color.GetAsNumber(2).FloatValue);
             map["Color"] = PdfEncodings.ConvertToString(outp.ToByteArray(), null);
         }
         PdfNumber style = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.F));
         if (style != null) {
             int f = style.IntValue;
             String s = "";
             if ((f & 1) != 0)
                 s += "italic ";
             if ((f & 2) != 0)
                 s += "bold ";
             s = s.Trim();
             if (s.Length != 0)
                 map["Style"] = s;
         }
         PdfNumber count = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.COUNT));
         if (count != null && count.IntValue < 0)
             map["Open"] = "false";
         try {
             PdfObject dest = PdfReader.GetPdfObjectRelease(outline.Get(PdfName.DEST));
             if (dest != null) {
                 MapGotoBookmark(map, dest, pages); //changed by ujihara 2004-06-13
             }
             else {
                 PdfDictionary action = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.A));
                 if (action != null) {
                     if (PdfName.GOTO.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) {
                         dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                         if (dest != null) {
                             MapGotoBookmark(map, dest, pages);
                         }
                     }
                     else if (PdfName.URI.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) {
                         map["Action"] = "URI";
                         map["URI"] = ((PdfString)PdfReader.GetPdfObjectRelease(action.Get(PdfName.URI))).ToUnicodeString();
                     }
                     else if (PdfName.GOTOR.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) {
                         dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                         if (dest != null) {
                             if (dest.IsString())
                                 map["Named"] = dest.ToString();
                             else if (dest.IsName())
                                 map["NamedN"] = PdfName.DecodeName(dest.ToString());
                             else if (dest.IsArray()) {
                                 PdfArray arr = (PdfArray)dest;
                                 StringBuilder s = new StringBuilder();
                                 s.Append(arr[0].ToString());
                                 s.Append(' ').Append(arr[1].ToString());
                                 for (int k = 2; k < arr.Size; ++k)
                                     s.Append(' ').Append(arr[k].ToString());
                                 map["Page"] = s.ToString();
                             }
                         }
                         map["Action"] = "GoToR";
                         PdfObject file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                         if (file != null) {
                             if (file.IsString())
                                 map["File"] = ((PdfString)file).ToUnicodeString();
                             else if (file.IsDictionary()) {
                                 file = PdfReader.GetPdfObject(((PdfDictionary)file).Get(PdfName.F));
                                 if (file.IsString())
                                     map["File"] = ((PdfString)file).ToUnicodeString();
                             }
                         }
                         PdfObject newWindow = PdfReader.GetPdfObjectRelease(action.Get(PdfName.NEWWINDOW));
                         if (newWindow != null)
                             map["NewWindow"] = newWindow.ToString();
                     }
                     else if (PdfName.LAUNCH.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) {
                         map["Action"] = "Launch";
                         PdfObject file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                         if (file == null)
                             file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.WIN));
                         if (file != null) {
                             if (file.IsString())
                                 map["File"] = ((PdfString)file).ToUnicodeString();
                             else if (file.IsDictionary()) {
                                 file = PdfReader.GetPdfObjectRelease(((PdfDictionary)file).Get(PdfName.F));
                                 if (file.IsString())
                                     map["File"] = ((PdfString)file).ToUnicodeString();
                             }
                         }
                     }
                 }
             }
         }
         catch  {
             //empty on purpose
         }
         PdfDictionary first = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.FIRST));
         if (first != null) {
             map["Kids"] = BookmarkDepth(reader, first, pages);
         }
         list.Add(map);
         outline = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.NEXT));
     }
     return list;
 }
예제 #5
0
 private PdfDictionary GetCIDFont(PdfIndirectReference fontDescriptor, IntHashtable cjkTag)
 {
     PdfDictionary dic = new PdfDictionary(PdfName.FONT);
     dic.Put(PdfName.SUBTYPE, PdfName.CIDFONTTYPE0);
     dic.Put(PdfName.BASEFONT, new PdfName(fontName + style));
     dic.Put(PdfName.FONTDESCRIPTOR, fontDescriptor);
     int[] keys = cjkTag.ToOrderedKeys();
     string w = ConvertToHCIDMetrics(keys, hMetrics);
     if (w != null)
     dic.Put(PdfName.W, new PdfLiteral(w));
     if (vertical) {
     w = ConvertToVCIDMetrics(keys, vMetrics, hMetrics);
     if (w != null)
         dic.Put(PdfName.W2, new PdfLiteral(w));
     }
     else
     dic.Put(PdfName.DW, new PdfNumber(1000));
     PdfDictionary cdic = new PdfDictionary();
     cdic.Put(PdfName.REGISTRY, new PdfString((string)fontDesc["Registry"], null));
     cdic.Put(PdfName.ORDERING, new PdfString((string)fontDesc["Ordering"], null));
     cdic.Put(PdfName.SUPPLEMENT, new PdfLiteral((string)fontDesc["Supplement"]));
     dic.Put(PdfName.CIDSYSTEMINFO, cdic);
     return dic;
 }
예제 #6
0
 internal static string ConvertToVCIDMetrics(int[] keys, IntHashtable v, IntHashtable h)
 {
     if (keys.Length == 0)
     return null;
     int lastCid = 0;
     int lastValue = 0;
     int lastHValue = 0;
     int start;
     for (start = 0; start < keys.Length; ++start) {
     lastCid = keys[start];
     lastValue = v[lastCid];
     if (lastValue != 0) {
         ++start;
         break;
     }
     else
         lastHValue = h[lastCid];
     }
     if (lastValue == 0)
     return null;
     if (lastHValue == 0)
     lastHValue = 1000;
     StringBuilder buf = new StringBuilder();
     buf.Append('[');
     buf.Append(lastCid);
     int state = FIRST;
     for (int k = start; k < keys.Length; ++k) {
     int cid = keys[k];
     int value = v[cid];
     if (value == 0)
         continue;
     int hValue = h[lastCid];
     if (hValue == 0)
         hValue = 1000;
     switch (state) {
         case FIRST: {
             if (cid == lastCid + 1 && value == lastValue && hValue == lastHValue) {
                 state = SERIAL;
             }
             else {
                 buf.Append(' ').Append(lastCid).Append(' ').Append(-lastValue).Append(' ').Append(lastHValue / 2).Append(' ').Append(V1Y).Append(' ').Append(cid);
             }
             break;
         }
         case SERIAL: {
             if (cid != lastCid + 1 || value != lastValue || hValue != lastHValue) {
                 buf.Append(' ').Append(lastCid).Append(' ').Append(-lastValue).Append(' ').Append(lastHValue / 2).Append(' ').Append(V1Y).Append(' ').Append(cid);
                 state = FIRST;
             }
             break;
         }
     }
     lastValue = value;
     lastCid = cid;
     lastHValue = hValue;
     }
     buf.Append(' ').Append(lastCid).Append(' ').Append(-lastValue).Append(' ').Append(lastHValue / 2).Append(' ').Append(V1Y).Append(" ]");
     return buf.ToString();
 }
예제 #7
0
 /** Creates a CJK font.
  * @param fontName the name of the font
  * @param enc the encoding of the font
  * @param emb always <CODE>false</CODE>. CJK font and not embedded
  * @throws DocumentException on error
  * @throws IOException on error
  */
 internal CJKFont(string fontName, string enc, bool emb)
 {
     LoadProperties();
     this.FontType = FONT_TYPE_CJK;
     string nameBase = GetBaseName(fontName);
     if (!IsCJKFont(nameBase, enc))
     throw new DocumentException("Font '" + fontName + "' with '" + enc + "' encoding is not a CJK font.");
     if (nameBase.Length < fontName.Length) {
     style = fontName.Substring(nameBase.Length);
     fontName = nameBase;
     }
     this.fontName = fontName;
     encoding = CJK_ENCODING;
     vertical = enc.EndsWith("V");
     CMap = enc;
     if (enc.StartsWith("Identity-")) {
     cidDirect = true;
     string s = cjkFonts[fontName];
     s = s.Substring(0, s.IndexOf('_'));
     char[] c = (char[])allCMaps[s];
     if (c == null) {
         c = ReadCMap(s);
         if (c == null)
             throw new DocumentException("The cmap " + s + " does not exist as a resource.");
         c[CID_NEWLINE] = '\n';
         allCMaps.Add(s, c);
     }
     translationMap = c;
     }
     else {
     char[] c = (char[])allCMaps[enc];
     if (c == null) {
         string s = cjkEncodings[enc];
         if (s == null)
             throw new DocumentException("The resource cjkencodings.properties does not contain the encoding " + enc);
         StringTokenizer tk = new StringTokenizer(s);
         string nt = tk.NextToken();
         c = (char[])allCMaps[nt];
         if (c == null) {
             c = ReadCMap(nt);
             allCMaps.Add(nt, c);
         }
         if (tk.HasMoreTokens()) {
             string nt2 = tk.NextToken();
             char[] m2 = ReadCMap(nt2);
             for (int k = 0; k < 0x10000; ++k) {
                 if (m2[k] == 0)
                     m2[k] = c[k];
             }
             allCMaps.Add(enc, m2);
             c = m2;
         }
     }
     translationMap = c;
     }
     fontDesc = (Hashtable)allFonts[fontName];
     if (fontDesc == null) {
     fontDesc = ReadFontProperties(fontName);
     allFonts.Add(fontName, fontDesc);
     }
     hMetrics = (IntHashtable)fontDesc["W"];
     vMetrics = (IntHashtable)fontDesc["W2"];
 }
 public static Hashtable GetNamedDestination(PdfReader reader, bool fromNames)
 {
     IntHashtable pages = new IntHashtable();
     int numPages = reader.NumberOfPages;
     for (int k = 1; k <= numPages; ++k)
         pages[reader.GetPageOrigRef(k).Number] = k;
     Hashtable names = fromNames ? reader.GetNamedDestinationFromNames() : reader.GetNamedDestinationFromStrings();
     String[] keys = new String[names.Count];
     names.Keys.CopyTo(keys, 0);
     foreach (String name in keys) {
         PdfArray arr = (PdfArray)names[name];
         StringBuilder s = new StringBuilder();
         try {
             s.Append(pages[(arr.GetAsIndirectObject(0)).Number]);
             s.Append(' ').Append(arr[1].ToString().Substring(1));
             for (int k = 2; k < arr.Size; ++k)
                 s.Append(' ').Append(arr[k].ToString());
             names[name] = s.ToString();
         }
         catch {
             names.Remove(name);
         }
     }
     return names;
 }
예제 #9
0
        protected internal bool IsVisited(PdfReader reader, int number, int generation)
        {
            IntHashtable refs = (IntHashtable)readers2intrefs[reader];

            return(refs.ContainsKey(number));
        }
예제 #10
0
 internal void AddDocument(PdfReader reader)
 {
     if (!reader.IsOpenedWithFullPermissions)
         throw new BadPasswordException("PdfReader not opened with owner password");
     OpenDoc();
     if (readers2intrefs.ContainsKey(reader)) {
         reader = new PdfReader(reader);
     }
     else {
         if (reader.Tampered)
             throw new DocumentException("The document was reused.");
         reader.ConsolidateNamedDestinations();
         reader.Tampered = true;
     }
     reader.ShuffleSubsetNames();
     readers2intrefs[reader] =  new IntHashtable();
     readers.Add(reader);
     int len = reader.NumberOfPages;
     IntHashtable refs = new IntHashtable();
     for (int p = 1; p <= len; ++p) {
         refs[reader.GetPageOrigRef(p).Number] = 1;
         reader.ReleasePage(p);
     }
     pages2intrefs[reader] =  refs;
     visited[reader] =  new IntHashtable();
     fields.Add(reader.AcroFields);
     UpdateCalculationOrder(reader);
 }
예제 #11
0
        /**
         * Converts a <CODE>string</CODE> to a </CODE>byte</CODE> array according
         * to the font's encoding.
         * @param text the <CODE>string</CODE> to be converted
         * @return an array of <CODE>byte</CODE> representing the conversion according to the font's encoding
         */
        public static byte[] ConvertToBytes(string text, string encoding)
        {
            if (text == null)
            {
                return(new byte[0]);
            }
            if (encoding == null || encoding.Length == 0)
            {
                int    len = text.Length;
                byte[] b   = new byte[len];
                for (int k = 0; k < len; ++k)
                {
                    b[k] = (byte)text[k];
                }
                return(b);
            }
            IExtraEncoding extra = (IExtraEncoding)extraEncodings[encoding.ToLower(CultureInfo.InvariantCulture)];

            if (extra != null)
            {
                byte[] b = extra.CharToByte(text, encoding);
                if (b != null)
                {
                    return(b);
                }
            }
            IntHashtable hash = null;

            if (encoding.Equals(BaseFont.CP1252))
            {
                hash = winansi;
            }
            else if (encoding.Equals(PdfObject.TEXT_PDFDOCENCODING))
            {
                hash = pdfEncoding;
            }
            if (hash != null)
            {
                char[] cc  = text.ToCharArray();
                int    len = cc.Length;
                int    ptr = 0;
                byte[] b   = new byte[len];
                int    c   = 0;
                for (int k = 0; k < len; ++k)
                {
                    char char1 = cc[k];
                    if (char1 < 128 || (char1 > 160 && char1 <= 255))
                    {
                        c = char1;
                    }
                    else
                    {
                        c = hash[char1];
                    }
                    if (c != 0)
                    {
                        b[ptr++] = (byte)c;
                    }
                }
                if (ptr == len)
                {
                    return(b);
                }
                byte[] b2 = new byte[ptr];
                Array.Copy(b, 0, b2, 0, ptr);
                return(b2);
            }
            Encoding encw = IanaEncodings.GetEncodingEncoding(encoding);

            byte[] preamble = encw.GetPreamble();
            if (preamble.Length == 0)
            {
                return(encw.GetBytes(text));
            }
            byte[] encoded = encw.GetBytes(text);
            byte[] total   = new byte[encoded.Length + preamble.Length];
            Array.Copy(preamble, 0, total, 0, preamble.Length);
            Array.Copy(encoded, 0, total, preamble.Length, encoded.Length);
            return(total);
        }
예제 #12
0
        internal static string ConvertToVCIDMetrics(int[] keys, IntHashtable v, IntHashtable h)
        {
            if (keys.Length == 0)
            {
                return(null);
            }
            int lastCid    = 0;
            int lastValue  = 0;
            int lastHValue = 0;
            int start;

            for (start = 0; start < keys.Length; ++start)
            {
                lastCid   = keys[start];
                lastValue = v[lastCid];
                if (lastValue != 0)
                {
                    ++start;
                    break;
                }
                else
                {
                    lastHValue = h[lastCid];
                }
            }
            if (lastValue == 0)
            {
                return(null);
            }
            if (lastHValue == 0)
            {
                lastHValue = 1000;
            }
            StringBuilder buf = new StringBuilder();

            buf.Append('[');
            buf.Append(lastCid);
            int state = FIRST;

            for (int k = start; k < keys.Length; ++k)
            {
                int cid   = keys[k];
                int value = v[cid];
                if (value == 0)
                {
                    continue;
                }
                int hValue = h[lastCid];
                if (hValue == 0)
                {
                    hValue = 1000;
                }
                switch (state)
                {
                case FIRST: {
                    if (cid == lastCid + 1 && value == lastValue && hValue == lastHValue)
                    {
                        state = SERIAL;
                    }
                    else
                    {
                        buf.Append(' ').Append(lastCid).Append(' ').Append(-lastValue).Append(' ').Append(lastHValue / 2).Append(' ').Append(V1Y).Append(' ').Append(cid);
                    }
                    break;
                }

                case SERIAL: {
                    if (cid != lastCid + 1 || value != lastValue || hValue != lastHValue)
                    {
                        buf.Append(' ').Append(lastCid).Append(' ').Append(-lastValue).Append(' ').Append(lastHValue / 2).Append(' ').Append(V1Y).Append(' ').Append(cid);
                        state = FIRST;
                    }
                    break;
                }
                }
                lastValue  = value;
                lastCid    = cid;
                lastHValue = hValue;
            }
            buf.Append(' ').Append(lastCid).Append(' ').Append(-lastValue).Append(' ').Append(lastHValue / 2).Append(' ').Append(V1Y).Append(" ]");
            return(buf.ToString());
        }
예제 #13
0
 /**
 * This method feeds in the source document
 * @param reader The PDF reader containing the source document
 * @throws DocumentException
 */
 public void CopyDocumentFields(PdfReader reader)
 {
     if (!reader.IsOpenedWithFullPermissions)
         throw new BadPasswordException("PdfReader not opened with owner password");
     if (readers2intrefs.ContainsKey(reader)) {
         reader = new PdfReader(reader);
     }
     else {
         if (reader.Tampered)
             throw new DocumentException("The document was reused.");
         reader.ConsolidateNamedDestinations();
         reader.Tampered = true;
     }
     reader.ShuffleSubsetNames();
     readers2intrefs[reader] = new IntHashtable();
     fields.Add(reader.AcroFields);
     UpdateCalculationOrder(reader);
 }
예제 #14
0
        private void DoType1TT()
        {
            PdfObject enc = PdfReader.GetPdfObject(font.Get(PdfName.ENCODING));

            if (enc == null)
            {
                FillEncoding(null);
            }
            else
            {
                if (enc.IsName())
                {
                    FillEncoding((PdfName)enc);
                }
                else
                {
                    PdfDictionary encDic = (PdfDictionary)enc;
                    enc = PdfReader.GetPdfObject(encDic.Get(PdfName.BASEENCODING));
                    if (enc == null)
                    {
                        FillEncoding(null);
                    }
                    else
                    {
                        FillEncoding((PdfName)enc);
                    }
                    PdfArray diffs = encDic.GetAsArray(PdfName.DIFFERENCES);
                    if (diffs != null)
                    {
                        diffmap = new IntHashtable();
                        int currentNumber = 0;
                        for (int k = 0; k < diffs.Size; ++k)
                        {
                            PdfObject obj = diffs[k];
                            if (obj.IsNumber())
                            {
                                currentNumber = ((PdfNumber)obj).IntValue;
                            }
                            else
                            {
                                int[] c = GlyphList.NameToUnicode(PdfName.DecodeName(((PdfName)obj).ToString()));
                                if (c != null && c.Length > 0)
                                {
                                    uni2byte[c[0]] = currentNumber;
                                    diffmap[c[0]]  = currentNumber;
                                }
                                ++currentNumber;
                            }
                        }
                    }
                }
            }
            PdfArray  newWidths = font.GetAsArray(PdfName.WIDTHS);
            PdfNumber first     = font.GetAsNumber(PdfName.FIRSTCHAR);
            PdfNumber last      = font.GetAsNumber(PdfName.LASTCHAR);

            if (BuiltinFonts14.ContainsKey(fontName))
            {
                BaseFont bf;
                bf = BaseFont.CreateFont(fontName, WINANSI, false);
                int[] e = uni2byte.ToOrderedKeys();
                for (int k = 0; k < e.Length; ++k)
                {
                    int n = uni2byte[e[k]];
                    widths[n] = bf.GetRawWidth(n, GlyphList.UnicodeToName(e[k]));
                }
                if (diffmap != null)   //widths for differences must override existing ones
                {
                    e = diffmap.ToOrderedKeys();
                    for (int k = 0; k < e.Length; ++k)
                    {
                        int n = diffmap[e[k]];
                        widths[n] = bf.GetRawWidth(n, GlyphList.UnicodeToName(e[k]));
                    }
                    diffmap = null;
                }
                Ascender    = bf.GetFontDescriptor(ASCENT, 1000);
                CapHeight   = bf.GetFontDescriptor(CAPHEIGHT, 1000);
                Descender   = bf.GetFontDescriptor(DESCENT, 1000);
                ItalicAngle = bf.GetFontDescriptor(ITALICANGLE, 1000);
                llx         = bf.GetFontDescriptor(BBOXLLX, 1000);
                lly         = bf.GetFontDescriptor(BBOXLLY, 1000);
                urx         = bf.GetFontDescriptor(BBOXURX, 1000);
                ury         = bf.GetFontDescriptor(BBOXURY, 1000);
            }
            if (first != null && last != null && newWidths != null)
            {
                int f = first.IntValue;
                for (int k = 0; k < newWidths.Size; ++k)
                {
                    widths[f + k] = newWidths.GetAsNumber(k).IntValue;
                }
            }
            FillFontDesc(font.GetAsDict(PdfName.FONTDESCRIPTOR));
        }
예제 #15
0
        private void FillMetrics(byte[] touni, IntHashtable widths, int dw)
        {
            PdfContentParser ps   = new PdfContentParser(new PRTokeniser(touni));
            PdfObject        ob   = null;
            PdfObject        last = null;

            while ((ob = ps.ReadPRObject()) != null)
            {
                if (ob.Type == PdfContentParser.COMMAND_TYPE)
                {
                    if (ob.ToString().Equals("beginbfchar"))
                    {
                        int n = ((PdfNumber)last).IntValue;
                        for (int k = 0; k < n; ++k)
                        {
                            String cid = DecodeString((PdfString)ps.ReadPRObject());
                            String uni = DecodeString((PdfString)ps.ReadPRObject());
                            if (uni.Length == 1)
                            {
                                int cidc = (int)cid[0];
                                int unic = (int)uni[uni.Length - 1];
                                int w    = dw;
                                if (widths.ContainsKey(cidc))
                                {
                                    w = widths[cidc];
                                }
                                metrics[unic] = new int[] { cidc, w };
                            }
                        }
                    }
                    else if (ob.ToString().Equals("beginbfrange"))
                    {
                        int n = ((PdfNumber)last).IntValue;
                        for (int k = 0; k < n; ++k)
                        {
                            String    cid1  = DecodeString((PdfString)ps.ReadPRObject());
                            String    cid2  = DecodeString((PdfString)ps.ReadPRObject());
                            int       cid1c = (int)cid1[0];
                            int       cid2c = (int)cid2[0];
                            PdfObject ob2   = ps.ReadPRObject();
                            if (ob2.IsString())
                            {
                                String uni = DecodeString((PdfString)ob2);
                                if (uni.Length == 1)
                                {
                                    int unic = (int)uni[uni.Length - 1];
                                    for (; cid1c <= cid2c; cid1c++, unic++)
                                    {
                                        int w = dw;
                                        if (widths.ContainsKey(cid1c))
                                        {
                                            w = widths[cid1c];
                                        }
                                        metrics[unic] = new int[] { cid1c, w };
                                    }
                                }
                            }
                            else
                            {
                                PdfArray a = (PdfArray)ob2;
                                for (int j = 0; j < a.Size; ++j, ++cid1c)
                                {
                                    String uni = DecodeString(a.GetAsString(j));
                                    if (uni.Length == 1)
                                    {
                                        int unic = (int)uni[uni.Length - 1];
                                        int w    = dw;
                                        if (widths.ContainsKey(cid1c))
                                        {
                                            w = widths[cid1c];
                                        }
                                        metrics[unic] = new int[] { cid1c, w };
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    last = ob;
                }
            }
        }
예제 #16
0
 private static void MapGotoBookmark(Hashtable map, PdfObject dest, IntHashtable pages)
 {
     if (dest.IsString())
         map["Named"] = dest.ToString();
     else if (dest.IsName())
         map["Named"] = PdfName.DecodeName(dest.ToString());
     else if (dest.IsArray())
         map["Page"] = MakeBookmarkParam((PdfArray)dest, pages); //changed by ujihara 2004-06-13
     map["Action"] = "GoTo";
 }
예제 #17
0
 private static String MakeBookmarkParam(PdfArray dest, IntHashtable pages)
 {
     StringBuilder s = new StringBuilder();
     PdfObject obj = dest[0];
     if (obj.IsNumber())
         s.Append(((PdfNumber)obj).IntValue + 1);
     else
         s.Append(pages[GetNumber((PdfIndirectReference)obj)]); //changed by ujihara 2004-06-13
     s.Append(' ').Append(dest[1].ToString().Substring(1));
     for (int k = 2; k < dest.Size; ++k)
         s.Append(' ').Append(dest[k].ToString());
     return s.ToString();
 }
예제 #18
0
        private static ArrayList BookmarkDepth(PdfReader reader, PdfDictionary outline, IntHashtable pages)
        {
            ArrayList list = new ArrayList();

            while (outline != null)
            {
                Hashtable map   = new Hashtable();
                PdfString title = (PdfString)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.TITLE));
                map["Title"] = title.ToUnicodeString();
                PdfArray color = (PdfArray)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.C));
                if (color != null && color.Size == 3)
                {
                    ByteBuffer outp = new ByteBuffer();
                    outp.Append(color.GetAsNumber(0).FloatValue).Append(' ');
                    outp.Append(color.GetAsNumber(1).FloatValue).Append(' ');
                    outp.Append(color.GetAsNumber(2).FloatValue);
                    map["Color"] = PdfEncodings.ConvertToString(outp.ToByteArray(), null);
                }
                PdfNumber style = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.F));
                if (style != null)
                {
                    int    f = style.IntValue;
                    String s = "";
                    if ((f & 1) != 0)
                    {
                        s += "italic ";
                    }
                    if ((f & 2) != 0)
                    {
                        s += "bold ";
                    }
                    s = s.Trim();
                    if (s.Length != 0)
                    {
                        map["Style"] = s;
                    }
                }
                PdfNumber count = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.COUNT));
                if (count != null && count.IntValue < 0)
                {
                    map["Open"] = "false";
                }
                try {
                    PdfObject dest = PdfReader.GetPdfObjectRelease(outline.Get(PdfName.DEST));
                    if (dest != null)
                    {
                        MapGotoBookmark(map, dest, pages); //changed by ujihara 2004-06-13
                    }
                    else
                    {
                        PdfDictionary action = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.A));
                        if (action != null)
                        {
                            if (PdfName.GOTO.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                                if (dest != null)
                                {
                                    MapGotoBookmark(map, dest, pages);
                                }
                            }
                            else if (PdfName.URI.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                map["Action"] = "URI";
                                map["URI"]    = ((PdfString)PdfReader.GetPdfObjectRelease(action.Get(PdfName.URI))).ToUnicodeString();
                            }
                            else if (PdfName.GOTOR.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                dest = PdfReader.GetPdfObjectRelease(action.Get(PdfName.D));
                                if (dest != null)
                                {
                                    if (dest.IsString())
                                    {
                                        map["Named"] = dest.ToString();
                                    }
                                    else if (dest.IsName())
                                    {
                                        map["NamedN"] = PdfName.DecodeName(dest.ToString());
                                    }
                                    else if (dest.IsArray())
                                    {
                                        PdfArray      arr = (PdfArray)dest;
                                        StringBuilder s   = new StringBuilder();
                                        s.Append(arr[0].ToString());
                                        s.Append(' ').Append(arr[1].ToString());
                                        for (int k = 2; k < arr.Size; ++k)
                                        {
                                            s.Append(' ').Append(arr[k].ToString());
                                        }
                                        map["Page"] = s.ToString();
                                    }
                                }
                                map["Action"] = "GoToR";
                                PdfObject file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                                if (file != null)
                                {
                                    if (file.IsString())
                                    {
                                        map["File"] = ((PdfString)file).ToUnicodeString();
                                    }
                                    else if (file.IsDictionary())
                                    {
                                        file = PdfReader.GetPdfObject(((PdfDictionary)file).Get(PdfName.F));
                                        if (file.IsString())
                                        {
                                            map["File"] = ((PdfString)file).ToUnicodeString();
                                        }
                                    }
                                }
                                PdfObject newWindow = PdfReader.GetPdfObjectRelease(action.Get(PdfName.NEWWINDOW));
                                if (newWindow != null)
                                {
                                    map["NewWindow"] = newWindow.ToString();
                                }
                            }
                            else if (PdfName.LAUNCH.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S))))
                            {
                                map["Action"] = "Launch";
                                PdfObject file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.F));
                                if (file == null)
                                {
                                    file = PdfReader.GetPdfObjectRelease(action.Get(PdfName.WIN));
                                }
                                if (file != null)
                                {
                                    if (file.IsString())
                                    {
                                        map["File"] = ((PdfString)file).ToUnicodeString();
                                    }
                                    else if (file.IsDictionary())
                                    {
                                        file = PdfReader.GetPdfObjectRelease(((PdfDictionary)file).Get(PdfName.F));
                                        if (file.IsString())
                                        {
                                            map["File"] = ((PdfString)file).ToUnicodeString();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch  {
                    //empty on purpose
                }
                PdfDictionary first = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.FIRST));
                if (first != null)
                {
                    map["Kids"] = BookmarkDepth(reader, first, pages);
                }
                list.Add(map);
                outline = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.NEXT));
            }
            return(list);
        }
예제 #19
0
 private void DoType1TT()
 {
     PdfObject enc = PdfReader.GetPdfObject(font.Get(PdfName.ENCODING));
     if (enc == null)
         FillEncoding(null);
     else {
         if (enc.IsName())
             FillEncoding((PdfName)enc);
         else {
             PdfDictionary encDic = (PdfDictionary)enc;
             enc = PdfReader.GetPdfObject(encDic.Get(PdfName.BASEENCODING));
             if (enc == null)
                 FillEncoding(null);
             else
                 FillEncoding((PdfName)enc);
             PdfArray diffs = encDic.GetAsArray(PdfName.DIFFERENCES);
             if (diffs != null) {
                 diffmap = new IntHashtable();
                 int currentNumber = 0;
                 for (int k = 0; k < diffs.Size; ++k) {
                     PdfObject obj = diffs[k];
                     if (obj.IsNumber())
                         currentNumber = ((PdfNumber)obj).IntValue;
                     else {
                         int[] c = GlyphList.NameToUnicode(PdfName.DecodeName(((PdfName)obj).ToString()));
                         if (c != null && c.Length > 0) {
                             uni2byte[c[0]] = currentNumber;
                             diffmap[c[0]] = currentNumber;
                         }
                         ++currentNumber;
                     }
                 }
             }
         }
     }
     PdfArray newWidths = font.GetAsArray(PdfName.WIDTHS);
     PdfNumber first = font.GetAsNumber(PdfName.FIRSTCHAR);
     PdfNumber last = font.GetAsNumber(PdfName.LASTCHAR);
     if (BuiltinFonts14.ContainsKey(fontName)) {
         BaseFont bf;
             bf = BaseFont.CreateFont(fontName, WINANSI, false);
         int[] e = uni2byte.ToOrderedKeys();
         for (int k = 0; k < e.Length; ++k) {
             int n = uni2byte[e[k]];
             widths[n] = bf.GetRawWidth(n, GlyphList.UnicodeToName(e[k]));
         }
         if (diffmap != null) { //widths for differences must override existing ones
             e = diffmap.ToOrderedKeys();
             for (int k = 0; k < e.Length; ++k) {
                 int n = diffmap[e[k]];
                 widths[n] = bf.GetRawWidth(n, GlyphList.UnicodeToName(e[k]));
             }
             diffmap = null;
         }
         Ascender = bf.GetFontDescriptor(ASCENT, 1000);
         CapHeight = bf.GetFontDescriptor(CAPHEIGHT, 1000);
         Descender = bf.GetFontDescriptor(DESCENT, 1000);
         ItalicAngle = bf.GetFontDescriptor(ITALICANGLE, 1000);
         llx = bf.GetFontDescriptor(BBOXLLX, 1000);
         lly = bf.GetFontDescriptor(BBOXLLY, 1000);
         urx = bf.GetFontDescriptor(BBOXURX, 1000);
         ury = bf.GetFontDescriptor(BBOXURY, 1000);
     }
     if (first != null && last != null && newWidths != null) {
         int f = first.IntValue;
         for (int k = 0; k < newWidths.Size; ++k) {
             widths[f + k] = newWidths.GetAsNumber(k).IntValue;
         }
     }
     FillFontDesc(font.GetAsDict(PdfName.FONTDESCRIPTOR));
 }
예제 #20
0
        /** Converts a <CODE>String</CODE> to a </CODE>byte</CODE> array according
         * to the font's encoding.
         * @return an array of <CODE>byte</CODE> representing the conversion according to the font's encoding
         * @param encoding the encoding
         * @param char1 the <CODE>char</CODE> to be converted
         */
        public static byte[] ConvertToBytes(char char1, String encoding)
        {
            if (encoding == null || encoding.Length == 0)
            {
                return new byte[] { (byte)char1 }
            }
            ;
            IExtraEncoding extra = (IExtraEncoding)extraEncodings[encoding.ToLower(CultureInfo.InvariantCulture)];

            if (extra != null)
            {
                byte[] b = extra.CharToByte(char1, encoding);

                if (b != null)
                {
                    return(b);
                }
            }
            IntHashtable hash = null;

            if (encoding.Equals(BaseFont.WINANSI))
            {
                hash = winansi;
            }
            else if (encoding.Equals(PdfObject.TEXT_PDFDOCENCODING))
            {
                hash = pdfEncoding;
            }
            if (hash != null)
            {
                int c = 0;
                if (char1 < 128 || (char1 > 160 && char1 <= 255))
                {
                    c = char1;
                }
                else
                {
                    c = hash[char1];
                }
                if (c != 0)
                {
                    return new byte[] { (byte)c }
                }
                ;
                else
                {
                    return(new byte[0]);
                }
            }
            Encoding encw = IanaEncodings.GetEncodingEncoding(encoding);

            byte[] preamble = encw.GetPreamble();
            char[] text     = new char[] { char1 };
            if (preamble.Length == 0)
            {
                return(encw.GetBytes(text));
            }
            byte[] encoded = encw.GetBytes(text);
            byte[] total   = new byte[encoded.Length + preamble.Length];
            Array.Copy(preamble, 0, total, 0, preamble.Length);
            Array.Copy(encoded, 0, total, preamble.Length, encoded.Length);
            return(total);
        }
예제 #21
0
 private void FillMetrics(byte[] touni, IntHashtable widths, int dw)
 {
     PdfContentParser ps = new PdfContentParser(new PRTokeniser(touni));
     PdfObject ob = null;
     PdfObject last = null;
     while ((ob = ps.ReadPRObject()) != null) {
         if (ob.Type == PdfContentParser.COMMAND_TYPE) {
             if (ob.ToString().Equals("beginbfchar")) {
                 int n = ((PdfNumber)last).IntValue;
                 for (int k = 0; k < n; ++k) {
                     String cid = DecodeString((PdfString)ps.ReadPRObject());
                     String uni = DecodeString((PdfString)ps.ReadPRObject());
                     if (uni.Length == 1) {
                         int cidc = (int)cid[0];
                         int unic = (int)uni[uni.Length - 1];
                         int w = dw;
                         if (widths.ContainsKey(cidc))
                             w = widths[cidc];
                         metrics[unic] = new int[]{cidc, w};
                     }
                 }
             }
             else if (ob.ToString().Equals("beginbfrange")) {
                 int n = ((PdfNumber)last).IntValue;
                 for (int k = 0; k < n; ++k) {
                     String cid1 = DecodeString((PdfString)ps.ReadPRObject());
                     String cid2 = DecodeString((PdfString)ps.ReadPRObject());
                     int cid1c = (int)cid1[0];
                     int cid2c = (int)cid2[0];
                     PdfObject ob2 = ps.ReadPRObject();
                     if (ob2.IsString()) {
                         String uni = DecodeString((PdfString)ob2);
                         if (uni.Length == 1) {
                             int unic = (int)uni[uni.Length - 1];
                             for (; cid1c <= cid2c; cid1c++, unic++) {
                                 int w = dw;
                                 if (widths.ContainsKey(cid1c))
                                     w = widths[cid1c];
                                 metrics[unic] = new int[]{cid1c, w};
                             }
                         }
                     }
                     else {
                         PdfArray a = (PdfArray)ob2;
                         for (int j = 0; j < a.Size; ++j, ++cid1c) {
                             String uni = DecodeString(a.GetAsString(j));
                             if (uni.Length == 1) {
                                 int unic = (int)uni[uni.Length - 1];
                                 int w = dw;
                                 if (widths.ContainsKey(cid1c))
                                     w = widths[cid1c];
                                 metrics[unic] = new int[]{cid1c, w};
                             }
                         }
                     }
                 }
             }
         }
         else
             last = ob;
     }
 }
예제 #22
0
 private IntHashtable ReadWidths(PdfArray ws)
 {
     IntHashtable hh = new IntHashtable();
     if (ws == null)
         return hh;
     for (int k = 0; k < ws.Size; ++k) {
         int c1 = ((PdfNumber)PdfReader.GetPdfObjectRelease(ws[k])).IntValue;
         PdfObject obj = PdfReader.GetPdfObjectRelease(ws[++k]);
         if (obj.IsArray()) {
             PdfArray a2 = (PdfArray)obj;
             for (int j = 0; j < a2.Size; ++j) {
                 int c2 = ((PdfNumber)PdfReader.GetPdfObjectRelease(a2[j])).IntValue;
                 hh[c1++] = c2;
             }
         }
         else {
             int c2 = ((PdfNumber)obj).IntValue;
             int w = ((PdfNumber)PdfReader.GetPdfObjectRelease(ws[++k])).IntValue;
             for (; c1 <= c2; ++c1)
                 hh[c1] = w;
         }
     }
     return hh;
 }
예제 #23
0
 /** Creates new PdfStamperImp.
 * @param reader the read PDF
 * @param os the output destination
 * @param pdfVersion the new pdf version or '\0' to keep the same version as the original
 * document
 * @param append
 * @throws DocumentException on error
 * @throws IOException
 */
 internal PdfStamperImp(PdfReader reader, Stream os, char pdfVersion, bool append)
     : base(new PdfDocument(), os)
 {
     if (!reader.IsOpenedWithFullPermissions)
         throw new BadPasswordException("PdfReader not opened with owner password");
     if (reader.Tampered)
         throw new DocumentException("The original document was reused. Read it again from file.");
     reader.Tampered = true;
     this.reader = reader;
     file = reader.SafeFile;
     this.append = append;
     if (append) {
         if (reader.IsRebuilt())
             throw new DocumentException("Append mode requires a document without errors even if recovery was possible.");
         if (reader.IsEncrypted())
             crypto = new PdfEncryption(reader.Decrypt);
         pdf_version.SetAppendmode(true);
         file.ReOpen();
         byte[] buf = new byte[8192];
         int n;
         while ((n = file.Read(buf)) > 0)
             this.os.Write(buf, 0, n);
         file.Close();
         prevxref = reader.LastXref;
         reader.Appendable = true;
     }
     else {
         if (pdfVersion == 0)
             base.PdfVersion = reader.PdfVersion;
         else
             base.PdfVersion = pdfVersion;
     }
     base.Open();
     pdf.AddWriter(this);
     if (append) {
         body.Refnum = reader.XrefSize;
         marked = new IntHashtable();
         if (reader.IsNewXrefType())
             fullCompression = true;
         if (reader.IsHybridXref())
             fullCompression = false;
     }
     initialXrefSize = reader.XrefSize;
 }
예제 #24
0
 public IntHashtable Clone()
 {
     IntHashtable t = new IntHashtable();
     t.count = count;
     t.loadFactor = loadFactor;
     t.threshold = threshold;
     t.table = new IntHashtableEntry[table.Length];
     for (int i = table.Length ; i-- > 0 ; ) {
         t.table[i] = (table[i] != null)
         ? (IntHashtableEntry)table[i].Clone() : null;
     }
     return t;
 }
예제 #25
0
 /**
 * @param fdf
 * @throws IOException
 */
 public void AddComments(FdfReader fdf)
 {
     if (readers2intrefs.ContainsKey(fdf))
         return;
     PdfDictionary catalog = fdf.Catalog;
     catalog = catalog.GetAsDict(PdfName.FDF);
     if (catalog == null)
         return;
     PdfArray annots = catalog.GetAsArray(PdfName.ANNOTS);
     if (annots == null || annots.Size == 0)
         return;
     RegisterReader(fdf, false);
     IntHashtable hits = new IntHashtable();
     Hashtable irt = new Hashtable();
     ArrayList an = new ArrayList();
     for (int k = 0; k < annots.Size; ++k) {
         PdfObject obj = annots[k];
         PdfDictionary annot = (PdfDictionary)PdfReader.GetPdfObject(obj);
         PdfNumber page = annot.GetAsNumber(PdfName.PAGE);
         if (page == null || page.IntValue >= reader.NumberOfPages)
             continue;
         FindAllObjects(fdf, obj, hits);
         an.Add(obj);
         if (obj.Type == PdfObject.INDIRECT) {
             PdfObject nm = PdfReader.GetPdfObject(annot.Get(PdfName.NM));
             if (nm != null && nm.Type == PdfObject.STRING)
                 irt[nm.ToString()] = obj;
         }
     }
     int[] arhits = hits.GetKeys();
     for (int k = 0; k < arhits.Length; ++k) {
         int n = arhits[k];
         PdfObject obj = fdf.GetPdfObject(n);
         if (obj.Type == PdfObject.DICTIONARY) {
             PdfObject str = PdfReader.GetPdfObject(((PdfDictionary)obj).Get(PdfName.IRT));
             if (str != null && str.Type == PdfObject.STRING) {
                 PdfObject i = (PdfObject)irt[str.ToString()];
                 if (i != null) {
                     PdfDictionary dic2 = new PdfDictionary();
                     dic2.Merge((PdfDictionary)obj);
                     dic2.Put(PdfName.IRT, i);
                     obj = dic2;
                 }
             }
         }
         AddToBody(obj, GetNewObjectNumber(fdf, n, 0));
     }
     for (int k = 0; k < an.Count; ++k) {
         PdfObject obj = (PdfObject)an[k];
         PdfDictionary annot = (PdfDictionary)PdfReader.GetPdfObject(obj);
         PdfNumber page = annot.GetAsNumber(PdfName.PAGE);
         PdfDictionary dic = reader.GetPageN(page.IntValue + 1);
         PdfArray annotsp = (PdfArray)PdfReader.GetPdfObject(dic.Get(PdfName.ANNOTS), dic);
         if (annotsp == null) {
             annotsp = new PdfArray();
             dic.Put(PdfName.ANNOTS, annotsp);
             MarkUsed(dic);
         }
         MarkUsed(annotsp);
         annotsp.Add(obj);
     }
 }
예제 #26
0
 public InstHit(int[] inst)
 {
     if (inst == null)
         return;
     hits = new IntHashtable();
     for (int k = 0; k < inst.Length; ++k)
         hits[inst[k]] = 1;
 }
예제 #27
0
 /**
 * @param reader
 * @param openFile
 * @throws IOException
 */
 public void RegisterReader(PdfReader reader, bool openFile)
 {
     if (readers2intrefs.ContainsKey(reader))
         return;
     readers2intrefs[reader] = new IntHashtable();
     if (openFile) {
         RandomAccessFileOrArray raf = reader.SafeFile;
         readers2file[reader] = raf;
         raf.ReOpen();
     }
 }
예제 #28
0
 internal static string ConvertToHCIDMetrics(int[] keys, IntHashtable h)
 {
     if (keys.Length == 0)
     return null;
     int lastCid = 0;
     int lastValue = 0;
     int start;
     for (start = 0; start < keys.Length; ++start) {
     lastCid = keys[start];
     lastValue = h[lastCid];
     if (lastValue != 0) {
         ++start;
         break;
     }
     }
     if (lastValue == 0)
     return null;
     StringBuilder buf = new StringBuilder();
     buf.Append('[');
     buf.Append(lastCid);
     int state = FIRST;
     for (int k = start; k < keys.Length; ++k) {
     int cid = keys[k];
     int value = h[cid];
     if (value == 0)
         continue;
     switch (state) {
         case FIRST: {
             if (cid == lastCid + 1 && value == lastValue) {
                 state = SERIAL;
             }
             else if (cid == lastCid + 1) {
                 state = BRACKET;
                 buf.Append('[').Append(lastValue);
             }
             else {
                 buf.Append('[').Append(lastValue).Append(']').Append(cid);
             }
             break;
         }
         case BRACKET: {
             if (cid == lastCid + 1 && value == lastValue) {
                 state = SERIAL;
                 buf.Append(']').Append(lastCid);
             }
             else if (cid == lastCid + 1) {
                 buf.Append(' ').Append(lastValue);
             }
             else {
                 state = FIRST;
                 buf.Append(' ').Append(lastValue).Append(']').Append(cid);
             }
             break;
         }
         case SERIAL: {
             if (cid != lastCid + 1 || value != lastValue) {
                 buf.Append(' ').Append(lastCid).Append(' ').Append(lastValue).Append(' ').Append(cid);
                 state = FIRST;
             }
             break;
         }
     }
     lastValue = value;
     lastCid = cid;
     }
     switch (state) {
     case FIRST: {
         buf.Append('[').Append(lastValue).Append("]]");
         break;
     }
     case BRACKET: {
         buf.Append(' ').Append(lastValue).Append("]]");
         break;
     }
     case SERIAL: {
         buf.Append(' ').Append(lastCid).Append(' ').Append(lastValue).Append(']');
         break;
     }
     }
     return buf.ToString();
 }
예제 #29
0
 internal static void FindAllObjects(PdfReader reader, PdfObject obj, IntHashtable hits)
 {
     if (obj == null)
         return;
     switch (obj.Type) {
         case PdfObject.INDIRECT:
             PRIndirectReference iref = (PRIndirectReference)obj;
             if (reader != iref.Reader)
                 return;
             if (hits.ContainsKey(iref.Number))
                 return;
             hits[iref.Number] = 1;
             FindAllObjects(reader, PdfReader.GetPdfObject(obj), hits);
             return;
         case PdfObject.ARRAY:
             PdfArray a = (PdfArray)obj;
             for (int k = 0; k < a.Size; ++k) {
                 FindAllObjects(reader, a[k], hits);
             }
             return;
         case PdfObject.DICTIONARY:
         case PdfObject.STREAM:
             PdfDictionary dic = (PdfDictionary)obj;
             foreach (PdfName name in dic.Keys) {
                 FindAllObjects(reader, dic.Get(name), hits);
             }
             return;
     }
 }
예제 #30
0
 internal static IntHashtable CreateMetric(string s)
 {
     IntHashtable h = new IntHashtable();
     StringTokenizer tk = new StringTokenizer(s);
     while (tk.HasMoreTokens()) {
     int n1 = int.Parse(tk.NextToken());
     h[n1] = int.Parse(tk.NextToken());
     }
     return h;
 }
예제 #31
0
        /** Creates a CJK font.
         * @param fontName the name of the font
         * @param enc the encoding of the font
         * @param emb always <CODE>false</CODE>. CJK font and not embedded
         * @throws DocumentException on error
         * @throws IOException on error
         */
        internal CJKFont(string fontName, string enc, bool emb)
        {
            LoadProperties();
            this.FontType = FONT_TYPE_CJK;
            string nameBase = GetBaseName(fontName);

            if (!IsCJKFont(nameBase, enc))
            {
                throw new DocumentException("Font '" + fontName + "' with '" + enc + "' encoding is not a CJK font.");
            }
            if (nameBase.Length < fontName.Length)
            {
                style    = fontName.Substring(nameBase.Length);
                fontName = nameBase;
            }
            this.fontName = fontName;
            encoding      = CJK_ENCODING;
            vertical      = enc.EndsWith("V");
            CMap          = enc;
            if (enc.StartsWith("Identity-"))
            {
                cidDirect = true;
                string s = cjkFonts[fontName];
                s = s.Substring(0, s.IndexOf('_'));
                char[] c = (char[])allCMaps[s];
                if (c == null)
                {
                    c = ReadCMap(s);
                    if (c == null)
                    {
                        throw new DocumentException("The cmap " + s + " does not exist as a resource.");
                    }
                    c[CID_NEWLINE] = '\n';
                    allCMaps.Add(s, c);
                }
                translationMap = c;
            }
            else
            {
                char[] c = (char[])allCMaps[enc];
                if (c == null)
                {
                    string s = cjkEncodings[enc];
                    if (s == null)
                    {
                        throw new DocumentException("The resource cjkencodings.properties does not contain the encoding " + enc);
                    }
                    StringTokenizer tk = new StringTokenizer(s);
                    string          nt = tk.NextToken();
                    c = (char[])allCMaps[nt];
                    if (c == null)
                    {
                        c = ReadCMap(nt);
                        allCMaps.Add(nt, c);
                    }
                    if (tk.HasMoreTokens())
                    {
                        string nt2 = tk.NextToken();
                        char[] m2  = ReadCMap(nt2);
                        for (int k = 0; k < 0x10000; ++k)
                        {
                            if (m2[k] == 0)
                            {
                                m2[k] = c[k];
                            }
                        }
                        allCMaps.Add(enc, m2);
                        c = m2;
                    }
                }
                translationMap = c;
            }
            fontDesc = (Hashtable)allFonts[fontName];
            if (fontDesc == null)
            {
                fontDesc = ReadFontProperties(fontName);
                allFonts.Add(fontName, fontDesc);
            }
            hMetrics = (IntHashtable)fontDesc["W"];
            vMetrics = (IntHashtable)fontDesc["W2"];
        }
예제 #32
0
 /** Each font used in a document has an instance of this class.
  * This class stores the characters used in the document and other
  * specifics unique to the current working document.
  * @param fontName the font name
  * @param indirectReference the indirect reference to the font
  * @param baseFont the <CODE>BaseFont</CODE>
  */
 internal FontDetails(PdfName fontName, PdfIndirectReference indirectReference, BaseFont baseFont)
 {
     this.fontName = fontName;
     this.indirectReference = indirectReference;
     this.baseFont = baseFont;
     fontType = baseFont.FontType;
     switch (fontType) {
         case BaseFont.FONT_TYPE_T1:
         case BaseFont.FONT_TYPE_TT:
             shortTag = new byte[256];
             break;
         case BaseFont.FONT_TYPE_CJK:
             cjkTag = new IntHashtable();
             cjkFont = (CJKFont)baseFont;
             break;
         case BaseFont.FONT_TYPE_TTUNI:
             longTag = new Hashtable();
             ttu = (TrueTypeFontUnicode)baseFont;
             symbolic = baseFont.IsFontSpecific();
             break;
     }
 }
예제 #33
0
 /**
 * Gets a <CODE>List</CODE> with the bookmarks. It returns <CODE>null</CODE> if
 * the document doesn't have any bookmarks.
 * @param reader the document
 * @return a <CODE>List</CODE> with the bookmarks or <CODE>null</CODE> if the
 * document doesn't have any
 */
 public static ArrayList GetBookmark(PdfReader reader)
 {
     PdfDictionary catalog = reader.Catalog;
     PdfObject obj = PdfReader.GetPdfObjectRelease(catalog.Get(PdfName.OUTLINES));
     if (obj == null || !obj.IsDictionary())
         return null;
     PdfDictionary outlines = (PdfDictionary)obj;
     IntHashtable pages = new IntHashtable();
     int numPages = reader.NumberOfPages;
     for (int k = 1; k <= numPages; ++k) {
         pages[reader.GetPageOrigRef(k).Number] = k;
         reader.ReleasePage(k);
     }
     return BookmarkDepth(reader, (PdfDictionary)PdfReader.GetPdfObjectRelease(outlines.Get(PdfName.FIRST)), pages);
 }