private void SerArray(PdfArray array, int level, ByteBuffer bb, Dictionary <RefKey, int> serialized) { bb.Append("$A"); if (level <= 0) { return; } for (int k = 0; k < array.Size; ++k) { SerObject(array[k], level, bb, serialized); } }
private void SerArray(PdfArray array, int level, ByteBuffer bb) { bb.Append("$A"); if (level <= 0) { return; } for (int k = 0; k < array.Size; ++k) { SerObject(array[k], level, bb); } }
public static PdfObject CreateInfoId(byte[] id) { ByteBuffer buf = new ByteBuffer(90); buf.Append('[').Append('<'); if (id.Length != 16) { id = CreateDocumentId(); } for (int k = 0; k < 16; ++k) { buf.AppendHex(id[k]); } buf.Append('>').Append('<'); id = CreateDocumentId(); for (int k = 0; k < 16; ++k) { buf.AppendHex(id[k]); } buf.Append('>').Append(']'); buf.Close(); return(new PdfLiteral(buf.ToByteArray())); }
private void SerDic(PdfDictionary dic, int level, ByteBuffer bb) { bb.Append("$D"); if (level <= 0) { return; } PdfName[] keys = new PdfName[dic.Size]; dic.Keys.CopyTo(keys, 0); Array.Sort <PdfName>(keys); for (int k = 0; k < keys.Length; ++k) { SerObject(keys[k], level, bb); SerObject(dic.Get(keys[k]), level, bb); } }
private void SerObject(PdfObject obj, int level, ByteBuffer bb, HashSet2 <PdfObject> serialized) { if (level <= 0) { return; } if (obj == null) { bb.Append("$Lnull"); return; } if (obj.IsIndirect()) { if (serialized.Contains(obj)) { return; } else { serialized.Add(obj); } } obj = PdfReader.GetPdfObject(obj); if (obj.IsStream()) { bb.Append("$B"); SerDic((PdfDictionary)obj, level - 1, bb, serialized); if (level > 0) { bb.Append(DigestAlgorithms.Digest("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj))); } } else if (obj.IsDictionary()) { SerDic((PdfDictionary)obj, level - 1, bb, serialized); } else if (obj.IsArray()) { SerArray((PdfArray)obj, level - 1, bb, serialized); } else if (obj.IsString()) { bb.Append("$S").Append(obj.ToString()); } else if (obj.IsName()) { bb.Append("$N").Append(obj.ToString()); } else { bb.Append("$L").Append(obj.ToString()); } }
private void serDic(PdfDictionary dic, int level, ByteBuffer bb) { bb.Append("$D"); if (level <= 0) { return; } var keys = new object[dic.Size]; dic.Keys.CopyTo(keys, 0); Array.Sort(keys); for (var k = 0; k < keys.Length; ++k) { serObject((PdfObject)keys[k], level, bb); serObject(dic.Get((PdfName)keys[k]), level, bb); } }
private void SerDic(PdfDictionary dic, int level, ByteBuffer bb, Dictionary <RefKey, int> serialized) { bb.Append("$D"); if (level <= 0) { return; } PdfName[] keys = new PdfName[dic.Size]; dic.Keys.CopyTo(keys, 0); Array.Sort(keys); for (int k = 0; k < keys.Length; ++k) { if (keys[k].Equals(PdfName.P) && (dic.Get(keys[k]).IsIndirect() || dic.Get(keys[k]).IsDictionary())) // ignore recursive call { continue; } SerObject(keys[k], level, bb, serialized); SerObject(dic.Get(keys[k]), level, bb, serialized); } }
private void serObject(PdfObject obj, int level, ByteBuffer bb) { if (level <= 0) { return; } if (obj == null) { bb.Append("$Lnull"); return; } obj = PdfReader.GetPdfObject(obj); if (obj.IsStream()) { bb.Append("$B"); serDic((PdfDictionary)obj, level - 1, bb); if (level > 0) { using (var md5 = MD5.Create()) { bb.Append(md5.ComputeHash(PdfReader.GetStreamBytesRaw((PrStream)obj))); } } } else if (obj.IsDictionary()) { serDic((PdfDictionary)obj, level - 1, bb); } else if (obj.IsArray()) { serArray((PdfArray)obj, level - 1, bb); } else if (obj.IsString()) { bb.Append("$S").Append(obj.ToString()); } else if (obj.IsName()) { bb.Append("$N").Append(obj.ToString()); } else { bb.Append("$L").Append(obj.ToString()); } }
private void SerObject(PdfObject obj, int level, ByteBuffer bb) { if (level <= 0) { return; } if (obj == null) { bb.Append("$Lnull"); return; } obj = PdfReader.GetPdfObject(obj); if (obj.IsStream()) { bb.Append("$B"); SerDic((PdfDictionary)obj, level - 1, bb); if (level > 0) { bb.Append(PdfEncryption.DigestComputeHash("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj))); } } else if (obj.IsDictionary()) { SerDic((PdfDictionary)obj, level - 1, bb); } else if (obj.IsArray()) { SerArray((PdfArray)obj, level - 1, bb); } else if (obj.IsString()) { bb.Append("$S").Append(obj.ToString()); } else if (obj.IsName()) { bb.Append("$N").Append(obj.ToString()); } else { bb.Append("$L").Append(obj.ToString()); } }
virtual internal protected void AlterContents() { foreach (PageStamp ps in pagesToContent.Values) { PdfDictionary pageN = ps.pageN; MarkUsed(pageN); PdfArray ar = null; PdfObject content = PdfReader.GetPdfObject(pageN.Get(PdfName.CONTENTS), pageN); if (content == null) { ar = new PdfArray(); pageN.Put(PdfName.CONTENTS, ar); } else if (content.IsArray()) { ar = new PdfArray((PdfArray)content); pageN.Put(PdfName.CONTENTS, ar); } else if (content.IsStream()) { ar = new PdfArray(); ar.Add(pageN.Get(PdfName.CONTENTS)); pageN.Put(PdfName.CONTENTS, ar); } else { ar = new PdfArray(); pageN.Put(PdfName.CONTENTS, ar); } ByteBuffer out_p = new ByteBuffer(); if (ps.under != null) { out_p.Append(PdfContents.SAVESTATE); ApplyRotation(pageN, out_p); out_p.Append(ps.under.InternalBuffer); out_p.Append(PdfContents.RESTORESTATE); } if (ps.over != null) out_p.Append(PdfContents.SAVESTATE); PdfStream stream = new PdfStream(out_p.ToByteArray()); stream.FlateCompress(compressionLevel); ar.AddFirst(AddToBody(stream).IndirectReference); out_p.Reset(); if (ps.over != null) { out_p.Append(' '); out_p.Append(PdfContents.RESTORESTATE); ByteBuffer buf = ps.over.InternalBuffer; out_p.Append(buf.Buffer, 0, ps.replacePoint); out_p.Append(PdfContents.SAVESTATE); ApplyRotation(pageN, out_p); out_p.Append(buf.Buffer, ps.replacePoint, buf.Size - ps.replacePoint); out_p.Append(PdfContents.RESTORESTATE); stream = new PdfStream(out_p.ToByteArray()); stream.FlateCompress(compressionLevel); ar.Add(AddToBody(stream).IndirectReference); } AlterResources(ps); } }
private void SerObject(PdfObject obj, int level, ByteBuffer bb) { if (level <= 0) return; if (obj == null) { bb.Append("$Lnull"); return; } obj = PdfReader.GetPdfObject(obj); if (obj.IsStream()) { bb.Append("$B"); SerDic((PdfDictionary)obj, level - 1, bb); if (level > 0) { bb.Append(PdfEncryption.DigestComputeHash("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj))); } } else if (obj.IsDictionary()) { SerDic((PdfDictionary)obj, level - 1, bb); } else if (obj.IsArray()) { SerArray((PdfArray)obj, level - 1, bb); } else if (obj.IsString()) { bb.Append("$S").Append(obj.ToString()); } else if (obj.IsName()) { bb.Append("$N").Append(obj.ToString()); } else bb.Append("$L").Append(obj.ToString()); }
private void SerArray(PdfArray array, int level, ByteBuffer bb) { bb.Append("$A"); if (level <= 0) return; for (int k = 0; k < array.Size; ++k) { SerObject(array[k], level, bb); } }
private static IList<Dictionary<String, Object>> BookmarkDepth(PdfReader reader, PdfDictionary outline, IntHashtable pages, bool processCurrentOutlineOnly) { List<Dictionary<String, Object>> list = new List<Dictionary<String, Object>>(); while (outline != null) { Dictionary<String, Object> map = new Dictionary<string,object>(); 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.JAVASCRIPT.Equals(PdfReader.GetPdfObjectRelease(action.Get(PdfName.S)))) { map["Action"] = "JS"; map["Code"] = PdfReader.GetPdfObjectRelease(action.Get(PdfName.JS)).ToString(); } 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, false); } list.Add(map); if (!processCurrentOutlineOnly) outline = (PdfDictionary)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.NEXT)); else outline = null; } return list; }
// methods overriding some methods in PdfObject /** * Returns the PDF representation of this <CODE>PdfString</CODE>. * * @return an array of <CODE>byte</CODE>s */ public override void ToPdf(PdfWriter writer, Stream os) { PdfWriter.CheckPdfIsoConformance(writer, PdfIsoKeys.PDFISOKEY_OBJECT, this); byte[] b = GetBytes(); PdfEncryption crypto = null; if (writer != null) crypto = writer.Encryption; if (crypto != null && !crypto.IsEmbeddedFilesOnly()) { b = crypto.EncryptByteArray(b); } if (hexWriting) { ByteBuffer buf = new ByteBuffer(); buf.Append('<'); int len = b.Length; for (int k = 0; k < len; ++k) buf.AppendHex(b[k]); buf.Append('>'); os.Write(buf.ToByteArray(), 0, buf.Size); } else { b = PdfContentByte.EscapeString(b); os.Write(b, 0, b.Length); } }
private void SerObject(PdfObject obj, int level, ByteBuffer bb, Dictionary<RefKey, int> serialized) { if (level <= 0) return; if (obj == null) { bb.Append("$Lnull"); return; } PdfIndirectReference refe = null; ByteBuffer savedBb = null; if (obj.IsIndirect()) { refe = (PdfIndirectReference)obj; RefKey key = new RefKey(refe); if (serialized.ContainsKey(key)) { bb.Append(serialized[key]); return; } else { savedBb = bb; bb = new ByteBuffer(); } } obj = PdfReader.GetPdfObject(obj); if (obj.IsStream()) { bb.Append("$B"); SerDic((PdfDictionary)obj, level - 1, bb, serialized); if (level > 0) { bb.Append(DigestAlgorithms.Digest("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj))); } } else if (obj.IsDictionary()) { SerDic((PdfDictionary)obj, level - 1, bb,serialized); } else if (obj.IsArray()) { SerArray((PdfArray)obj, level - 1, bb,serialized); } else if (obj.IsString()) { bb.Append("$S").Append(obj.ToString()); } else if (obj.IsName()) { bb.Append("$N").Append(obj.ToString()); } else bb.Append("$L").Append(obj.ToString()); if (savedBb != null) { RefKey key = new RefKey(refe); if (!serialized.ContainsKey(key)) serialized[key] = CalculateHash(bb.Buffer); savedBb.Append(bb); } }
public void AlterContents() { if (over == null && under == null) return; PdfArray ar = null; PdfObject content = PdfReader.GetPdfObject(pageN.Get(PdfName.CONTENTS), pageN); if (content == null) { ar = new PdfArray(); pageN.Put(PdfName.CONTENTS, ar); } else if (content.IsArray()) { ar = (PdfArray)content; } else if (content.IsStream()) { ar = new PdfArray(); ar.Add(pageN.Get(PdfName.CONTENTS)); pageN.Put(PdfName.CONTENTS, ar); } else { ar = new PdfArray(); pageN.Put(PdfName.CONTENTS, ar); } ByteBuffer out_p = new ByteBuffer(); if (under != null) { out_p.Append(PdfContents.SAVESTATE); ApplyRotation(pageN, out_p); out_p.Append(under.InternalBuffer); out_p.Append(PdfContents.RESTORESTATE); } if (over != null) out_p.Append(PdfContents.SAVESTATE); PdfStream stream = new PdfStream(out_p.ToByteArray()); stream.FlateCompress(cstp.CompressionLevel); PdfIndirectReference ref1 = cstp.AddToBody(stream).IndirectReference; ar.AddFirst(ref1); out_p.Reset(); if (over != null) { out_p.Append(' '); out_p.Append(PdfContents.RESTORESTATE); out_p.Append(PdfContents.SAVESTATE); ApplyRotation(pageN, out_p); out_p.Append(over.InternalBuffer); out_p.Append(PdfContents.RESTORESTATE); stream = new PdfStream(out_p.ToByteArray()); stream.FlateCompress(cstp.CompressionLevel); ar.Add(cstp.AddToBody(stream).IndirectReference); } pageN.Put(PdfName.RESOURCES, pageResources.Resources); }
private void applyRotation(PdfDictionary pageN, ByteBuffer outP) { if (!_cstp.RotateContents) { return; } var page = _reader.GetPageSizeWithRotation(pageN); var rotation = page.Rotation; switch (rotation) { case 90: outP.Append(PdfContents.Rotate90); outP.Append(page.Top); outP.Append(' ').Append('0').Append(PdfContents.Rotatefinal); break; case 180: outP.Append(PdfContents.Rotate180); outP.Append(page.Right); outP.Append(' '); outP.Append(page.Top); outP.Append(PdfContents.Rotatefinal); break; case 270: outP.Append(PdfContents.Rotate270); outP.Append('0').Append(' '); outP.Append(page.Right); outP.Append(PdfContents.Rotatefinal); break; } }
/** * This is the first method to be called when using external signatures. The general sequence is: * PreClose(), GetDocumentBytes() and Close(). * <p> * If calling PreClose() <B>dont't</B> call PdfStamper.Close(). * <p> * If using an external signature <CODE>exclusionSizes</CODE> must contain at least * the <CODE>PdfName.CONTENTS</CODE> key with the size that it will take in the * document. Note that due to the hex string coding this size should be * byte_size*2+2. * @param exclusionSizes a <CODE>Hashtable</CODE> with names and sizes to be excluded in the signature * calculation. The key is a <CODE>PdfName</CODE> and the value an * <CODE>Integer</CODE>. At least the <CODE>PdfName.CONTENTS</CODE> must be present * @throws IOException on error * @throws DocumentException on error */ public void PreClose(Dictionary<PdfName, int> exclusionSizes) { if (preClosed) throw new DocumentException(MessageLocalization.GetComposedMessage("document.already.pre.closed")); stamper.MergeVerification(); preClosed = true; AcroFields af = writer.AcroFields; String name = FieldName; bool fieldExists = !(IsInvisible() || IsNewField()); PdfIndirectReference refSig = writer.PdfIndirectReference; writer.SigFlags = 3; if (fieldExists) { PdfDictionary widget = af.GetFieldItem(name).GetWidget(0); writer.MarkUsed(widget); widget.Put(PdfName.P, writer.GetPageReference(Page)); widget.Put(PdfName.V, refSig); PdfObject obj = PdfReader.GetPdfObjectRelease(widget.Get(PdfName.F)); int flags = 0; if (obj != null && obj.IsNumber()) flags = ((PdfNumber)obj).IntValue; flags |= PdfAnnotation.FLAGS_LOCKED; widget.Put(PdfName.F, new PdfNumber(flags)); PdfDictionary ap = new PdfDictionary(); ap.Put(PdfName.N, GetAppearance().IndirectReference); widget.Put(PdfName.AP, ap); } else { PdfFormField sigField = PdfFormField.CreateSignature(writer); sigField.FieldName = name; sigField.Put(PdfName.V, refSig); sigField.Flags = PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_LOCKED; int pagen = Page; if (!IsInvisible()) sigField.SetWidget(PageRect, null); else sigField.SetWidget(new Rectangle(0, 0), null); sigField.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, GetAppearance()); sigField.Page = pagen; writer.AddAnnotation(sigField, pagen); } exclusionLocations = new Dictionary<PdfName,PdfLiteral>(); if (cryptoDictionary == null) { if (PdfName.ADOBE_PPKLITE.Equals(Filter)) sigStandard = new PdfSigGenericPKCS.PPKLite(); else if (PdfName.ADOBE_PPKMS.Equals(Filter)) sigStandard = new PdfSigGenericPKCS.PPKMS(); else if (PdfName.VERISIGN_PPKVS.Equals(Filter)) sigStandard = new PdfSigGenericPKCS.VeriSign(); else throw new ArgumentException(MessageLocalization.GetComposedMessage("unknown.filter.1", Filter)); sigStandard.SetExternalDigest(externalDigest, externalRSAdata, digestEncryptionAlgorithm); if (Reason != null) sigStandard.Reason = Reason; if (Location != null) sigStandard.Location = Location; if (Contact != null) sigStandard.Contact = Contact; sigStandard.Put(PdfName.M, new PdfDate(SignDate)); sigStandard.SetSignInfo(PrivKey, CertChain, CrlList); PdfString contents = (PdfString)sigStandard.Get(PdfName.CONTENTS); PdfLiteral lit = new PdfLiteral((contents.ToString().Length + (PdfName.ADOBE_PPKLITE.Equals(Filter)?0:64)) * 2 + 2); exclusionLocations[PdfName.CONTENTS] = lit; sigStandard.Put(PdfName.CONTENTS, lit); lit = new PdfLiteral(80); exclusionLocations[PdfName.BYTERANGE] = lit; sigStandard.Put(PdfName.BYTERANGE, lit); if (certificationLevel > 0) AddDocMDP(sigStandard); if (signatureEvent != null) signatureEvent.GetSignatureDictionary(sigStandard); writer.AddToBody(sigStandard, refSig, false); } else { PdfLiteral lit = new PdfLiteral(80); exclusionLocations[PdfName.BYTERANGE] = lit; cryptoDictionary.Put(PdfName.BYTERANGE, lit); foreach (KeyValuePair<PdfName,int> entry in exclusionSizes) { PdfName key = entry.Key; int v = entry.Value; lit = new PdfLiteral(v); exclusionLocations[key] = lit; cryptoDictionary.Put(key, lit); } if (certificationLevel > 0) AddDocMDP(cryptoDictionary); if (signatureEvent != null) signatureEvent.GetSignatureDictionary(cryptoDictionary); writer.AddToBody(cryptoDictionary, refSig, false); } if (certificationLevel > 0) { // add DocMDP entry to root PdfDictionary docmdp = new PdfDictionary(); docmdp.Put(new PdfName("DocMDP"), refSig); writer.reader.Catalog.Put(new PdfName("Perms"), docmdp); } writer.Close(stamper.MoreInfo); range = new int[exclusionLocations.Count * 2]; int byteRangePosition = exclusionLocations[PdfName.BYTERANGE].Position; exclusionLocations.Remove(PdfName.BYTERANGE); int idx = 1; foreach (PdfLiteral lit in exclusionLocations.Values) { int n = lit.Position; range[idx++] = n; range[idx++] = lit.PosLength + n; } Array.Sort(range, 1, range.Length - 2); for (int k = 3; k < range.Length - 2; k += 2) range[k] -= range[k - 1]; if (tempFile == null) { bout = sigout.Buffer; boutLen = sigout.Size; range[range.Length - 1] = boutLen - range[range.Length - 2]; ByteBuffer bf = new ByteBuffer(); bf.Append('['); for (int k = 0; k < range.Length; ++k) bf.Append(range[k]).Append(' '); bf.Append(']'); Array.Copy(bf.Buffer, 0, bout, byteRangePosition, bf.Size); } else { try { raf = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite); int boutLen = (int)raf.Length; range[range.Length - 1] = boutLen - range[range.Length - 2]; ByteBuffer bf = new ByteBuffer(); bf.Append('['); for (int k = 0; k < range.Length; ++k) bf.Append(range[k]).Append(' '); bf.Append(']'); raf.Seek(byteRangePosition, SeekOrigin.Begin); raf.Write(bf.Buffer, 0, bf.Size); } catch (IOException e) { try{raf.Close();}catch{} try{File.Delete(tempFile);}catch{} throw e; } } }
/** * Overriding standard PdfObject.ToPdf because we need sorted PdfDictionaries. */ private static void ToPdf(PdfObject @object, PdfWriter writer, ByteBuffer os) { if (@object is PdfDictionary) { os.Append('<'); os.Append('<'); List<PdfName> keys = new List<PdfName>(((PdfDictionary) @object).Keys); keys.Sort(); foreach (PdfName key in keys) { ToPdf(key, writer, os); PdfObject value = ((PdfDictionary) @object).Get(key); int type = value.Type; if (type != PdfObject.ARRAY && type != PdfObject.DICTIONARY && type != PdfObject.NAME && type != PdfObject.STRING) { os.Append(' '); } ToPdf(value, writer, os); } os.Append('>'); os.Append('>'); } else { @object.ToPdf(writer, os); } }
private static ArrayList bookmarkDepth(PdfReader reader, PdfDictionary outline, IntHashtable pages) { var list = new ArrayList(); while (outline != null) { var map = new Hashtable(); var title = (PdfString)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.Title)); map["Title"] = title.ToUnicodeString(); var color = (PdfArray)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.C)); if (color != null && color.Size == 3) { var 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); } var style = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.F)); if (style != null) { var f = style.IntValue; var s = ""; if ((f & 1) != 0) { s += "italic "; } if ((f & 2) != 0) { s += "bold "; } s = s.Trim(); if (s.Length != 0) { map["Style"] = s; } } var count = (PdfNumber)PdfReader.GetPdfObjectRelease(outline.Get(PdfName.Count)); if (count != null && count.IntValue < 0) { map["Open"] = "false"; } try { var dest = PdfReader.GetPdfObjectRelease(outline.Get(PdfName.Dest)); if (dest != null) { mapGotoBookmark(map, dest, pages); //changed by ujihara 2004-06-13 } else { var 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()) { var arr = (PdfArray)dest; var s = new StringBuilder(); s.Append(arr[0]); s.Append(' ').Append(arr[1]); for (var k = 2; k < arr.Size; ++k) { s.Append(' ').Append(arr[k]); } map["Page"] = s.ToString(); } } map["Action"] = "GoToR"; var 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(); } } } var 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"; var 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 } var 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); }
/// <summary> /// Outputs a double into a format suitable for the PDF. /// buf is null . If buf is <B>not</B> null , /// then the double is appended directly to the buffer and this methods returns null . /// </summary> /// <param name="d">a double</param> /// <param name="buf">a ByteBuffer</param> /// <returns>the String representation of the double if</returns> public static string FormatDouble(double d, ByteBuffer buf) { if (HighPrecision) { string sform = d.ToString("0.######", CultureInfo.InvariantCulture); if (buf == null) { return(sform); } else { buf.Append(sform); return(null); } } bool negative = false; if (Math.Abs(d) < 0.000015) { if (buf != null) { buf.Append(ZERO); return(null); } else { return("0"); } } if (d < 0) { negative = true; d = -d; } if (d < 1.0) { d += 0.000005; if (d >= 1) { if (negative) { if (buf != null) { buf.Append((byte)'-'); buf.Append((byte)'1'); return(null); } else { return("-1"); } } else { if (buf != null) { buf.Append((byte)'1'); return(null); } else { return("1"); } } } if (buf != null) { int v = (int)(d * 100000); if (negative) { buf.Append((byte)'-'); } buf.Append((byte)'0'); buf.Append((byte)'.'); buf.Append((byte)(v / 10000 + ZERO)); if (v % 10000 != 0) { buf.Append((byte)((v / 1000) % 10 + ZERO)); if (v % 1000 != 0) { buf.Append((byte)((v / 100) % 10 + ZERO)); if (v % 100 != 0) { buf.Append((byte)((v / 10) % 10 + ZERO)); if (v % 10 != 0) { buf.Append((byte)((v) % 10 + ZERO)); } } } } return(null); } else { int x = 100000; int v = (int)(d * x); StringBuilder res = new StringBuilder(); if (negative) { res.Append('-'); } res.Append("0."); while (v < x / 10) { res.Append('0'); x /= 10; } res.Append(v); int cut = res.Length - 1; while (res[cut] == '0') { --cut; } res.Length = cut + 1; return(res.ToString()); } } else if (d <= 32767) { d += 0.005; int v = (int)(d * 100); if (v < _byteCacheSize && _byteCache[v] != null) { if (buf != null) { if (negative) { buf.Append((byte)'-'); } buf.Append(_byteCache[v]); return(null); } else { string tmp = PdfEncodings.ConvertToString(_byteCache[v], null); if (negative) { tmp = "-" + tmp; } return(tmp); } } if (buf != null) { if (v < _byteCacheSize) { //create the cachebyte[] byte[] cache; int size = 0; if (v >= 1000000) { //the original number is >=10000, we need 5 more bytes size += 5; } else if (v >= 100000) { //the original number is >=1000, we need 4 more bytes size += 4; } else if (v >= 10000) { //the original number is >=100, we need 3 more bytes size += 3; } else if (v >= 1000) { //the original number is >=10, we need 2 more bytes size += 2; } else if (v >= 100) { //the original number is >=1, we need 1 more bytes size += 1; } //now we must check if we have a decimal number if (v % 100 != 0) { //yes, do not forget the "." size += 2; } if (v % 10 != 0) { size++; } cache = new byte[size]; int add = 0; if (v >= 1000000) { cache[add++] = _bytes[(v / 1000000)]; } if (v >= 100000) { cache[add++] = _bytes[(v / 100000) % 10]; } if (v >= 10000) { cache[add++] = _bytes[(v / 10000) % 10]; } if (v >= 1000) { cache[add++] = _bytes[(v / 1000) % 10]; } if (v >= 100) { cache[add++] = _bytes[(v / 100) % 10]; } if (v % 100 != 0) { cache[add++] = (byte)'.'; cache[add++] = _bytes[(v / 10) % 10]; if (v % 10 != 0) { cache[add++] = _bytes[v % 10]; } } _byteCache[v] = cache; } if (negative) { buf.Append((byte)'-'); } if (v >= 1000000) { buf.Append(_bytes[(v / 1000000)]); } if (v >= 100000) { buf.Append(_bytes[(v / 100000) % 10]); } if (v >= 10000) { buf.Append(_bytes[(v / 10000) % 10]); } if (v >= 1000) { buf.Append(_bytes[(v / 1000) % 10]); } if (v >= 100) { buf.Append(_bytes[(v / 100) % 10]); } if (v % 100 != 0) { buf.Append((byte)'.'); buf.Append(_bytes[(v / 10) % 10]); if (v % 10 != 0) { buf.Append(_bytes[v % 10]); } } return(null); } else { StringBuilder res = new StringBuilder(); if (negative) { res.Append('-'); } if (v >= 1000000) { res.Append(_chars[(v / 1000000)]); } if (v >= 100000) { res.Append(_chars[(v / 100000) % 10]); } if (v >= 10000) { res.Append(_chars[(v / 10000) % 10]); } if (v >= 1000) { res.Append(_chars[(v / 1000) % 10]); } if (v >= 100) { res.Append(_chars[(v / 100) % 10]); } if (v % 100 != 0) { res.Append('.'); res.Append(_chars[(v / 10) % 10]); if (v % 10 != 0) { res.Append(_chars[v % 10]); } } return(res.ToString()); } } else { StringBuilder res = new StringBuilder(); if (negative) { res.Append('-'); } d += 0.5; long v = (long)d; return(res.Append(v).ToString()); } }
public static PdfObject CreateInfoId(byte[] id, bool modified) { ByteBuffer buf = new ByteBuffer(90); buf.Append('[').Append('<'); if(id.Length != 16) id = CreateDocumentId(); for (int k = 0; k < 16; ++k) buf.AppendHex(id[k]); buf.Append('>').Append('<'); if (modified) id = CreateDocumentId(); for (int k = 0; k < 16; ++k) buf.AppendHex(id[k]); buf.Append('>').Append(']'); buf.Close(); return new PdfLiteral(buf.ToByteArray()); }
/** * This is the first method to be called when using external signatures. The general sequence is: * preClose(), getDocumentBytes() and close(). * <p> * If calling preClose() <B>dont't</B> call PdfStamper.close(). * <p> * <CODE>exclusionSizes</CODE> must contain at least * the <CODE>PdfName.CONTENTS</CODE> key with the size that it will take in the * document. Note that due to the hex string coding this size should be * byte_size*2+2. * @param exclusionSizes a <CODE>HashMap</CODE> with names and sizes to be excluded in the signature * calculation. The key is a <CODE>PdfName</CODE> and the value an * <CODE>Integer</CODE>. At least the <CODE>PdfName.CONTENTS</CODE> must be present * @throws IOException on error * @throws DocumentException on error */ public void PreClose(Dictionary<PdfName, int> exclusionSizes) { if (preClosed) throw new DocumentException(MessageLocalization.GetComposedMessage("document.already.pre.closed")); stamper.MergeVerification(); preClosed = true; AcroFields af = writer.GetAcroFields(); String name = FieldName; bool fieldExists = !(IsInvisible() || IsNewField()); PdfIndirectReference refSig = writer.PdfIndirectReference; writer.SigFlags = 3; PdfDictionary fieldLock = null; if (fieldExists) { PdfDictionary widget = af.GetFieldItem(name).GetWidget(0); writer.MarkUsed(widget); fieldLock = widget.GetAsDict(PdfName.LOCK); widget.Put(PdfName.P, writer.GetPageReference(Page)); widget.Put(PdfName.V, refSig); PdfObject obj = PdfReader.GetPdfObjectRelease(widget.Get(PdfName.F)); int flags = 0; if (obj != null && obj.IsNumber()) flags = ((PdfNumber)obj).IntValue; flags |= PdfAnnotation.FLAGS_LOCKED; widget.Put(PdfName.F, new PdfNumber(flags)); PdfDictionary ap = new PdfDictionary(); ap.Put(PdfName.N, GetAppearance().IndirectReference); widget.Put(PdfName.AP, ap); } else { PdfFormField sigField = PdfFormField.CreateSignature(writer); sigField.FieldName = name; sigField.Put(PdfName.V, refSig); sigField.Flags = PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_LOCKED; int pagen = Page; if (!IsInvisible()) sigField.SetWidget(PageRect, null); else sigField.SetWidget(new Rectangle(0, 0), null); sigField.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, GetAppearance()); sigField.Page = pagen; writer.AddAnnotation(sigField, pagen); } exclusionLocations = new Dictionary<PdfName,PdfLiteral>(); if (cryptoDictionary == null) { throw new DocumentException("No crypto dictionary defined."); } else { PdfLiteral lit = new PdfLiteral(80); exclusionLocations[PdfName.BYTERANGE] = lit; cryptoDictionary.Put(PdfName.BYTERANGE, lit); foreach (KeyValuePair<PdfName,int> entry in exclusionSizes) { PdfName key = entry.Key; int v = entry.Value; lit = new PdfLiteral(v); exclusionLocations[key] = lit; cryptoDictionary.Put(key, lit); } if (certificationLevel > 0) AddDocMDP(cryptoDictionary); if (fieldLock != null) AddFieldMDP(cryptoDictionary, fieldLock); if (signatureEvent != null) signatureEvent.GetSignatureDictionary(cryptoDictionary); writer.AddToBody(cryptoDictionary, refSig, false); } if (certificationLevel > 0) { // add DocMDP entry to root PdfDictionary docmdp = new PdfDictionary(); docmdp.Put(new PdfName("DocMDP"), refSig); writer.reader.Catalog.Put(new PdfName("Perms"), docmdp); } writer.Close(stamper.MoreInfo); range = new long[exclusionLocations.Count * 2]; long byteRangePosition = exclusionLocations[PdfName.BYTERANGE].Position; exclusionLocations.Remove(PdfName.BYTERANGE); int idx = 1; foreach (PdfLiteral lit in exclusionLocations.Values) { long n = lit.Position; range[idx++] = n; range[idx++] = lit.PosLength + n; } Array.Sort(range, 1, range.Length - 2); for (int k = 3; k < range.Length - 2; k += 2) range[k] -= range[k - 1]; if (tempFile == null) { bout = sigout.Buffer; boutLen = sigout.Size; range[range.Length - 1] = boutLen - range[range.Length - 2]; ByteBuffer bf = new ByteBuffer(); bf.Append('['); for (int k = 0; k < range.Length; ++k) bf.Append(range[k]).Append(' '); bf.Append(']'); Array.Copy(bf.Buffer, 0, bout, byteRangePosition, bf.Size); } else { try { raf = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite); long len = raf.Length; range[range.Length - 1] = len - range[range.Length - 2]; ByteBuffer bf = new ByteBuffer(); bf.Append('['); for (int k = 0; k < range.Length; ++k) bf.Append(range[k]).Append(' '); bf.Append(']'); raf.Seek(byteRangePosition, SeekOrigin.Begin); raf.Write(bf.Buffer, 0, bf.Size); } catch (IOException e) { try{raf.Close();}catch{} try{File.Delete(tempFile);}catch{} throw e; } } }
private void SerObject(PdfObject obj, int level, ByteBuffer bb, Dictionary <RefKey, int> serialized) { if (level <= 0) { return; } if (obj == null) { bb.Append("$Lnull"); return; } PdfIndirectReference refe = null; ByteBuffer savedBb = null; if (obj.IsIndirect()) { refe = (PdfIndirectReference)obj; RefKey key = new RefKey(refe); if (serialized.ContainsKey(key)) { bb.Append(serialized[key]); return; } else { savedBb = bb; bb = new ByteBuffer(); } } obj = PdfReader.GetPdfObject(obj); if (obj.IsStream()) { bb.Append("$B"); SerDic((PdfDictionary)obj, level - 1, bb, serialized); if (level > 0) { bb.Append(DigestAlgorithms.Digest("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj))); } } else if (obj.IsDictionary()) { SerDic((PdfDictionary)obj, level - 1, bb, serialized); } else if (obj.IsArray()) { SerArray((PdfArray)obj, level - 1, bb, serialized); } else if (obj.IsString()) { bb.Append("$S").Append(obj.ToString()); } else if (obj.IsName()) { bb.Append("$N").Append(obj.ToString()); } else { bb.Append("$L").Append(obj.ToString()); } if (savedBb != null) { RefKey key = new RefKey(refe); if (!serialized.ContainsKey(key)) { serialized[key] = CalculateHash(bb.Buffer); } savedBb.Append(bb); } }
private void SerArray(PdfArray array, int level, ByteBuffer bb, Dictionary<RefKey, int> serialized) { bb.Append("$A"); if (level <= 0) return; for (int k = 0; k < array.Size; ++k) { SerObject(array[k], level, bb, serialized); } }
private void SerObject(PdfObject obj, int level, ByteBuffer bb) { if (level <= 0) return; if (obj == null) { bb.Append("$Lnull"); return; } if (obj.IsIndirect()) { if (serialized.Contains(obj)) return; else serialized.Add(obj); } obj = PdfReader.GetPdfObject(obj); if (obj.IsStream()) { bb.Append("$B"); SerDic((PdfDictionary)obj, level - 1, bb); if (level > 0) { bb.Append(DigestAlgorithms.Digest("MD5", PdfReader.GetStreamBytesRaw((PRStream)obj))); } } else if (obj.IsDictionary()) { SerDic((PdfDictionary)obj, level - 1, bb); } else if (obj.IsArray()) { SerArray((PdfArray)obj, level - 1, bb); } else if (obj.IsString()) { bb.Append("$S").Append(obj.ToString()); } else if (obj.IsName()) { bb.Append("$N").Append(obj.ToString()); } else bb.Append("$L").Append(obj.ToString()); }
/** * Encodes a plain name given in the unescaped form "AB CD" into "/AB#20CD". * * @param name the name to encode * @return the encoded name * @since 2.1.5 */ public static byte[] EncodeName(String name) { int length = name.Length; // every special character has to be substituted ByteBuffer pdfName = new ByteBuffer(length + 20); pdfName.Append('/'); char[] chars = name.ToCharArray(); char character; // loop over all the characters foreach (char cc in chars) { character = (char)(cc & 0xff); // special characters are escaped (reference manual p.39) switch (character) { case ' ': case '%': case '(': case ')': case '<': case '>': case '[': case ']': case '{': case '}': case '/': case '#': pdfName.Append('#'); pdfName.Append(System.Convert.ToString(character, 16)); break; default: if (character > 126 || character < 32) { pdfName.Append('#'); if (character < 16) pdfName.Append('0'); pdfName.Append(System.Convert.ToString(character, 16)); } else pdfName.Append(character); break; } } return pdfName.ToByteArray(); }
/** * Constructs a new <CODE>PdfName</CODE>. * @param name the new name * @param lengthCheck if <CODE>true</CODE> check the lenght validity, if <CODE>false</CODE> the name can * have any length */ public PdfName(string name, bool lengthCheck) : base(PdfObject.NAME) { // The minimum number of characters in a name is 0, the maximum is 127 (the '/' not included) int length = name.Length; if (lengthCheck && length > 127) { throw new ArgumentException("The name '" + name + "' is too long (" + length + " characters)."); } // every special character has to be substituted ByteBuffer pdfName = new ByteBuffer(length + 20); pdfName.Append('/'); char[] chars = name.ToCharArray(); char character; // loop over all the characters foreach (char cc in chars) { character = (char)(cc & 0xff); // special characters are escaped (reference manual p.39) switch (character) { case ' ': case '%': case '(': case ')': case '<': case '>': case '[': case ']': case '{': case '}': case '/': case '#': pdfName.Append('#'); pdfName.Append(System.Convert.ToString(character, 16)); break; default: if (character > 126 || character < 32) { pdfName.Append('#'); if (character < 16) pdfName.Append('0'); pdfName.Append(System.Convert.ToString(character, 16)); } else pdfName.Append(character); break; } } bytes = pdfName.ToByteArray(); }
/** * Escapes a <CODE>byte</CODE> array according to the PDF conventions. * * @param b the <CODE>byte</CODE> array to escape */ internal static void EscapeString(byte[] b, ByteBuffer content) { content.Append_i('('); for (int k = 0; k < b.Length; ++k) { byte c = b[k]; switch ((int)c) { case '\r': content.Append("\\r"); break; case '\n': content.Append("\\n"); break; case '\t': content.Append("\\t"); break; case '\b': content.Append("\\b"); break; case '\f': content.Append("\\f"); break; case '(': case ')': case '\\': content.Append_i('\\').Append_i(c); break; default: content.Append_i(c); break; } } content.Append(')'); }
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.ArrayList.Count == 3) { ByteBuffer outp = new ByteBuffer(); ArrayList arr = color.ArrayList; outp.Append(((PdfNumber)arr[0]).FloatValue).Append(' '); outp.Append(((PdfNumber)arr[1]).FloatValue).Append(' '); outp.Append(((PdfNumber)arr[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()) { ArrayList arr = ((PdfArray)dest).ArrayList; StringBuilder s = new StringBuilder(); s.Append(arr[0].ToString()); s.Append(' ').Append(arr[1].ToString()); for (int k = 2; k < arr.Count; ++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 SerDic(PdfDictionary dic, int level, ByteBuffer bb) { bb.Append("$D"); if (level <= 0) return; PdfName[] keys = new PdfName[dic.Size]; dic.Keys.CopyTo(keys, 0); Array.Sort<PdfName>(keys); for (int k = 0; k < keys.Length; ++k) { SerObject(keys[k], level, bb); SerObject(dic.Get(keys[k]), level, bb); } }
/** * Outputs a <CODE>double</CODE> into a format suitable for the PDF. * @param d a double * @param buf a ByteBuffer * @return the <CODE>String</CODE> representation of the <CODE>double</CODE> if * <CODE>buf</CODE> is <CODE>null</CODE>. If <CODE>buf</CODE> is <B>not</B> <CODE>null</CODE>, * then the double is appended directly to the buffer and this methods returns <CODE>null</CODE>. */ public static string FormatDouble(double d, ByteBuffer buf) { if (HIGH_PRECISION) { String sform = d.ToString("0.######", CultureInfo.InvariantCulture); if (buf == null) return sform; else { buf.Append(sform); return null; } } bool negative = false; if (Math.Abs(d) < 0.000015) { if (buf != null) { buf.Append(ZERO); return null; } else { return "0"; } } if (d < 0) { negative = true; d = -d; } if (d < 1.0) { d += 0.000005; if (d >= 1) { if (negative) { if (buf != null) { buf.Append((byte)'-'); buf.Append((byte)'1'); return null; } else { return "-1"; } } else { if (buf != null) { buf.Append((byte)'1'); return null; } else { return "1"; } } } if (buf != null) { int v = (int) (d * 100000); if (negative) buf.Append((byte)'-'); buf.Append((byte)'0'); buf.Append((byte)'.'); buf.Append( (byte)(v / 10000 + ZERO) ); if (v % 10000 != 0) { buf.Append( (byte)((v / 1000) % 10 + ZERO) ); if (v % 1000 != 0) { buf.Append( (byte)((v / 100) % 10 + ZERO) ); if (v % 100 != 0) { buf.Append((byte)((v / 10) % 10 + ZERO) ); if (v % 10 != 0) { buf.Append((byte)((v) % 10 + ZERO) ); } } } } return null; } else { int x = 100000; int v = (int) (d * x); StringBuilder res = new StringBuilder(); if (negative) res.Append('-'); res.Append("0."); while ( v < x/10 ) { res.Append('0'); x /= 10; } res.Append(v); int cut = res.Length - 1; while (res[cut] == '0') { --cut; } res.Length = cut + 1; return res.ToString(); } } else if (d <= 32767) { d += 0.005; int v = (int) (d * 100); if (v < byteCacheSize && byteCache[v] != null) { if (buf != null) { if (negative) buf.Append((byte)'-'); buf.Append(byteCache[v]); return null; } else { string tmp = PdfEncodings.ConvertToString(byteCache[v], null); if (negative) tmp = "-" + tmp; return tmp; } } if (buf != null) { if (v < byteCacheSize) { //create the cachebyte[] byte[] cache; int size = 0; if (v >= 1000000) { //the original number is >=10000, we need 5 more bytes size += 5; } else if (v >= 100000) { //the original number is >=1000, we need 4 more bytes size += 4; } else if (v >= 10000) { //the original number is >=100, we need 3 more bytes size += 3; } else if (v >= 1000) { //the original number is >=10, we need 2 more bytes size += 2; } else if (v >= 100) { //the original number is >=1, we need 1 more bytes size += 1; } //now we must check if we have a decimal number if (v % 100 != 0) { //yes, do not forget the "." size += 2; } if (v % 10 != 0) { size++; } cache = new byte[size]; int add = 0; if (v >= 1000000) { cache[add++] = bytes[(v / 1000000)]; } if (v >= 100000) { cache[add++] = bytes[(v / 100000) % 10]; } if (v >= 10000) { cache[add++] = bytes[(v / 10000) % 10]; } if (v >= 1000) { cache[add++] = bytes[(v / 1000) % 10]; } if (v >= 100) { cache[add++] = bytes[(v / 100) % 10]; } if (v % 100 != 0) { cache[add++] = (byte)'.'; cache[add++] = bytes[(v / 10) % 10]; if (v % 10 != 0) { cache[add++] = bytes[v % 10]; } } byteCache[v] = cache; } if (negative) buf.Append((byte)'-'); if (v >= 1000000) { buf.Append( bytes[(v / 1000000)] ); } if (v >= 100000) { buf.Append( bytes[(v / 100000) % 10] ); } if (v >= 10000) { buf.Append( bytes[(v / 10000) % 10] ); } if (v >= 1000) { buf.Append( bytes[(v / 1000) % 10] ); } if (v >= 100) { buf.Append( bytes[(v / 100) % 10] ); } if (v % 100 != 0) { buf.Append((byte)'.'); buf.Append( bytes[(v / 10) % 10] ); if (v % 10 != 0) { buf.Append( bytes[v % 10] ); } } return null; } else { StringBuilder res = new StringBuilder(); if (negative) res.Append('-'); if (v >= 1000000) { res.Append( chars[(v / 1000000)] ); } if (v >= 100000) { res.Append( chars[(v / 100000) % 10] ); } if (v >= 10000) { res.Append( chars[(v / 10000) % 10] ); } if (v >= 1000) { res.Append( chars[(v / 1000) % 10] ); } if (v >= 100) { res.Append( chars[(v / 100) % 10] ); } if (v % 100 != 0) { res.Append('.'); res.Append( chars[(v / 10) % 10] ); if (v % 10 != 0) { res.Append( chars[v % 10] ); } } return res.ToString(); } } else { d += 0.5; long v = (long) d; if (negative) return "-" + v.ToString(CultureInfo.InvariantCulture); else return v.ToString(CultureInfo.InvariantCulture); } }
public void AlterContents() { if (over == null && under == null) { return; } PdfArray ar = null; PdfObject content = PdfReader.GetPdfObject(pageN.Get(PdfName.CONTENTS), pageN); if (content == null) { ar = new PdfArray(); pageN.Put(PdfName.CONTENTS, ar); } else if (content.IsArray()) { ar = (PdfArray)content; } else if (content.IsStream()) { ar = new PdfArray(); ar.Add(pageN.Get(PdfName.CONTENTS)); pageN.Put(PdfName.CONTENTS, ar); } else { ar = new PdfArray(); pageN.Put(PdfName.CONTENTS, ar); } ByteBuffer out_p = new ByteBuffer(); if (under != null) { out_p.Append(PdfContents.SAVESTATE); ApplyRotation(pageN, out_p); out_p.Append(under.InternalBuffer); out_p.Append(PdfContents.RESTORESTATE); } if (over != null) { out_p.Append(PdfContents.SAVESTATE); } PdfStream stream = new PdfStream(out_p.ToByteArray()); stream.FlateCompress(cstp.CompressionLevel); PdfIndirectReference ref1 = cstp.AddToBody(stream).IndirectReference; ar.AddFirst(ref1); out_p.Reset(); if (over != null) { out_p.Append(' '); out_p.Append(PdfContents.RESTORESTATE); out_p.Append(PdfContents.SAVESTATE); ApplyRotation(pageN, out_p); out_p.Append(over.InternalBuffer); out_p.Append(PdfContents.RESTORESTATE); stream = new PdfStream(out_p.ToByteArray()); stream.FlateCompress(cstp.CompressionLevel); ar.Add(cstp.AddToBody(stream).IndirectReference); } pageN.Put(PdfName.RESOURCES, pageResources.Resources); }
void ApplyRotation(PdfDictionary pageN, ByteBuffer out_p) { if (!cstp.rotateContents) { return; } Rectangle page = reader.GetPageSizeWithRotation(pageN); int rotation = page.Rotation; switch (rotation) { case 90: out_p.Append(PdfContents.ROTATE90); out_p.Append(page.Top); out_p.Append(' ').Append('0').Append(PdfContents.ROTATEFINAL); break; case 180: out_p.Append(PdfContents.ROTATE180); out_p.Append(page.Right); out_p.Append(' '); out_p.Append(page.Top); out_p.Append(PdfContents.ROTATEFINAL); break; case 270: out_p.Append(PdfContents.ROTATE270); out_p.Append('0').Append(' '); out_p.Append(page.Right); out_p.Append(PdfContents.ROTATEFINAL); break; } }
internal void ApplyRotation(PdfDictionary pageN, ByteBuffer out_p) { if (!rotateContents) return; Rectangle page = reader.GetPageSizeWithRotation(pageN); int rotation = page.Rotation; switch (rotation) { case 90: out_p.Append(PdfContents.ROTATE90); out_p.Append(page.Top); out_p.Append(' ').Append('0').Append(PdfContents.ROTATEFINAL); break; case 180: out_p.Append(PdfContents.ROTATE180); out_p.Append(page.Right); out_p.Append(' '); out_p.Append(page.Top); out_p.Append(PdfContents.ROTATEFINAL); break; case 270: out_p.Append(PdfContents.ROTATE270); out_p.Append('0').Append(' '); out_p.Append(page.Right); out_p.Append(PdfContents.ROTATEFINAL); break; } }
public void AlterContents() { if (_over == null && _under == null) { return; } PdfArray ar = null; var content = PdfReader.GetPdfObject(_pageN.Get(PdfName.Contents), _pageN); if (content == null) { ar = new PdfArray(); _pageN.Put(PdfName.Contents, ar); } else if (content.IsArray()) { ar = (PdfArray)content; } else if (content.IsStream()) { ar = new PdfArray(); ar.Add(_pageN.Get(PdfName.Contents)); _pageN.Put(PdfName.Contents, ar); } else { ar = new PdfArray(); _pageN.Put(PdfName.Contents, ar); } var outP = new ByteBuffer(); if (_under != null) { outP.Append(PdfContents.Savestate); applyRotation(_pageN, outP); outP.Append(_under.InternalBuffer); outP.Append(PdfContents.Restorestate); } if (_over != null) { outP.Append(PdfContents.Savestate); } var stream = new PdfStream(outP.ToByteArray()); stream.FlateCompress(_cstp.CompressionLevel); var ref1 = _cstp.AddToBody(stream).IndirectReference; ar.AddFirst(ref1); outP.Reset(); if (_over != null) { outP.Append(' '); outP.Append(PdfContents.Restorestate); outP.Append(PdfContents.Savestate); applyRotation(_pageN, outP); outP.Append(_over.InternalBuffer); outP.Append(PdfContents.Restorestate); stream = new PdfStream(outP.ToByteArray()); stream.FlateCompress(_cstp.CompressionLevel); ar.Add(_cstp.AddToBody(stream).IndirectReference); } _pageN.Put(PdfName.Resources, _pageResources.Resources); }
/** * Returns the PDF representation of this <CODE>PdfObject</CODE>. * @param os * @throws IOException */ public void ToPdf(Stream os) { String s1 = offset.ToString().PadLeft(10, '0'); String s2 = generation.ToString().PadLeft(5, '0'); ByteBuffer buf = new ByteBuffer(40); if (generation == GENERATION_MAX) { buf.Append(s1).Append(' ').Append(s2).Append(" f \n"); } else { buf.Append(s1).Append(' ').Append(s2).Append(" n \n"); } os.Write(buf.Buffer, 0, buf.Size); }
private void SerDic(PdfDictionary dic, int level, ByteBuffer bb, Dictionary<RefKey, int> serialized) { bb.Append("$D"); if (level <= 0) return; PdfName[] keys = new PdfName[dic.Size]; dic.Keys.CopyTo(keys, 0); Array.Sort(keys); for (int k = 0; k < keys.Length; ++k) { if (keys[k].Equals(PdfName.P) && (dic.Get(keys[k]).IsIndirect() || dic.Get(keys[k]).IsDictionary())) // ignore recursive call continue; SerObject(keys[k], level, bb, serialized); SerObject(dic.Get(keys[k]), level, bb, serialized); } }