Example #1
0
 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");
 }
Example #2
0
        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();
                }
            }
        }
Example #3
0
 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;
 }
Example #4
0
        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();
                }
            }
        }
Example #5
0
        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);
                }
            }
        }
Example #6
0
 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");
         }
     }
 }
Example #7
0
        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));
        }
Example #8
0
        private PdfIndirectObject(int objectNumber, int generationNumber, IPdfObject obj)
            : base(PdfObjectType.IndirectObject)
        {
            IsContainer = true;

            ObjectNumber     = objectNumber;
            GenerationNumber = generationNumber;
            Object           = obj;
        }
Example #9
0
        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;
            }
        }
Example #10
0
        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;
              }
        }
Example #11
0
 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");
     }
 }
Example #13
0
 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();
     }
 }
Example #14
0
 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");
 }
Example #15
0
        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);
        }
Example #16
0
        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
            });
        }
Example #18
0
        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);
        }
Example #19
0
        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();
            }
        }
Example #20
0
        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);
        }
Example #21
0
        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");
            }
        }
Example #22
0
        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);
        }
Example #23
0
        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);
        }
Example #24
0
 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();
     }
 }
Example #25
0
 public void WriteObjectWithChilds(IPdfObject obj, string trailerName = null)
 {
     WriteObject(obj, trailerName);
     WriteChildsObject(obj.value);
 }
Example #26
0
        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();
                }
            }
        }
Example #27
0
 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");
 }
Example #28
0
 public PdfCrossReference AddObject(IPdfObject obj)
 {
     return(Xref.AddEntry(obj));
 }
Example #29
0
        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));
        }
Example #30
0
 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");
 }
Example #31
0
 private void method_1(object sender, int index, IPdfObject item)
 {
     this.value["Count"] = (IPdfObject) new PdfInt(this.Kids.Count);
 }
Example #32
0
        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);
        }
Example #33
0
        //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();
            }
        }
Example #34
0
 get => TryGetValue(name, out IPdfObject value)
     ? value
Example #35
0
        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();
                }
            }
        }
Example #36
0
 public void WriteObjectWithChilds(IPdfObject obj, string trailerName = null)
 {
     WriteObject(obj, trailerName);
     WriteChildsObject(obj.value);
 }
Example #37
0
 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;
 }