Beispiel #1
0
        public xObjects::XObject ToXObject(
            Document context
            )
        {
            xObjects::FormXObject form;

            {
                form           = new xObjects::FormXObject(context, Box);
                form.Resources = (Resources)(context.Equals(Document)
          ? Resources                // Same document: reuses the existing resources.
          : Resources.Clone(context) // Alien document: clones the resources.
                                             );

                // Body (contents).
                {
                    IBuffer       formBody           = form.BaseDataObject.Body;
                    PdfDataObject contentsDataObject = BaseDataObject.Resolve(PdfName.Contents);
                    if (contentsDataObject is PdfStream)
                    {
                        formBody.Append(((PdfStream)contentsDataObject).Body);
                    }
                    else
                    {
                        foreach (PdfDirectObject contentStreamObject in (PdfArray)contentsDataObject)
                        {
                            formBody.Append(((PdfStream)contentStreamObject.Resolve()).Body);
                        }
                    }
                }
            }
            return(form);
        }
Beispiel #2
0
        /**
         * <summary>Serializes the object stream entries into the stream body.</summary>
         */
        private void Flush(
            IOutputStream stream
            )
        {
            // 1. Body.
            int dataByteOffset;
            {
                // Serializing the entries into the stream buffer...
                IBuffer         indexBuffer     = new bytes.Buffer();
                IBuffer         dataBuffer      = new bytes.Buffer();
                IndirectObjects indirectObjects = File.IndirectObjects;
                int             objectIndex     = -1;
                File            context         = File;
                foreach (KeyValuePair <int, ObjectEntry> entry in Entries)
                {
                    int objectNumber = entry.Key;

                    // Update the xref entry!
                    XRefEntry xrefEntry = indirectObjects[objectNumber].XrefEntry;
                    xrefEntry.Offset = ++objectIndex;

                    /*
                     * NOTE: The entry offset MUST be updated only after its serialization, in order not to
                     * interfere with its possible data-object retrieval from the old serialization.
                     */
                    int entryValueOffset = (int)dataBuffer.Length;

                    // Index.
                    indexBuffer
                    .Append(objectNumber.ToString()).Append(Chunk.Space)      // Object number.
                    .Append(entryValueOffset.ToString()).Append(Chunk.Space); // Byte offset (relative to the first one).

                    // Data.
                    entry.Value.DataObject.WriteTo(dataBuffer, context);
                    entry.Value.offset = entryValueOffset;
                }

                // Get the stream buffer!
                IBuffer body = Body;

                // Delete the old entries!
                body.SetLength(0);

                // Add the new entries!
                body.Append(indexBuffer);
                dataByteOffset = (int)body.Length;
                body.Append(dataBuffer);
            }

            // 2. Header.
            {
                PdfDictionary header = Header;
                header[PdfName.N]     = PdfInteger.Get(Entries.Count);
                header[PdfName.First] = PdfInteger.Get(dataByteOffset);
            }
        }
Beispiel #3
0
        public xObjects::XObject ToXObject(
            Document context
            )
        {
            File contextFile = context.File;

            xObjects::FormXObject form       = new xObjects::FormXObject(context);
            PdfStream             formStream = form.BaseDataObject;

            // Header.
            {
                PdfDictionary formHeader = formStream.Header;
                // Bounding box.
                formHeader[PdfName.BBox] = (PdfDirectObject)GetInheritableAttribute(PdfName.MediaBox).Clone(contextFile);
                // Resources.
                {
                    PdfDirectObject resourcesObject = GetInheritableAttribute(PdfName.Resources);
                    // Same document?
                    /* NOTE: Try to reuse the resource dictionary whenever possible. */
                    formHeader[PdfName.Resources] = (context.Equals(Document) ?
                                                     resourcesObject
            : (PdfDirectObject)resourcesObject.Clone(contextFile));
                }
            }

            // Body (contents).
            {
                IBuffer       formBody           = formStream.Body;
                PdfDataObject contentsDataObject = BaseDataObject.Resolve(PdfName.Contents);
                if (contentsDataObject is PdfStream)
                {
                    formBody.Append(((PdfStream)contentsDataObject).Body);
                }
                else
                {
                    foreach (PdfDirectObject contentStreamObject in (PdfArray)contentsDataObject)
                    {
                        formBody.Append(((PdfStream)File.Resolve(contentStreamObject)).Body);
                    }
                }
            }

            return(form);
        }
Beispiel #4
0
        /**
         * <summary>Serializes the xref stream entries into the stream body.</summary>
         */
        private void Flush(
            IOutputStream stream
            )
        {
            // 1. Body.
            PdfArray indexArray = new PdfArray();

            int[] entryFieldSizes = new int[]
            {
                EntryField0Size,
                GetFieldSize((int)stream.Length), // NOTE: We assume this xref stream is the last indirect object.
                EntryField2Size
            };
            {
                // Get the stream buffer!
                IBuffer body = Body;

                // Delete the old entries!
                body.SetLength(0);

                // Serializing the entries into the stream buffer...
                int prevObjectNumber = -2; // Previous-entry object number.
                foreach (XRefEntry entry in entries.Values)
                {
                    int entryNumber = entry.Number;
                    if (entryNumber - prevObjectNumber != 1) // Current subsection terminated.
                    {
                        if (indexArray.Count > 0)
                        {
                            indexArray.Add(PdfInteger.Get(prevObjectNumber - ((PdfInteger)indexArray[indexArray.Count - 1]).IntValue + 1));
                        }                                            // Number of entries in the previous subsection.
                        indexArray.Add(PdfInteger.Get(entryNumber)); // First object number in the next subsection.
                    }
                    prevObjectNumber = entryNumber;

                    switch (entry.Usage)
                    {
                    case XRefEntry.UsageEnum.Free:
                        body.Append((byte)FreeEntryType);
                        body.Append(NumberToByteArray(entry.Offset, entryFieldSizes[1]));
                        body.Append(NumberToByteArray(entry.Generation, entryFieldSizes[2]));
                        break;

                    case XRefEntry.UsageEnum.InUse:
                        body.Append((byte)InUseEntryType);
                        body.Append(NumberToByteArray(entry.Offset, entryFieldSizes[1]));
                        body.Append(NumberToByteArray(entry.Generation, entryFieldSizes[2]));
                        break;

                    case XRefEntry.UsageEnum.InUseCompressed:
                        body.Append((byte)InUseCompressedEntryType);
                        body.Append(NumberToByteArray(entry.StreamNumber, entryFieldSizes[1]));
                        body.Append(NumberToByteArray(entry.Offset, entryFieldSizes[2]));
                        break;

                    default:
                        throw new NotSupportedException();
                    }
                }
                indexArray.Add(PdfInteger.Get(prevObjectNumber - ((PdfInteger)indexArray[indexArray.Count - 1]).IntValue + 1)); // Number of entries in the previous subsection.
            }

            // 2. Header.
            {
                PdfDictionary header = Header;
                header[PdfName.Index] = indexArray;
                header[PdfName.Size]  = PdfInteger.Get(File.IndirectObjects.Count + 1);
                header[PdfName.W]     = new PdfArray(
                    PdfInteger.Get(entryFieldSizes[0]),
                    PdfInteger.Get(entryFieldSizes[1]),
                    PdfInteger.Get(entryFieldSizes[2])
                    );
            }
        }