internal override void WriteFont(PdfWriter writer, PdfIndirectReference piRef, object[] oParams) { if (_writer != writer) { throw new ArgumentException("Type3 font used with the wrong PdfWriter"); } // Get first & lastchar ... int firstChar = 0; while (firstChar < _usedSlot.Length && !_usedSlot[firstChar]) { firstChar++; } if (firstChar == _usedSlot.Length) { throw new DocumentException("No glyphs defined for Type3 font"); } int lastChar = _usedSlot.Length - 1; while (lastChar >= firstChar && !_usedSlot[lastChar]) { lastChar--; } int[] localWidths = new int[lastChar - firstChar + 1]; int[] invOrd = new int[lastChar - firstChar + 1]; int invOrdIndx = 0, w = 0; for (int u = firstChar; u <= lastChar; u++, w++) { if (_usedSlot[u]) { invOrd[invOrdIndx++] = u; localWidths[w] = _widths3[u]; } } PdfArray diffs = new PdfArray(); PdfDictionary charprocs = new PdfDictionary(); int last = -1; for (int k = 0; k < invOrdIndx; ++k) { int c = invOrd[k]; if (c > last) { last = c; diffs.Add(new PdfNumber(last)); } ++last; int c2 = invOrd[k]; string s = GlyphList.UnicodeToName(c2); if (s == null) { s = "a" + c2; } PdfName n = new PdfName(s); diffs.Add(n); Type3Glyph glyph = (Type3Glyph)_char2Glyph[(char)c2]; PdfStream stream = new PdfStream(glyph.ToPdf(null)); stream.FlateCompress(compressionLevel); PdfIndirectReference refp = writer.AddToBody(stream).IndirectReference; charprocs.Put(n, refp); } PdfDictionary font = new PdfDictionary(PdfName.Font); font.Put(PdfName.Subtype, PdfName.Type3); if (_colorized) { font.Put(PdfName.Fontbbox, new PdfRectangle(0, 0, 0, 0)); } else { font.Put(PdfName.Fontbbox, new PdfRectangle(_llx, _lly, _urx, _ury)); } font.Put(PdfName.Fontmatrix, new PdfArray(new[] { 0.001f, 0, 0, 0.001f, 0, 0 })); font.Put(PdfName.Charprocs, writer.AddToBody(charprocs).IndirectReference); PdfDictionary localEncoding = new PdfDictionary(); localEncoding.Put(PdfName.Differences, diffs); font.Put(PdfName.Encoding, writer.AddToBody(localEncoding).IndirectReference); font.Put(PdfName.Firstchar, new PdfNumber(firstChar)); font.Put(PdfName.Lastchar, new PdfNumber(lastChar)); font.Put(PdfName.Widths, writer.AddToBody(new PdfArray(localWidths)).IndirectReference); if (_pageResources.HasResources()) { font.Put(PdfName.Resources, writer.AddToBody(_pageResources.Resources).IndirectReference); } writer.AddToBody(font, piRef); }
internal protected virtual void WriteFont(TrueTypeFontUnicode font, PdfIndirectReference refer, Object[] parms, byte[] rotbits) { Dictionary <int, int[]> longTag = (Dictionary <int, int[]>)parms[0]; font.AddRangeUni(longTag, true, font.Subset); int[][] metrics = new int[longTag.Count][]; longTag.Values.CopyTo(metrics, 0); Array.Sort(metrics, font); PdfIndirectReference ind_font = null; PdfObject pobj = null; PdfIndirectObject obj = null; // sivan: cff if (font.Cff) { byte[] b = font.ReadCffFont(); if (font.Subset || font.SubsetRanges != null) { CFFFontSubset cff = new CFFFontSubset(new RandomAccessFileOrArray(b), longTag); try { b = cff.Process(cff.GetNames()[0]); } catch (Exception e) { // temporary fix for cff subset failure font.Subset = false; font.AddRangeUni(longTag, true, font.Subset); metrics = new int[longTag.Count][]; longTag.Values.CopyTo(metrics, 0); Array.Sort(metrics, font); } } pobj = new BaseFont.StreamFont(b, "CIDFontType0C", font.CompressionLevel); obj = writer.AddToBody(pobj); ind_font = obj.IndirectReference; } else { byte[] b; if (font.Subset || font.DirectoryOffset != 0) { lock (font.Rf) { TrueTypeFontSubSet sb = new TrueTypeFontSubSet(font.FileName, new RandomAccessFileOrArray(font.Rf), new HashSet2 <int>(longTag.Keys), font.DirectoryOffset, true, false); b = sb.Process(); } } else { b = font.GetFullFont(); } int[] lengths = new int[] { b.Length }; pobj = new BaseFont.StreamFont(b, lengths, font.CompressionLevel); obj = writer.AddToBody(pobj); ind_font = obj.IndirectReference; } String subsetPrefix = ""; if (font.Subset) { subsetPrefix = TrueTypeFontUnicode.CreateSubsetPrefix(); } PdfDictionary dic = font.GetFontDescriptor(ind_font, subsetPrefix, null); obj = writer.AddToBody(dic); ind_font = obj.IndirectReference; pobj = font.GetCIDFontType2(ind_font, subsetPrefix, metrics); obj = writer.AddToBody(pobj); ind_font = obj.IndirectReference; pobj = font.GetToUnicode(metrics); PdfIndirectReference toUnicodeRef = null; if (pobj != null) { obj = writer.AddToBody(pobj); toUnicodeRef = obj.IndirectReference; } pobj = font.GetFontBaseType(ind_font, subsetPrefix, toUnicodeRef); writer.AddToBody(pobj, refer); }
public PdfArray RotateAnnotations(PdfWriter writer, Rectangle pageSize) { PdfArray array = new PdfArray(); int rotation = pageSize.Rotation % 360; int currentPage = writer.CurrentPageNumber; for (int k = 0; k < annotations.Count; ++k) { PdfAnnotation dic = annotations[k]; int page = dic.PlaceInPage; if (page > currentPage) { delayedAnnotations.Add(dic); continue; } if (dic.IsForm()) { if (!dic.IsUsed()) { Dictionary <PdfTemplate, object> templates = dic.Templates; if (templates != null) { acroForm.AddFieldTemplates(templates); } } PdfFormField field = (PdfFormField)dic; if (field.Parent == null) { acroForm.AddDocumentField(field.IndirectReference); } } if (dic.IsAnnotation()) { array.Add(dic.IndirectReference); if (!dic.IsUsed()) { PdfArray tmp = dic.GetAsArray(PdfName.RECT); PdfRectangle rect; if (tmp.Size == 4) { rect = new PdfRectangle(tmp.GetAsNumber(0).FloatValue, tmp.GetAsNumber(1).FloatValue, tmp.GetAsNumber(2).FloatValue, tmp.GetAsNumber(3).FloatValue); } else { rect = new PdfRectangle(tmp.GetAsNumber(0).FloatValue, tmp.GetAsNumber(1).FloatValue); } if (rect != null) { switch (rotation) { case 90: dic.Put(PdfName.RECT, new PdfRectangle( pageSize.Top - rect.Bottom, rect.Left, pageSize.Top - rect.Top, rect.Right)); break; case 180: dic.Put(PdfName.RECT, new PdfRectangle( pageSize.Right - rect.Left, pageSize.Top - rect.Bottom, pageSize.Right - rect.Right, pageSize.Top - rect.Top)); break; case 270: dic.Put(PdfName.RECT, new PdfRectangle( rect.Bottom, pageSize.Right - rect.Left, rect.Top, pageSize.Right - rect.Right)); break; } } } } if (!dic.IsUsed()) { dic.SetUsed(); writer.AddToBody(dic, dic.IndirectReference); } } return(array); }
public static Object[] IterateOutlines(PdfWriter writer, PdfIndirectReference parent, ArrayList kids, bool namedAsNames) { PdfIndirectReference[] refs = new PdfIndirectReference[kids.Count]; for (int k = 0; k < refs.Length; ++k) { refs[k] = writer.PdfIndirectReference; } int ptr = 0; int count = 0; foreach (Hashtable map in kids) { Object[] lower = null; ArrayList subKid = (ArrayList)map["Kids"]; if (subKid != null && subKid.Count > 0) { lower = IterateOutlines(writer, refs[ptr], subKid, namedAsNames); } PdfDictionary outline = new PdfDictionary(); ++count; if (lower != null) { outline.Put(PdfName.FIRST, (PdfIndirectReference)lower[0]); outline.Put(PdfName.LAST, (PdfIndirectReference)lower[1]); int n = (int)lower[2]; if ("false".Equals(map["Open"])) { outline.Put(PdfName.COUNT, new PdfNumber(-n)); } else { outline.Put(PdfName.COUNT, new PdfNumber(n)); count += n; } } outline.Put(PdfName.PARENT, parent); if (ptr > 0) { outline.Put(PdfName.PREV, refs[ptr - 1]); } if (ptr < refs.Length - 1) { outline.Put(PdfName.NEXT, refs[ptr + 1]); } outline.Put(PdfName.TITLE, new PdfString((String)map["Title"], PdfObject.TEXT_UNICODE)); String color = (String)map["Color"]; if (color != null) { try { PdfArray arr = new PdfArray(); StringTokenizer tk = new StringTokenizer(color); for (int k = 0; k < 3; ++k) { float f = float.Parse(tk.NextToken(), System.Globalization.NumberFormatInfo.InvariantInfo); if (f < 0) { f = 0; } if (f > 1) { f = 1; } arr.Add(new PdfNumber(f)); } outline.Put(PdfName.C, arr); } catch {} //in case it's malformed } String style = (String)map["Style"]; if (style != null) { style = style.ToLower(); int bits = 0; if (style.IndexOf("italic") >= 0) { bits |= 1; } if (style.IndexOf("bold") >= 0) { bits |= 2; } if (bits != 0) { outline.Put(PdfName.F, new PdfNumber(bits)); } } CreateOutlineAction(outline, map, writer, namedAsNames); writer.AddToBody(outline, refs[ptr]); ++ptr; } return(new Object[] { refs[0], refs[refs.Length - 1], count }); }
virtual public void AddToBody() { Put(PdfName.SHADING, ShadingReference); Put(PdfName.MATRIX, new PdfArray(matrix)); writer.AddToBody(this, PatternReference); }
void outputDss() { PdfWriter writer = pdfStamper.Writer; PdfReader reader = pdfStamper.Reader; PdfDictionary dss = new PdfDictionary(); PdfDictionary vrim = new PdfDictionary(); PdfArray ocsps = new PdfArray(); PdfArray crls = new PdfArray(); PdfArray certs = new PdfArray(); writer.AddDeveloperExtension(PdfDeveloperExtension.ESIC_1_7_EXTENSIONLEVEL5); writer.AddDeveloperExtension(new PdfDeveloperExtension(PdfName.ADBE, new PdfName("1.7"), 8)); PdfDictionary catalog = reader.Catalog; pdfStamper.MarkUsed(catalog); foreach (PdfName vkey in validated.Keys) { PdfArray ocsp = new PdfArray(); PdfArray crl = new PdfArray(); PdfArray cert = new PdfArray(); PdfDictionary vri = new PdfDictionary(); foreach (byte[] b in validated[vkey].crls) { PdfStream ps = new PdfStream(b); ps.FlateCompress(); PdfIndirectReference iref = writer.AddToBody(ps, false).IndirectReference; crl.Add(iref); crls.Add(iref); } foreach (byte[] b in validated[vkey].ocsps) { PdfStream ps = new PdfStream(buildOCSPResponse(b)); ps.FlateCompress(); PdfIndirectReference iref = writer.AddToBody(ps, false).IndirectReference; ocsp.Add(iref); ocsps.Add(iref); } foreach (byte[] b in validated[vkey].certs) { PdfStream ps = new PdfStream(b); ps.FlateCompress(); PdfIndirectReference iref = writer.AddToBody(ps, false).IndirectReference; cert.Add(iref); certs.Add(iref); } if (ocsp.Length > 0) { vri.Put(PdfName.OCSP, writer.AddToBody(ocsp, false).IndirectReference); } if (crl.Length > 0) { vri.Put(PdfName.CRL, writer.AddToBody(crl, false).IndirectReference); } if (cert.Length > 0) { vri.Put(PdfName.CERT, writer.AddToBody(cert, false).IndirectReference); } vri.Put(PdfName.TU, new PdfDate()); vrim.Put(vkey, writer.AddToBody(vri, false).IndirectReference); } dss.Put(PdfName.VRI, writer.AddToBody(vrim, false).IndirectReference); if (ocsps.Length > 0) { dss.Put(PdfName.OCSPS, writer.AddToBody(ocsps, false).IndirectReference); } if (crls.Length > 0) { dss.Put(PdfName.CRLS, writer.AddToBody(crls, false).IndirectReference); } if (certs.Length > 0) { dss.Put(PdfName.CERTS, writer.AddToBody(certs, false).IndirectReference); } catalog.Put(PdfName.DSS, writer.AddToBody(dss, false).IndirectReference); }
internal override void WriteFont(PdfWriter writer, PdfIndirectReference piRef, Object[] oParams) { if (this.writer != writer) { throw new ArgumentException("Type3 font used with the wrong PdfWriter"); } // Get first & lastchar ... int firstChar = 0; while (firstChar < usedSlot.Length && !usedSlot[firstChar]) { firstChar++; } if (firstChar == usedSlot.Length) { throw new DocumentException("No glyphs defined for Type3 font"); } int lastChar = usedSlot.Length - 1; while (lastChar >= firstChar && !usedSlot[lastChar]) { lastChar--; } int[] widths = new int[lastChar - firstChar + 1]; int[] invOrd = new int[lastChar - firstChar + 1]; int invOrdIndx = 0, w = 0; for (int u = firstChar; u <= lastChar; u++, w++) { if (usedSlot[u]) { invOrd[invOrdIndx++] = u; widths[w] = widths3[u]; } } PdfArray diffs = new PdfArray(); PdfDictionary charprocs = new PdfDictionary(); int last = -1; for (int k = 0; k < invOrdIndx; ++k) { int c = invOrd[k]; if (c > last) { last = c; diffs.Add(new PdfNumber(last)); } ++last; int c2 = invOrd[k]; String s = GlyphList.UnicodeToName(c2); if (s == null) { s = "a" + c2; } PdfName n = new PdfName(s); diffs.Add(n); Type3Glyph glyph = (Type3Glyph)char2glyph[(char)c2]; PdfStream stream = new PdfStream(glyph.ToPdf(null)); stream.FlateCompress(compressionLevel); PdfIndirectReference refp = writer.AddToBody(stream).IndirectReference; charprocs.Put(n, refp); } PdfDictionary font = new PdfDictionary(PdfName.FONT); font.Put(PdfName.SUBTYPE, PdfName.TYPE3); if (colorized) { font.Put(PdfName.FONTBBOX, new PdfRectangle(0, 0, 0, 0)); } else { font.Put(PdfName.FONTBBOX, new PdfRectangle(llx, lly, urx, ury)); } font.Put(PdfName.FONTMATRIX, new PdfArray(new float[] { 0.001f, 0, 0, 0.001f, 0, 0 })); font.Put(PdfName.CHARPROCS, writer.AddToBody(charprocs).IndirectReference); PdfDictionary encoding = new PdfDictionary(); encoding.Put(PdfName.DIFFERENCES, diffs); font.Put(PdfName.ENCODING, writer.AddToBody(encoding).IndirectReference); font.Put(PdfName.FIRSTCHAR, new PdfNumber(firstChar)); font.Put(PdfName.LASTCHAR, new PdfNumber(lastChar)); font.Put(PdfName.WIDTHS, writer.AddToBody(new PdfArray(widths)).IndirectReference); if (pageResources.HasResources()) { font.Put(PdfName.RESOURCES, writer.AddToBody(pageResources.Resources).IndirectReference); } writer.AddToBody(font, piRef); }
/** Outputs to the writer the font dictionaries and streams. * @param writer the writer for this document * @param ref the font indirect reference * @param parms several parameters that depend on the font type * @throws IOException on error * @throws DocumentException error in generating the object */ internal override void WriteFont(PdfWriter writer, PdfIndirectReference piref, Object[] parms) { Hashtable longTag = (Hashtable)parms[0]; AddRangeUni(longTag, true, subset); ArrayList tmp = new ArrayList(); foreach (object o in longTag.Values) { tmp.Add(o); } Object[] metrics = tmp.ToArray(); Array.Sort(metrics, this); PdfIndirectReference ind_font = null; PdfObject pobj = null; PdfIndirectObject obj = null; PdfIndirectReference cidset = null; if (writer.PDFXConformance == PdfWriter.PDFA1A || writer.PDFXConformance == PdfWriter.PDFA1B) { PdfStream stream; if (metrics.Length == 0) { stream = new PdfStream(new byte[] { (byte)0x80 }); } else { int top = ((int[])metrics[metrics.Length - 1])[0]; byte[] bt = new byte[top / 8 + 1]; for (int k = 0; k < metrics.Length; ++k) { int v = ((int[])metrics[k])[0]; bt[v / 8] |= rotbits[v % 8]; } stream = new PdfStream(bt); stream.FlateCompress(compressionLevel); } cidset = writer.AddToBody(stream).IndirectReference; } // sivan: cff if (cff) { byte[] b = ReadCffFont(); if (subset || subsetRanges != null) { CFFFontSubset cffs = new CFFFontSubset(new RandomAccessFileOrArray(b), longTag); b = cffs.Process((cffs.GetNames())[0]); } pobj = new StreamFont(b, "CIDFontType0C", compressionLevel); obj = writer.AddToBody(pobj); ind_font = obj.IndirectReference; } else { byte[] b; if (subset || directoryOffset != 0) { TrueTypeFontSubSet sb = new TrueTypeFontSubSet(fileName, new RandomAccessFileOrArray(rf), longTag, directoryOffset, false, false); b = sb.Process(); } else { b = GetFullFont(); } int[] lengths = new int[] { b.Length }; pobj = new StreamFont(b, lengths, compressionLevel); obj = writer.AddToBody(pobj); ind_font = obj.IndirectReference; } String subsetPrefix = ""; if (subset) { subsetPrefix = CreateSubsetPrefix(); } PdfDictionary dic = GetFontDescriptor(ind_font, subsetPrefix, cidset); obj = writer.AddToBody(dic); ind_font = obj.IndirectReference; pobj = GetCIDFontType2(ind_font, subsetPrefix, metrics); obj = writer.AddToBody(pobj); ind_font = obj.IndirectReference; pobj = GetToUnicode(metrics); PdfIndirectReference toUnicodeRef = null; if (pobj != null) { obj = writer.AddToBody(pobj); toUnicodeRef = obj.IndirectReference; } pobj = GetFontBaseType(ind_font, subsetPrefix, toUnicodeRef); writer.AddToBody(pobj, piref); }
internal override void WriteFont(PdfWriter writer, PdfIndirectReference piRef, Object[] oParams) { if (this.writer != writer) { throw new ArgumentException("Type3 font used with the wrong PdfWriter"); } if (char2byte.Size != widths3.Size) { throw new DocumentException("Not all the glyphs in the Type3 font are defined"); } IntHashtable inv = new IntHashtable(); for (IntHashtable.IntHashtableIterator it = char2byte.GetEntryIterator(); it.HasNext();) { IntHashtable.IntHashtableEntry entry = it.Next(); inv[entry.Value] = entry.Key; } int[] invOrd = inv.ToOrderedKeys(); int firstChar = invOrd[0]; int lastChar = invOrd[invOrd.Length - 1]; int[] widths = new int[lastChar - firstChar + 1]; for (int k = 0; k < widths.Length; ++k) { if (inv.ContainsKey(k + firstChar)) { widths[k] = widths3[inv[k + firstChar]]; } } PdfArray diffs = new PdfArray(); PdfDictionary charprocs = new PdfDictionary(); int last = -1; for (int k = 0; k < invOrd.Length; ++k) { int c = invOrd[k]; if (c > last) { last = c; diffs.Add(new PdfNumber(last)); } ++last; int c2 = inv[c]; String s = GlyphList.UnicodeToName(c2); if (s == null) { s = "a" + c2; } PdfName n = new PdfName(s); diffs.Add(n); Type3Glyph glyph = (Type3Glyph)char2glyph[(char)c2]; PdfStream stream = new PdfStream(glyph.ToPdf(null)); stream.FlateCompress(); PdfIndirectReference refp = writer.AddToBody(stream).IndirectReference; charprocs.Put(n, refp); } PdfDictionary font = new PdfDictionary(PdfName.FONT); font.Put(PdfName.SUBTYPE, PdfName.TYPE3); if (colorized) { font.Put(PdfName.FONTBBOX, new PdfRectangle(0, 0, 0, 0)); } else { font.Put(PdfName.FONTBBOX, new PdfRectangle(llx, lly, urx, ury)); } font.Put(PdfName.FONTMATRIX, new PdfArray(new float[] { 0.001f, 0, 0, 0.001f, 0, 0 })); font.Put(PdfName.CHARPROCS, writer.AddToBody(charprocs).IndirectReference); PdfDictionary encoding = new PdfDictionary(); encoding.Put(PdfName.DIFFERENCES, diffs); font.Put(PdfName.ENCODING, writer.AddToBody(encoding).IndirectReference); font.Put(PdfName.FIRSTCHAR, new PdfNumber(firstChar)); font.Put(PdfName.LASTCHAR, new PdfNumber(lastChar)); font.Put(PdfName.WIDTHS, writer.AddToBody(new PdfArray(widths)).IndirectReference); if (pageResources.HasResources()) { font.Put(PdfName.RESOURCES, writer.AddToBody(pageResources.Resources).IndirectReference); } writer.AddToBody(font, piRef); }
/** * Creates a file specification with the file embedded. The file may * come from the file system or from a byte array. * @param writer the <CODE>PdfWriter</CODE> * @param filePath the file path * @param fileDisplay the file information that is presented to the user * @param fileStore the byte array with the file. If it is not <CODE>null</CODE> * it takes precedence over <CODE>filePath</CODE> * @param mimeType the optional mimeType * @param fileParameter the optional extra file parameters such as the creation or modification date * @param compressionLevel the level of compression * @throws IOException on error * @return the file specification * @since 2.1.3 */ public static PdfFileSpecification FileEmbedded(PdfWriter writer, String filePath, String fileDisplay, byte[] fileStore, String mimeType, PdfDictionary fileParameter, int compressionLevel) { PdfFileSpecification fs = new PdfFileSpecification(); fs.writer = writer; fs.Put(PdfName.F, new PdfString(fileDisplay)); PdfEFStream stream; Stream inp = null; PdfIndirectReference refi; PdfIndirectReference refFileLength; try { refFileLength = writer.PdfIndirectReference; if (fileStore == null) { if (File.Exists(filePath)) { inp = new FileStream(filePath, FileMode.Open, FileAccess.Read); } else { if (filePath.StartsWith("file:/") || filePath.StartsWith("http://") || filePath.StartsWith("https://")) { WebRequest w = WebRequest.Create(filePath); inp = w.GetResponse().GetResponseStream(); } else { inp = BaseFont.GetResourceStream(filePath); if (inp == null) { throw new IOException(filePath + " not found as file or resource."); } } } stream = new PdfEFStream(inp, writer); } else { stream = new PdfEFStream(fileStore); } stream.Put(PdfName.TYPE, PdfName.EMBEDDEDFILE); stream.FlateCompress(compressionLevel); stream.Put(PdfName.PARAMS, refFileLength); if (mimeType != null) { stream.Put(PdfName.SUBTYPE, new PdfName(mimeType)); } refi = writer.AddToBody(stream).IndirectReference; if (fileStore == null) { stream.WriteLength(); } PdfDictionary param = new PdfDictionary(); if (fileParameter != null) { param.Merge(fileParameter); } param.Put(PdfName.SIZE, new PdfNumber(stream.RawLength)); writer.AddToBody(param, refFileLength); } finally { if (inp != null) { try{ inp.Close(); }catch {} } } PdfDictionary f = new PdfDictionary(); f.Put(PdfName.F, refi); fs.Put(PdfName.EF, f); return(fs); }
public static object[] IterateOutlines(PdfWriter writer, PdfIndirectReference parent, ArrayList kids, bool namedAsNames) { var refs = new PdfIndirectReference[kids.Count]; for (var k = 0; k < refs.Length; ++k) { refs[k] = writer.PdfIndirectReference; } var ptr = 0; var count = 0; foreach (Hashtable map in kids) { object[] lower = null; var subKid = (ArrayList)map["Kids"]; if (subKid != null && subKid.Count > 0) { lower = IterateOutlines(writer, refs[ptr], subKid, namedAsNames); } var outline = new PdfDictionary(); ++count; if (lower != null) { outline.Put(PdfName.First, (PdfIndirectReference)lower[0]); outline.Put(PdfName.Last, (PdfIndirectReference)lower[1]); var n = (int)lower[2]; if ("false".Equals(map["Open"])) { outline.Put(PdfName.Count, new PdfNumber(-n)); } else { outline.Put(PdfName.Count, new PdfNumber(n)); count += n; } } outline.Put(PdfName.Parent, parent); if (ptr > 0) { outline.Put(PdfName.Prev, refs[ptr - 1]); } if (ptr < refs.Length - 1) { outline.Put(PdfName.Next, refs[ptr + 1]); } outline.Put(PdfName.Title, new PdfString((string)map["Title"], PdfObject.TEXT_UNICODE)); var color = (string)map["Color"]; if (color != null) { try { var arr = new PdfArray(); var tk = new StringTokenizer(color); for (var k = 0; k < 3; ++k) { var f = float.Parse(tk.NextToken(), System.Globalization.NumberFormatInfo.InvariantInfo); if (f < 0) { f = 0; } if (f > 1) { f = 1; } arr.Add(new PdfNumber(f)); } outline.Put(PdfName.C, arr); } catch { } //in case it's malformed } var style = (string)map["Style"]; if (style != null) { var bits = 0; if (style.IndexOf("italic", StringComparison.OrdinalIgnoreCase) >= 0) { bits |= 1; } if (style.IndexOf("bold", StringComparison.OrdinalIgnoreCase) >= 0) { bits |= 2; } if (bits != 0) { outline.Put(PdfName.F, new PdfNumber(bits)); } } CreateOutlineAction(outline, map, writer, namedAsNames); writer.AddToBody(outline, refs[ptr]); ++ptr; } return(new object[] { refs[0], refs[refs.Length - 1], count }); }
/// <summary> /// Creates a number tree. /// and the value is a PdfObject . /// @throws IOException on error /// </summary> /// <param name="items">the item of the number tree. The key is an Integer </param> /// <param name="writer">the writer</param> /// <returns>the dictionary with the number tree.</returns> public static PdfDictionary WriteTree(Hashtable items, PdfWriter writer) { if (items.Count == 0) { return(null); } var numbers = new int[items.Count]; items.Keys.CopyTo(numbers, 0); Array.Sort(numbers); if (numbers.Length <= LeafSize) { var dic = new PdfDictionary(); var ar = new PdfArray(); for (var k = 0; k < numbers.Length; ++k) { ar.Add(new PdfNumber(numbers[k])); ar.Add((PdfObject)items[numbers[k]]); } dic.Put(PdfName.Nums, ar); return(dic); } var skip = LeafSize; var kids = new PdfIndirectReference[(numbers.Length + LeafSize - 1) / LeafSize]; for (var k = 0; k < kids.Length; ++k) { var offset = k * LeafSize; var end = Math.Min(offset + LeafSize, numbers.Length); var dic = new PdfDictionary(); var arr = new PdfArray(); arr.Add(new PdfNumber(numbers[offset])); arr.Add(new PdfNumber(numbers[end - 1])); dic.Put(PdfName.Limits, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(new PdfNumber(numbers[offset])); arr.Add((PdfObject)items[numbers[offset]]); } dic.Put(PdfName.Nums, arr); kids[k] = writer.AddToBody(dic).IndirectReference; } var top = kids.Length; while (true) { if (top <= LeafSize) { var arr = new PdfArray(); for (var k = 0; k < top; ++k) { arr.Add(kids[k]); } var dic = new PdfDictionary(); dic.Put(PdfName.Kids, arr); return(dic); } skip *= LeafSize; var tt = (numbers.Length + skip - 1) / skip; for (var k = 0; k < tt; ++k) { var offset = k * LeafSize; var end = Math.Min(offset + LeafSize, top); var dic = new PdfDictionary(); var arr = new PdfArray(); arr.Add(new PdfNumber(numbers[k * skip])); arr.Add(new PdfNumber(numbers[Math.Min((k + 1) * skip, numbers.Length) - 1])); dic.Put(PdfName.Limits, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(kids[offset]); } dic.Put(PdfName.Kids, arr); kids[k] = writer.AddToBody(dic).IndirectReference; } top = tt; } }
internal void AddToBody() { Put(PdfName.Shading, ShadingReference); Put(PdfName.Matrix, new PdfArray(matrix)); Writer.AddToBody(this, PatternReference); }
private void crearPdf_2(string rutaFinal) { try { lbl_pdfconvertir.Text = "Convirtiendo a PDF/A..."; lbl_pdfconvertir.Refresh(); string ruta_archivo = convertidor_path; System.Drawing.Image actualBitmap_ = System.Drawing.Image.FromFile(ruta_archivo); Guid objGuid = actualBitmap_.FrameDimensionsList[0]; System.Drawing.Imaging.FrameDimension objDimension = new System.Drawing.Imaging.FrameDimension(objGuid); int total_page = actualBitmap_.GetFrameCount(objDimension); actualBitmap_.SelectActiveFrame(objDimension, 0); garbage_collector(); var width0 = actualBitmap_.Width; var height0 = actualBitmap_.Height; iTextSharp.text.Rectangle cero = new iTextSharp.text.Rectangle(width0, height0); doc_pdf = new Document(cero, 0, 0, 0, 0); doc_pdf.SetMargins(0, 0, 0, 0); PdfWriter writer = PdfWriter.GetInstance(doc_pdf, new FileStream(rutaFinal, FileMode.Create)); writer.PDFXConformance = PdfWriter.PDFA1B; doc_pdf.Open(); PdfDictionary outi = new PdfDictionary(PdfName.OUTPUTINTENT); outi.Put(PdfName.OUTPUTCONDITIONIDENTIFIER, new PdfString("sRGB IEC61966-2.1")); outi.Put(PdfName.INFO, new PdfString("sRGB IEC61966-2.1")); outi.Put(PdfName.S, PdfName.GTS_PDFA1); //Perfiles icc var path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); path = path.Replace("file:\\", ""); ICC_Profile icc = ICC_Profile.GetInstance(path + @"\sRGB_v4.icc"); PdfICCBased ib = new PdfICCBased(icc); ib.Remove(PdfName.ALTERNATE); outi.Put(PdfName.DESTOUTPUTPROFILE, writer.AddToBody(ib).IndirectReference); writer.ExtraCatalog.Put(PdfName.OUTPUTINTENTS, new PdfArray(outi)); BaseFont bf = BaseFont.CreateFont(path + @"\arial.ttf", BaseFont.WINANSI, true); iTextSharp.text.Font f = new iTextSharp.text.Font(bf, 12); float subtrahend0 = doc_pdf.PageSize.Height - 10; iTextSharp.text.Image pool0; pool0 = iTextSharp.text.Image.GetInstance(actualBitmap_, System.Drawing.Imaging.ImageFormat.Gif); pool0.Alignment = 3; pool0.ScaleToFit(doc_pdf.PageSize.Width - (doc_pdf.RightMargin * 2), subtrahend0); doc_pdf.Add(pool0); garbage_collector(); //Crear las paginas for (int i = 1; i < total_page; ++i) { actualBitmap_.SelectActiveFrame(objDimension, i); float Width = actualBitmap_.Width; float Height = actualBitmap_.Height; Task task1 = Task.Factory.StartNew(() => pdf_paralelo_page(actualBitmap_)); Task task2 = Task.Factory.StartNew(() => pdf_paralelo_doc(Width, Height)); Task.WaitAll(task1, task2); doc_pdf.Add(page_prop_pdf); decimal porcentaje = ((decimal)i / (decimal)total_page); progressBar1.Value = (int)(porcentaje * 100); progressBar1.Refresh(); garbage_collector(); } progressBar1.Value = 100; writer.CreateXmpMetadata(); doc_pdf.Close(); actualBitmap_.Dispose(); } catch (Exception ex) { MessageBox.Show("Falla de sistema en la conversión a PDF/A", title); if (ex.ToString().Contains("utilizado en otro proceso")) { MessageBox.Show("El PDF esta siendo utilizado en otro proceso", title); } MessageBox.Show(ex.ToString(), title); garbage_collector(); } garbage_collector(); }
/** * Creates a name tree. * @param items the item of the name tree. The key is a <CODE>String</CODE> * and the value is a <CODE>PdfObject</CODE>. Note that although the * keys are strings only the lower byte is used and no check is made for chars * with the same lower byte and different upper byte. This will generate a wrong * tree name. * @param writer the writer * @throws IOException on error * @return the dictionary with the name tree. This dictionary is the one * generally pointed to by the key /Dests, for example */ public static PdfDictionary WriteTree <T>(Dictionary <String, T> items, PdfWriter writer) where T : PdfObject { if (items.Count == 0) { return(null); } String[] names = new String[items.Count]; items.Keys.CopyTo(names, 0); Array.Sort(names, new CompareSrt()); if (names.Length <= leafSize) { PdfDictionary dic = new PdfDictionary(); PdfArray ar = new PdfArray(); for (int k = 0; k < names.Length; ++k) { ar.Add(new PdfString(names[k], null)); ar.Add(items[names[k]]); } dic.Put(PdfName.NAMES, ar); return(dic); } int skip = leafSize; PdfIndirectReference[] kids = new PdfIndirectReference[(names.Length + leafSize - 1) / leafSize]; for (int k = 0; k < kids.Length; ++k) { int offset = k * leafSize; int end = Math.Min(offset + leafSize, names.Length); PdfDictionary dic = new PdfDictionary(); PdfArray arr = new PdfArray(); arr.Add(new PdfString(names[offset], null)); arr.Add(new PdfString(names[end - 1], null)); dic.Put(PdfName.LIMITS, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(new PdfString(names[offset], null)); arr.Add(items[names[offset]]); } dic.Put(PdfName.NAMES, arr); kids[k] = writer.AddToBody(dic).IndirectReference; } int top = kids.Length; while (true) { if (top <= leafSize) { PdfArray arr = new PdfArray(); for (int k = 0; k < top; ++k) { arr.Add(kids[k]); } PdfDictionary dic = new PdfDictionary(); dic.Put(PdfName.KIDS, arr); return(dic); } skip *= leafSize; int tt = (names.Length + skip - 1) / skip; for (int k = 0; k < tt; ++k) { int offset = k * leafSize; int end = Math.Min(offset + leafSize, top); PdfDictionary dic = new PdfDictionary(); PdfArray arr = new PdfArray(); arr.Add(new PdfString(names[k * skip], null)); arr.Add(new PdfString(names[Math.Min((k + 1) * skip, names.Length) - 1], null)); dic.Put(PdfName.LIMITS, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(kids[offset]); } dic.Put(PdfName.KIDS, arr); kids[k] = writer.AddToBody(dic).IndirectReference; } top = tt; } }
/** * Creates a file specification with the file embedded. The file may * come from the file system or from a byte array. * @param writer the <CODE>PdfWriter</CODE> * @param filePath the file path * @param fileDisplay the file information that is presented to the user * @param fileStore the byte array with the file. If it is not <CODE>null</CODE> * it takes precedence over <CODE>filePath</CODE> * @param mimeType the optional mimeType * @param fileParameter the optional extra file parameters such as the creation or modification date * @param compressionLevel the level of compression * @throws IOException on error * @return the file specification * @since 2.1.3 */ public static PdfFileSpecification FileEmbedded(PdfWriter writer, String filePath, String fileDisplay, byte[] fileStore, String mimeType, PdfDictionary fileParameter, int compressionLevel) { PdfFileSpecification fs = new PdfFileSpecification(); fs.writer = writer; fs.Put(PdfName.F, new PdfString(fileDisplay)); fs.SetUnicodeFileName(fileDisplay, false); PdfEFStream stream; Stream inp = null; PdfIndirectReference refi; PdfIndirectReference refFileLength = null; try { if (fileStore == null) { refFileLength = writer.PdfIndirectReference; if (File.Exists(filePath)) { inp = new FileStream(filePath, FileMode.Open, FileAccess.Read); } else { if (filePath.StartsWith("file:/") || filePath.StartsWith("http://") || filePath.StartsWith("https://")) { WebRequest wr = WebRequest.Create(filePath); wr.Credentials = CredentialCache.DefaultCredentials; inp = wr.GetResponse().GetResponseStream(); } else { inp = StreamUtil.GetResourceStream(filePath); if (inp == null) { throw new IOException(MessageLocalization.GetComposedMessage("1.not.found.as.file.or.resource", filePath)); } } } stream = new PdfEFStream(inp, writer); } else { stream = new PdfEFStream(fileStore); } stream.Put(PdfName.TYPE, PdfName.EMBEDDEDFILE); stream.FlateCompress(compressionLevel); PdfDictionary param = new PdfDictionary(); if (fileParameter != null) { param.Merge(fileParameter); } if (!param.Contains(PdfName.MODDATE)) { param.Put(PdfName.MODDATE, new PdfDate()); } if (fileStore == null) { stream.Put(PdfName.PARAMS, refFileLength); } else { param.Put(PdfName.SIZE, new PdfNumber(stream.RawLength)); stream.Put(PdfName.PARAMS, param); } if (mimeType != null) { stream.Put(PdfName.SUBTYPE, new PdfName(mimeType)); } refi = writer.AddToBody(stream).IndirectReference; if (fileStore == null) { stream.WriteLength(); param.Put(PdfName.SIZE, new PdfNumber(stream.RawLength)); writer.AddToBody(param, refFileLength); } } finally { if (inp != null) { try{ inp.Close(); }catch {} } } PdfDictionary f = new PdfDictionary(); f.Put(PdfName.F, refi); f.Put(PdfName.UF, refi); fs.Put(PdfName.EF, f); return(fs); }
/** * Creates a number tree. * @param items the item of the number tree. The key is an <CODE>Integer</CODE> * and the value is a <CODE>PdfObject</CODE>. * @param writer the writer * @throws IOException on error * @return the dictionary with the number tree. */ public static PdfDictionary WriteTree(Hashtable items, PdfWriter writer) { if (items.Count == 0) { return(null); } int[] numbers = new int[items.Count]; items.Keys.CopyTo(numbers, 0); Array.Sort(numbers); if (numbers.Length <= leafSize) { PdfDictionary dic = new PdfDictionary(); PdfArray ar = new PdfArray(); for (int k = 0; k < numbers.Length; ++k) { ar.Add(new PdfNumber(numbers[k])); ar.Add((PdfObject)items[numbers[k]]); } dic.Put(PdfName.NUMS, ar); return(dic); } int skip = leafSize; PdfIndirectReference[] kids = new PdfIndirectReference[(numbers.Length + leafSize - 1) / leafSize]; for (int k = 0; k < kids.Length; ++k) { int offset = k * leafSize; int end = Math.Min(offset + leafSize, numbers.Length); PdfDictionary dic = new PdfDictionary(); PdfArray arr = new PdfArray(); arr.Add(new PdfNumber(numbers[offset])); arr.Add(new PdfNumber(numbers[end - 1])); dic.Put(PdfName.LIMITS, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(new PdfNumber(numbers[offset])); arr.Add((PdfObject)items[numbers[offset]]); } dic.Put(PdfName.NUMS, arr); kids[k] = writer.AddToBody(dic).IndirectReference; } int top = kids.Length; while (true) { if (top <= leafSize) { PdfArray arr = new PdfArray(); for (int k = 0; k < top; ++k) { arr.Add(kids[k]); } PdfDictionary dic = new PdfDictionary(); dic.Put(PdfName.KIDS, arr); return(dic); } skip *= leafSize; int tt = (numbers.Length + skip - 1) / skip; for (int k = 0; k < tt; ++k) { int offset = k * leafSize; int end = Math.Min(offset + leafSize, top); PdfDictionary dic = new PdfDictionary(); PdfArray arr = new PdfArray(); arr.Add(new PdfNumber(numbers[k * skip])); arr.Add(new PdfNumber(numbers[Math.Min((k + 1) * skip, numbers.Length) - 1])); dic.Put(PdfName.LIMITS, arr); arr = new PdfArray(); for (; offset < end; ++offset) { arr.Add(kids[offset]); } dic.Put(PdfName.KIDS, arr); kids[k] = writer.AddToBody(dic).IndirectReference; } top = tt; } }
public PdfArray RotateAnnotations(PdfWriter writer, Rectangle pageSize) { PdfArray array = new PdfArray(); int rotation = pageSize.Rotation % 360; int currentPage = writer.CurrentPageNumber; for (int k = 0; k < Annotations.Count; ++k) { PdfAnnotation dic = (PdfAnnotation)Annotations[k]; int page = dic.PlaceInPage; if (page > currentPage) { DelayedAnnotations.Add(dic); continue; } if (dic.IsForm()) { if (!dic.IsUsed()) { Hashtable templates = dic.Templates; if (templates != null) { acroForm.AddFieldTemplates(templates); } } PdfFormField field = (PdfFormField)dic; if (field.Parent == null) { acroForm.AddDocumentField(field.IndirectReference); } } if (dic.IsAnnotation()) { array.Add(dic.IndirectReference); if (!dic.IsUsed()) { PdfRectangle rect = (PdfRectangle)dic.Get(PdfName.Rect); if (rect != null) { switch (rotation) { case 90: dic.Put(PdfName.Rect, new PdfRectangle( pageSize.Top - rect.Bottom, rect.Left, pageSize.Top - rect.Top, rect.Right)); break; case 180: dic.Put(PdfName.Rect, new PdfRectangle( pageSize.Right - rect.Left, pageSize.Top - rect.Bottom, pageSize.Right - rect.Right, pageSize.Top - rect.Top)); break; case 270: dic.Put(PdfName.Rect, new PdfRectangle( rect.Bottom, pageSize.Right - rect.Left, rect.Top, pageSize.Right - rect.Right)); break; } } } } if (!dic.IsUsed()) { dic.SetUsed(); writer.AddToBody(dic, dic.IndirectReference); } } return(array); }