public void WriteObject(IPdfObject obj, string trailerName = null) { if (gXref.ContainsKey(obj.id)) { throw new PBException("error object already in file id {0}", obj.id); } gXref.Add(obj.id, new PdfXref { objectId = obj.id, generationNumber = obj.generationNumber, filePosition = gw.Position }); if (trailerName != null) { gTrailer[trailerName] = new PdfNValue { name = trailerName, value = new PdfValueObjectRef { valueObjectId = obj.id, valueObjectGenerationNumber = obj.generationNumber } } } ; _WriteObject(obj); //gw.Write("{0} {1} obj\n", obj.id, obj.generationNumber); //WriteValue(obj.value); //gw.Write("\n"); //if (obj.stream != null) //{ // gw.Write("stream\n"); // gw.Write(obj.stream); // gw.Write("\n"); // gw.Write("endstream\n"); //} //gw.Write("endobj\n"); }
public static void Test_PdfExportDeflatedStream_01(string pdfFile, int idObject, string streamFile) { _tr.WriteLine("export stream object {0} of pdf file \"{1}\" to \"{2}\"", idObject, pdfFile, streamFile); PB_Pdf.PdfReader pr = null; Writer w = null; try { pr = new PB_Pdf.PdfReader(pdfFile); IPdfObject obj = ReadPdfObject(pr, idObject, "Object"); w = new Writer(streamFile, FileMode.Create); if (obj.deflatedStream != null) { w.Write(obj.deflatedStream); } } finally { if (pr != null) { pr.Close(); } if (w != null) { w.Close(); } } }
public void UpdateObject(IPdfObject obj, string trailerName = null) { if (!gUpdatePdf) { throw new PBException("error object update is not activate \"{0}\"", gw.File); } if (!gXref.ContainsKey(obj.id)) { throw new PBException("error update object {0}, object dont exist", obj.id); } gw.Seek(gUpdatePosition); gXref[obj.id] = new PdfXref { objectId = obj.id, generationNumber = obj.generationNumber, filePosition = gUpdatePosition }; if (trailerName != null) { gTrailer[trailerName] = new PdfNValue { name = trailerName, value = new PdfValueObjectRef { valueObjectId = obj.id, valueObjectGenerationNumber = obj.generationNumber } } } ; _WriteObject(obj); gUpdatePosition = (int)gw.Position; }
public static void Test_PdfUpdateStream_01(string pdfFile, int objectId, string streamFile) { _tr.WriteLine("update stream for object {0} with \"{1}\" of pdf file \"{2}\"", objectId, streamFile, pdfFile); PB_Pdf.PdfWriter pw = null; Reader r = null; try { pw = new PB_Pdf.PdfWriter(pdfFile, updatePdf: true); IPdfObject obj = pw.reader.ReadObject(objectId); r = new Reader(streamFile); obj.stream = r.ReadBytes((int)r.Length); PdfNValue length = obj.value["Length"]; if (length == null || !length.value.isInt()) { throw new PBException("error wrong /Length of object {0}", obj.id); } length.value.valueInt = obj.stream.Length; pw.UpdateObject(obj); } finally { if (r != null) { r.Close(); } if (pw != null) { pw.Close(); } } }
private void ApplyConfig(IntPtr config, IPdfObject settings, bool isGlobal) { if (settings == null) { return; } var properties = settings.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (var propertyInfo in properties) { var attrs = propertyInfo.GetCustomAttributes().ToArray(); var propValue = propertyInfo.GetValue(settings); if (propValue == null) { continue; } if (attrs.Length > 0 && attrs[0] is WkHtmlAttribute) { var attr = (WkHtmlAttribute)attrs[0]; Apply(config, attr.Name, propValue, isGlobal); } else if (propValue is IPdfObject) { ApplyConfig(config, propValue as IPdfObject, isGlobal); } } }
public PdfContents(IPdfObject obj) : base(PdfObjectType.Contents) { IsContainer = true; if (obj is PdfIndirectReference) { obj = (obj as PdfIndirectReference).ReferencedObject.Object; } PdfArray array = obj as PdfArray; PdfStream stream = obj as PdfStream; if (array != null) { Streams = array.Items; } else { if (stream != null) { var list = new List<IPdfObject>(); list.Add(stream); Streams = list.AsReadOnly(); } else { throw new Exception("Contents must be either a stream or an array of streams"); } } }
public static PdfXRefSection Parse(Lexer lexer) { int firstId = int.Parse(lexer.ReadToken(), CultureInfo.InvariantCulture); int size = int.Parse(lexer.ReadToken(), CultureInfo.InvariantCulture); var entries = new IPdfObject[size]; for (int i = 0; i < size; i++) { var entry = PdfXRefEntry.Parse(firstId + i, lexer); // first entry must be free and have a gen 65535 // head of the linked list of free objects if (i == 0) { if (entry.GenerationNumber != 65535) { throw new ParsingException($"The first xref entry must have generation number 65535. Was {entry.GenerationNumber}"); } if (entry.InUse) { throw new ParsingException($"The first xref entry must be free"); } } entries[i] = entry; } return(new PdfXRefSection(firstId, size, entries)); }
private PdfIndirectObject(int objectNumber, int generationNumber, IPdfObject obj) : base(PdfObjectType.IndirectObject) { IsContainer = true; ObjectNumber = objectNumber; GenerationNumber = generationNumber; Object = obj; }
internal void Register(IPdfObject pdfObject) { pdfObject.ObjectId = ++m_CurrentId; m_Objects[m_CurrentId] = pdfObject; if (pdfObject is IPdfXObject) { ((IPdfXObject)pdfObject).XObjectId = ++m_CurrentId; m_Objects[m_CurrentId] = pdfObject; } }
public static void Test_GetPdfText_01(String file) { _tr.WriteLine("read pdf file \"{0}\"", file); PB_Pdf.PdfReader pr = new PB_Pdf.PdfReader(file); try { IPdfObject obj = ReadPdfObject(pr, 1138, "Object"); } finally { pr.Close(); } }
private void WriteObject(IPdfObject obj) { if (obj is IPdfStream) { WriteStreamObject(obj as IPdfStream); } else if (obj is IPdfTypedObject) { WriteDictionary((obj as IPdfTypedObject).Dict); } else if (obj is PdfDictionary) { WriteDictionary(obj as PdfDictionary); } else if (obj is PdfArray) { WriteArray(obj as PdfArray); } else if (obj is PdfReference) { WriteReference(obj as PdfReference); } else if (obj is PdfName) { AsciiToOutput($"{(obj as PdfName).Name}"); } else if (obj is PdfString) { WriteString(obj as PdfString); } else if (obj is PdfBoolean) { WriteBoolean(obj as PdfBoolean); } else if (obj is PdfNumeric) { AsciiToOutput(obj.ToString()); } else if (obj is PdfHexString) { WriteHexString(obj as PdfHexString); } else if (obj is PdfNull) { AsciiToOutput("null"); } else { throw new Exception("Unknown object while writing"); } }
public static void PrintPdfObject(IPdfObject o) { _tr.WriteLine("object id {0} generation {1}", o.id, o.generationNumber); if (o.value.isObject()) { foreach (PdfNValue value in o.value.objectValues.Values) { _tr.WriteLine(" {0}", value); } } else if (o.value.isArray()) { int i = 0; foreach (IPdfValue value in o.value.arrayValues) { _tr.WriteLine(" [{0}] = {1}", i++, value); } } else { _tr.WriteLine(" {0}", o.value); } if (o.stream != null) { _tr.WriteLine(" stream {0} bytes, deflated stream {1}", o.stream.Length, o.deflatedStream.Length); } if (o.stream != null && logStream) { ////PrintStream(o.stream); //byte[] stream = o.deflatedStream; ////_tr.WriteLine("deflated stream {0} bytes", stream.Length); ////PrintStream(stream); //StringBuilder sb = new StringBuilder(); //bool cr = false; //foreach (byte b in stream) //{ // if (b == 10 && !cr) // sb.Append('\r'); // if (b == 13) // cr = true; // else // cr = false; // sb.Append((char)b); //} _tr.WriteLine("stream as string :"); //_tr.WriteLine(sb.ToString()); _tr.WriteLine(o.deflatedStream.zzToString()); _tr.WriteLine(); } }
private void _WriteObject(IPdfObject obj) { gw.Write("{0} {1} obj\n", obj.id, obj.generationNumber); WriteValue(obj.value); gw.Write("\n"); if (obj.stream != null) { gw.Write("stream\n"); gw.Write(obj.stream); gw.Write("\n"); gw.Write("endstream\n"); } gw.Write("endobj\n"); }
public static IPdfObject ReadPdfObject(PB_Pdf.PdfReader pr, int id, string name) { _tr.WriteLine(); //int id = ((PdfValueObject)(pr.Trailer.values["Root"].value)).id; _tr.WriteLine("read {0} object {1}", name, id); IPdfObject o = pr.ReadObject(id); _tr.WriteLine("{0} object {1}", name, id); PrintPdfObject(o); if (o.source != null && logSource) { _tr.WriteLine("Source {0} object {1}", name, id); _tr.WriteLine(o.source); } return(o); }
public static PdfStream Parse(PdfDictionary dictionary, Lexer lexer) { if (dictionary is null) { throw new ArgumentNullException(nameof(dictionary)); } lexer.Expects("stream"); char eol = lexer.ReadChar(); if (eol == '\r') { eol = lexer.ReadChar(); } if (eol != '\n') { throw new ParsingException($@"Stream must end with either \r\n or \n. Was '{eol}'"); } IPdfObject lengthObject = dictionary["Length"]; if (lengthObject is null) { throw new ParsingException("Stream dictionary is missing 'Length' entry"); } int length = 0; if (lengthObject is PdfIndirectReference reference) { PdfIndirectObject lenobj = lexer.IndirectReferenceResolver .GetObject(reference.ObjectNumber, reference.GenerationNumber); length = ((PdfNumeric)lenobj.Object).ToInt32(); } else { length = int.Parse(lengthObject.ToString(), CultureInfo.InvariantCulture); } var data = PdfData.Parse(lexer, length); lexer.Expects("endstream"); return(new PdfStream(dictionary, data)); }
public SerializationResult SerializeTree(PdfWriter writer, IPdfObject root) { var references = new List <Guid>(); var indRefs = new IndirectObjectDictionary(); // Add empty GUID to represent the "free" object references.Add(Guid.Empty); var offsets = new List <int>(); // need to visit all nodes to reserve references for each node var nodesToSerialize = new ConcurrentQueue <IPdfObject>(); var nodesToVisit = new Stack <IPdfObject>(); nodesToVisit.Push(root); while (nodesToVisit.Count > 0) { var node = nodesToVisit.Pop(); if (node == null || indRefs.Contains(node)) { continue; } nodesToVisit.PushRange(node.GetChildren()); indRefs.Add(node); nodesToSerialize.Enqueue(node); } while (nodesToSerialize.TryDequeue(out IPdfObject node)) { offsets.Add((int)writer.Position); writer.WriteLine($"{indRefs[node].Identifier} 0 {PdfTokens.StartObject}"); SerdesFactory.GetFor(node).Serialize(writer, node, indRefs); writer.WriteLine(PdfTokens.EndObject); } return(new SerializationResult() { Offsets = offsets, References = indRefs }); }
private PdfArray ParseArray() { var ary = new PdfArray(); Token peek = _lexer.Peek(); while (peek.Type != TokenType.EndArray) { IPdfObject obj = ParseObject(); ary.Add(obj); peek = _lexer.Peek(); } _lexer.Next(); Expect(TokenType.EndArray); return(ary); }
public static void Test_PdfExportDeflatedStream_02(String pdfFile, int objectId, string streamFile) { Writer w = null; _tr.WriteLine("export stream object {0} pdf file \"{1}\" to \"{2}\"", objectId, pdfFile, streamFile); PB_Pdf.PdfReader pr = new PB_Pdf.PdfReader(pdfFile); try { IPdfObject obj = ReadPdfObject(pr, objectId, "Object"); if (obj.deflatedStream == null) { _tr.WriteLine("no stream"); return; } _tr.WriteLine("read data"); //IPdfInstruction[] instructions = PdfDataReader.PdfReadAll(obj.deflatedStream); PdfDataReader pdr = new PdfDataReader(obj.deflatedStream); //pdr.Trace += new TraceDelegate(_tr.WriteLine); IPdfInstruction[] instructions = pdr.ReadAll(); _tr.WriteLine("{0} instructions", instructions.Length); //var q = from instruction in instructions select instruction.opeString; //foreach (string opeString in q.Distinct().OrderBy(opeString => opeString)) //{ // _tr.WriteLine(opeString); //} w = new Writer(streamFile, FileMode.Create); foreach (IPdfInstruction instruction in instructions) { //_tr.WriteLine(instruction); //w.WriteLine(instruction.ToString()); instruction.Export(w); } } finally { if (w != null) { w.Close(); } pr.Close(); } }
private PdfDictionary ParseDictionary() { var dict = new PdfDictionary(); _lexer.Next(); while (!Accept(TokenType.EndDict)) { Expect(TokenType.Name); var key = new PdfName() { Name = (string)_lexer.Current.Value }; IPdfObject obj = ParseObject(); dict.Add(key, obj); _lexer.Next(); } return(dict); }
public PdfContents(IPdfObject obj) : base(PdfObjectType.Contents) { IsContainer = true; if (obj is PdfIndirectReference reference) { obj = reference.ReferencedObject.Object; } if (obj is PdfArray array) { Streams = array.Items; } else if (obj is PdfStream stream) { Streams = new[] { stream }; } else { throw new Exception("Contents must be either a stream or an array of streams"); } }
internal IPdfObject ResolveReference(PdfReference reference) { PdfCrossReference indirectObj = Xref.Get(reference.ObjectNumber, reference.Generation); if (indirectObj == null) { return(null); } if (!indirectObj.Loaded) { Parser.ParseIndirectObjectDefinition(indirectObj); } IPdfObject obj = indirectObj.Object; if (obj is PdfReference) { return(ResolveReference(obj as PdfReference)); } return(obj); }
public IPdfObject ReadObject(int id) { // trailer // << // /Size 5274 // /Root 5273 0 R // /Info 5272 0 R // >> // 5273 0 obj // << // /Type /Catalog // /Pages 1 0 R // /OpenAction [3 0 R /FitH null] // /PageLayout /OneColumn // >> // endobj // 3 0 obj // <</Type /Page // /Parent 1 0 R // /MediaBox [0 0 907.09 1292.59] // /Resources 2 0 R // /Contents 4 0 R>> // endobj if (!gXref.ContainsKey(id)) { throw new PBException("error unknow object {0}", id); } PdfXref xref = gXref[id]; gpsr.StartReadObject(string.Format("object {0}", id)); gpsr.Seek(xref.filePosition); // 5273 0 obj Regex rg_object_begin = new Regex("^([0-9]+) ([0-9]+) obj$", RegexOptions.Compiled); PdfObjectDictionary o = new PdfObjectDictionary(id, xref.generationNumber); string s = gpsr.ReadLine(); Match match = rg_object_begin.Match(s); if (!match.Success || int.Parse(match.Groups[1].Value) != id || int.Parse(match.Groups[2].Value) != xref.generationNumber) { throw new PBException("error reading {0} line {1} \"{2}\"", gpsr.ObjectName, gpsr.LineNumber, s); } s = gpsr.ReadLine(); o.value = ReadPdfValue(ref s); if (s == "") { s = gpsr.ReadLine(); } if (s == "stream") { int length = 0; PdfNValue lengthValue = null; if (o.value.isObject()) { lengthValue = o.value["Length"]; } if (lengthValue == null) { throw new PBException("error stream without /Length reading {0} line {1} \"{2}\"", gpsr.ObjectName, gpsr.LineNumber, s); } if (lengthValue.value.isInt()) { length = lengthValue.value.valueInt; } else if (lengthValue.value.isObjectRef()) { long position = gpsr.Position; PdfObjectReader or = new PdfObjectReader(this); IPdfObject lengthObject = or.ReadObject(lengthValue.value.valueObjectId); gpsr.Seek(position); if (lengthObject.value.isInt()) { length = lengthObject.value.valueInt; } } if (length != 0) { o.stream = gpsr.ReadStream(length); } else { o.stream = gpsr.ReadStream(); } s = gpsr.ReadLine(); } if (s != "endobj") { throw new PBException("error endobj not found reading {0} line {1} \"{2}\"", gpsr.ObjectName, gpsr.LineNumber, s); } o.source = gpsr.GetObjectSource(); return(o); }
public static void PrintPdfObject(IPdfObject o) { _tr.WriteLine("object id {0} generation {1}", o.id, o.generationNumber); if (o.value.isObject()) { foreach (PdfNValue value in o.value.objectValues.Values) { _tr.WriteLine(" {0}", value); } } else if (o.value.isArray()) { int i = 0; foreach (IPdfValue value in o.value.arrayValues) { _tr.WriteLine(" [{0}] = {1}", i++, value); } } else _tr.WriteLine(" {0}", o.value); if (o.stream != null) { _tr.WriteLine(" stream {0} bytes, deflated stream {1}", o.stream.Length, o.deflatedStream.Length); } if (o.stream != null && logStream) { ////PrintStream(o.stream); //byte[] stream = o.deflatedStream; ////_tr.WriteLine("deflated stream {0} bytes", stream.Length); ////PrintStream(stream); //StringBuilder sb = new StringBuilder(); //bool cr = false; //foreach (byte b in stream) //{ // if (b == 10 && !cr) // sb.Append('\r'); // if (b == 13) // cr = true; // else // cr = false; // sb.Append((char)b); //} _tr.WriteLine("stream as string :"); //_tr.WriteLine(sb.ToString()); _tr.WriteLine(o.deflatedStream.zzToString()); _tr.WriteLine(); } }
public void WriteObjectWithChilds(IPdfObject obj, string trailerName = null) { WriteObject(obj, trailerName); WriteChildsObject(obj.value); }
public static void Test_GetPdfText_08(String file) { PB_Pdf.PdfWriter pw = null; string file2 = zpath.PathSetFileName(file, Path.GetFileNameWithoutExtension(file) + "_new"); _tr.WriteLine("read pdf file \"{0}\"", file); _tr.WriteLine("save pdf to file \"{0}\"", file2); PB_Pdf.PdfReader pr = new PB_Pdf.PdfReader(file); pr.Trace += new TraceDelegate(_tr.WriteLine); try { pw = new PB_Pdf.PdfWriter(file2, FileMode.Create); pw.reader = pr; IPdfObject info = ReadPdfObject(pr, pr.Trailer["Info"].value.valueObjectId, "Info"); pw.WriteObject(info, "Info"); IPdfObject root = ReadPdfObject(pr, pr.Trailer["Root"].value.valueObjectId, "Root"); pw.WriteObject(root, "Root"); IPdfObject pages = ReadPdfObject(pr, root.value["Pages"].value.valueObjectId, "Pages"); pages.value["Kids"].value.arrayValues = new IPdfValue[] { pages.value["Kids"].value.arrayValues[0] }; pages.value["Count"].value.valueInt = 1; pw.WriteObject(pages); IPdfObject page1 = ReadPdfObject(pr, pages.value["Kids"].value[0].valueObjectId, "Page 1"); pw.WriteObject(page1); IPdfObject page1Content = ReadPdfObject(pr, page1.value["Contents"].value.valueObjectId, "Contents page 1"); page1Content.value.objectValues.Remove("Filter"); page1Content.stream = page1Content.deflatedStream; page1Content.value.objectValues["Length"].value.valueInt = page1Content.stream.Length; pw.WriteObject(page1Content); IPdfObject page1Ressource = ReadPdfObject(pr, page1.value["Resources"].value.valueObjectId, "Resources page 1"); Dictionary <string, PdfNValue> objectValues = new Dictionary <string, PdfNValue>(); objectValues["TPL1"] = page1Ressource.value["XObject"].value["TPL1"]; page1Ressource.value["XObject"].value.objectValues = objectValues; pw.WriteObject(page1Ressource); IPdfObject page1Ressource_01 = ReadPdfObject(pr, page1Ressource.value["XObject"].value["TPL1"].value.valueObjectId, "Resources page 1 /TPL1"); page1Ressource_01.value.objectValues.Remove("Filter"); page1Ressource_01.stream = page1Ressource_01.deflatedStream; page1Ressource_01.value.objectValues["Length"].value.valueInt = page1Ressource_01.stream.Length; pw.WriteObjectWithChilds(page1Ressource_01); //IPdfObject page1Ressource_ProcSet = ReadPdfObject(pr, page1Ressource_01.value["Resources"].value["ProcSet"].value.valueObjectId, "Resources page 1 /TPL1 ProcSet"); //IPdfObject page1Ressource_Font_01 = ReadPdfObject(pr, page1Ressource_01.value["Resources"].value["Font"].value["F23"].value.valueObjectId, "Resources page 1 /TPL1 Font F23"); //IPdfObject page1Ressource_Font_01_Widths = ReadPdfObject(pr, page1Ressource_Font_01.value["Widths"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 Widths"); //IPdfObject page1Ressource_Font_01_Encoding = ReadPdfObject(pr, page1Ressource_Font_01.value["Encoding"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 Encoding"); //IPdfObject page1Ressource_Font_01_FontDescriptor = ReadPdfObject(pr, page1Ressource_Font_01.value["FontDescriptor"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 FontDescriptor"); //IPdfObject page1Ressource_Font_01_FontDescriptor_FontFile3 = ReadPdfObject(pr, page1Ressource_Font_01_FontDescriptor.value["FontFile3"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 FontDescriptor FontFile3"); //IPdfObject page1Ressource_Font_01_ToUnicode = ReadPdfObject(pr, page1Ressource_Font_01.value["Widths"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 ToUnicode"); //IPdfObject page1Ressource_Img_01 = ReadPdfObject(pr, page1Ressource_01.value["Resources"].value["XObject"].value["img8"].value.valueObjectId, "Resources page 1 /TPL1 XObject img8"); //IPdfObject page1Ressource_Img_01_Length = ReadPdfObject(pr, page1Ressource_Img_01.value["Length"].value.valueObjectId, "Resources page 1 /TPL1 XObject img8 Length"); //IPdfObject page1Ressource_OPMON = ReadPdfObject(pr, page1Ressource_01.value["Resources"].value["ExtGState"].value["OPMON"].value.valueObjectId, "Resources page 1 /TPL1 ExtGState OPMON"); } finally { pr.Close(); if (pw != null) { pw.Close(); } } }
public PdfCrossReference AddObject(IPdfObject obj) { return(Xref.AddEntry(obj)); }
public static PdfXRefSection Parse(PdfStream pdfStream) { var dictionary = pdfStream.StreamDictionary; var type = dictionary["Type"] as PdfName; if (type.Name != "XRef") { throw new ParsingException("A stream of type XRef is expected"); } // W[1 2 1] (4 columns) // W[1 3 1] (5 columns, larger indexes) var w = dictionary["W"] as PdfArray; int firstId = 0; int size = 0; if (dictionary.TryGetValue("Index", out IPdfObject indexObject)) { var index = (PdfArray)indexObject; firstId = ((PdfNumeric)index.Items[0]).ToInt32(); size = ((PdfNumeric)index.Items[1]).ToInt32(); } else if (dictionary.TryGetValue("Size", out IPdfObject sizeObject)) { size = ((PdfNumeric)sizeObject).ToInt32(); } int items = w.Items.Count; // for xref this shall always be 3 if (items != 3) { throw new ParsingException("The W[] parameter must contain 3 columns for an XRef"); } int[] sizes = new int[w.Items.Count]; int bytesPerEntry = 0; for (int i = 0; i < items; i++) { sizes[i] = ((PdfNumeric)w.Items[i]).ToInt32(); bytesPerEntry += sizes[i]; } var decodedXRef = pdfStream.Decode(); // Use W[...] to build up the xref int rowCount = decodedXRef.Length / bytesPerEntry; if (size != rowCount) { throw new ParsingException("The number of refs inside the Index value must match the actual refs count present in the stream"); } var entries = new IPdfObject[rowCount]; for (int row = 0; row < rowCount; row++) { var entry = PdfXRefEntry.Parse(firstId + row, decodedXRef, sizes, row, bytesPerEntry); entries[row] = entry; } return(new PdfXRefSection(firstId, size, entries)); }
public void WriteObject(IPdfObject obj, string trailerName = null) { if (gXref.ContainsKey(obj.id)) throw new PBException("error object already in file id {0}", obj.id); gXref.Add(obj.id, new PdfXref { objectId = obj.id, generationNumber = obj.generationNumber, filePosition = gw.Position }); if (trailerName != null) gTrailer[trailerName] = new PdfNValue { name = trailerName, value = new PdfValueObjectRef { valueObjectId = obj.id, valueObjectGenerationNumber = obj.generationNumber } }; _WriteObject(obj); //gw.Write("{0} {1} obj\n", obj.id, obj.generationNumber); //WriteValue(obj.value); //gw.Write("\n"); //if (obj.stream != null) //{ // gw.Write("stream\n"); // gw.Write(obj.stream); // gw.Write("\n"); // gw.Write("endstream\n"); //} //gw.Write("endobj\n"); }
private void method_1(object sender, int index, IPdfObject item) { this.value["Count"] = (IPdfObject) new PdfInt(this.Kids.Count); }
internal PdfCrossReference ParseIndirectObjectDefinition(PdfCrossReference indirectObj) { int offset = -1; if (indirectObj == null) { offset = _lexer.Current.Offset; } else { if (indirectObj.Loaded) { return(indirectObj); } // Entry points to an indirect object stream - resolve that. if (indirectObj != null && indirectObj.EntryType == XrefEntryType.InStream) { return(ParseFromStream(indirectObj)); } _lexer.Seek(indirectObj.Offset); _lexer.Next(); Expect(TokenType.Integer); } int objectNumber = (int)_lexer.Current.Value; _lexer.Next(); Expect(TokenType.Integer); int generation = (int)_lexer.Current.Value; if (indirectObj == null) { indirectObj = new PdfCrossReference() { EntryType = XrefEntryType.Used, ObjectNumber = objectNumber, Generation = generation, Offset = offset } } ; else if (objectNumber != indirectObj.ObjectNumber || generation != indirectObj.Generation) { throw new ParserException($"Expecting object {indirectObj.ObjectNumber} {indirectObj.Generation} at offset {indirectObj.Offset} but got {objectNumber} {generation}"); } _lexer.Next(); Expect(TokenType.Object); IPdfObject obj = ParseObject(); _lexer.Next(); if (Accept(TokenType.Stream)) { if (!(obj is PdfDictionary)) { throw new ParserException("Stream objects must be preceded by a dictionary"); } obj = SetObjectType(indirectObj, ParseStream(obj as PdfDictionary)); _lexer.Next(); } else if (obj is PdfDictionary) { obj = SetObjectType(indirectObj, obj as PdfDictionary); } Expect(TokenType.EndObject); indirectObj.Object = obj; indirectObj.Loaded = true; return(indirectObj); }
//public static void Test_GetPdfText_01() //{ // string file = @"c:\pib\media\print\Le monde\_quotidien\Le monde - 2012-12\Le monde - 2012-12-06 - no 21113.pdf"; // _tr.WriteLine("read pdf file \"{0}\"", file); // string s = Test_GetPdfText_01(file); // _tr.WriteLine(s); // //PdfTextExtractor.GetTextFromPage(); // //ITextExtractionStrategy // // iTextSharp.text.pdf.parser.LocationTextExtractionStrategy //} public static void Test_GetPdfText_07(String file) { _tr.WriteLine("read pdf file \"{0}\"", file); PB_Pdf.PdfReader pr = new PB_Pdf.PdfReader(file); pr.KeepObjectSource = true; try { //_tr.WriteLine(); //_tr.WriteLine("read xref position"); //pr.ReadXrefPosition(); //_tr.WriteLine("xref table position : {0}", pr.XrefPosition.zToHex()); //_tr.WriteLine(); //_tr.WriteLine("read xref headers"); //pr.ReadXrefHeaders(); //_tr.WriteLine("trailer position : {0}", pr.TrailerPosition.zToHex()); //_tr.WriteLine("objects number : {0}", pr.ObjectsNumber); //foreach (PdfXrefHeader header in pr.XrefHeaders) //{ // _tr.WriteLine("xref header : pos {0} id {1} nb {2}", header.filePosition.zToHex(), header.objectId, header.objectNb); //} //_tr.WriteLine(); //_tr.WriteLine("read trailer"); //pr.ReadTrailer(); _tr.WriteLine("trailer"); //PrintPdfObject(pr.Trailer); PrintPdfTrailer(pr.Trailer); //if (pr.Trailer.source != null) //{ // _tr.WriteLine("Source trailer"); // _tr.WriteLine(pr.Trailer.source); //} //_tr.WriteLine(); //_tr.WriteLine("read xref"); //pr.ReadXref(); //int i = 0; //foreach (PdfXref xref in pr.Xref.Values) //{ // _tr.WriteLine("xref : id {0,5} pos {1} generation {2}", xref.objectId, xref.filePosition.zToHex(), xref.generationNumber); // if (++i == 10) break; //} //IPdfObject info = ReadPdfObject(pr, pr.Trailer["Info"].valueObjectId, "Info"); IPdfObject info = ReadPdfObject(pr, pr.Trailer["Info"].value.valueObjectId, "Info"); IPdfObject root = ReadPdfObject(pr, pr.Trailer["Root"].value.valueObjectId, "Root"); IPdfObject pages = ReadPdfObject(pr, root.value["Pages"].value.valueObjectId, "Pages"); IPdfObject page1 = ReadPdfObject(pr, pages.value["Kids"].value[0].valueObjectId, "Page 1"); IPdfObject page1Content = ReadPdfObject(pr, page1.value["Contents"].value.valueObjectId, "Contents page 1"); IPdfObject page1Ressource = ReadPdfObject(pr, page1.value["Resources"].value.valueObjectId, "Resources page 1"); //IPdfObject page1Ressource_01 = ReadPdfObject(pr, 59, "Contents page 1 (2)"); IPdfObject page1Ressource_01 = ReadPdfObject(pr, page1Ressource.value["XObject"].value["TPL1"].value.valueObjectId, "Resources page 1 /TPL1"); IPdfObject page1Ressource_ProcSet = ReadPdfObject(pr, page1Ressource_01.value["Resources"].value["ProcSet"].value.valueObjectId, "Resources page 1 /TPL1 ProcSet"); IPdfObject page1Ressource_Font_01 = ReadPdfObject(pr, page1Ressource_01.value["Resources"].value["Font"].value["F23"].value.valueObjectId, "Resources page 1 /TPL1 Font F23"); IPdfObject page1Ressource_Font_01_Widths = ReadPdfObject(pr, page1Ressource_Font_01.value["Widths"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 Widths"); IPdfObject page1Ressource_Font_01_Encoding = ReadPdfObject(pr, page1Ressource_Font_01.value["Encoding"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 Encoding"); IPdfObject page1Ressource_Font_01_FontDescriptor = ReadPdfObject(pr, page1Ressource_Font_01.value["FontDescriptor"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 FontDescriptor"); IPdfObject page1Ressource_Font_01_FontDescriptor_FontFile3 = ReadPdfObject(pr, page1Ressource_Font_01_FontDescriptor.value["FontFile3"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 FontDescriptor FontFile3"); IPdfObject page1Ressource_Font_01_ToUnicode = ReadPdfObject(pr, page1Ressource_Font_01.value["Widths"].value.valueObjectId, "Resources page 1 /TPL1 Font F23 ToUnicode"); IPdfObject page1Ressource_Img_01 = ReadPdfObject(pr, page1Ressource_01.value["Resources"].value["XObject"].value["img8"].value.valueObjectId, "Resources page 1 /TPL1 XObject img8"); IPdfObject page1Ressource_Img_01_Length = ReadPdfObject(pr, page1Ressource_Img_01.value["Length"].value.valueObjectId, "Resources page 1 /TPL1 XObject img8 Length"); IPdfObject page1Ressource_OPMON = ReadPdfObject(pr, page1Ressource_01.value["Resources"].value["ExtGState"].value["OPMON"].value.valueObjectId, "Resources page 1 /TPL1 ExtGState OPMON"); //_tr.WriteLine("stream as string :"); //_tr.WriteLine(page1Ressource_01.deflatedStream.zzToString()); //_tr.WriteLine(); //IPdfObject obj = ReadPdfObject(pr, 1043, "Object 1043"); } finally { pr.Close(); } }
get => TryGetValue(name, out IPdfObject value) ? value
public static void Test_PdfImportStream_01(string inputPdfFile, string outputPdfFile, string streamFile) { _tr.WriteLine("import stream for object TPL1 of pdf file \"{0}\" from \"{1}\" and save pdf to \"{2}\"", inputPdfFile, streamFile, outputPdfFile); PB_Pdf.PdfReader pr = null; Reader r = null; PB_Pdf.PdfWriter pw = null; try { pr = new PB_Pdf.PdfReader(inputPdfFile); //IPdfObject obj = ReadPdfObject(pr, idObject, "Object"); r = new Reader(streamFile); //obj.stream = r.ReadBytes((int)r.Length); //PdfNValue length = obj.value["Length"]; //if (length == null || !length.value.isInt()) throw new PBException("error wrong /Length of object {0}", idObject); //length.value.valueInt = obj.stream.Length; pw = new PB_Pdf.PdfWriter(outputPdfFile, FileMode.Create); pw.reader = pr; IPdfObject info = ReadPdfObject(pr, pr.Trailer["Info"].value.valueObjectId, "Info"); pw.WriteObject(info, "Info"); IPdfObject root = ReadPdfObject(pr, pr.Trailer["Root"].value.valueObjectId, "Root"); pw.WriteObject(root, "Root"); IPdfObject pages = ReadPdfObject(pr, root.value["Pages"].value.valueObjectId, "Pages"); pw.WriteObject(pages); IPdfObject page1 = ReadPdfObject(pr, pages.value["Kids"].value[0].valueObjectId, "Page 1"); pw.WriteObject(page1); IPdfObject page1Content = ReadPdfObject(pr, page1.value["Contents"].value.valueObjectId, "Contents page 1"); pw.WriteObject(page1Content); IPdfObject page1Ressource = ReadPdfObject(pr, page1.value["Resources"].value.valueObjectId, "Resources page 1"); pw.WriteObject(page1Ressource); IPdfObject page1Ressource_01 = ReadPdfObject(pr, page1Ressource.value["XObject"].value["TPL1"].value.valueObjectId, "Resources page 1 /TPL1"); // import stream from file page1Ressource_01.stream = r.ReadBytes((int)r.Length); PdfNValue length = page1Ressource_01.value["Length"]; if (length == null || !length.value.isInt()) { throw new PBException("error wrong /Length of object {0}", page1Ressource_01.id); } length.value.valueInt = page1Ressource_01.stream.Length; pw.WriteObjectWithChilds(page1Ressource_01); } finally { if (pr != null) { pr.Close(); } if (r != null) { r.Close(); } if (pw != null) { pw.Close(); } } }
public void UpdateObject(IPdfObject obj, string trailerName = null) { if (!gUpdatePdf) throw new PBException("error object update is not activate \"{0}\"", gw.File); if (!gXref.ContainsKey(obj.id)) throw new PBException("error update object {0}, object dont exist", obj.id); gw.Seek(gUpdatePosition); gXref[obj.id] = new PdfXref { objectId = obj.id, generationNumber = obj.generationNumber, filePosition = gUpdatePosition }; if (trailerName != null) gTrailer[trailerName] = new PdfNValue { name = trailerName, value = new PdfValueObjectRef { valueObjectId = obj.id, valueObjectGenerationNumber = obj.generationNumber } }; _WriteObject(obj); gUpdatePosition = (int)gw.Position; }