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); }
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); }
/** * 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); }
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; }
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; }
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(); }
/** 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; }
protected internal bool IsVisited(PdfReader reader, int number, int generation) { IntHashtable refs = (IntHashtable)readers2intrefs[reader]; return(refs.ContainsKey(number)); }
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); }
/** * 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); }
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()); }
/** * 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); }
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)); }
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; } } }
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"; }
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(); }
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); }
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)); }
/** 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); }
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; } }
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; }
/** 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; }
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; }
/** * @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); } }
public InstHit(int[] inst) { if (inst == null) return; hits = new IntHashtable(); for (int k = 0; k < inst.Length; ++k) hits[inst[k]] = 1; }
/** * @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(); } }
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(); }
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; } }
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; }
/** 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"]; }
/** 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; } }
/** * 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); }