コード例 #1
0
ファイル: PdfReader.cs プロジェクト: aakkssqq/CreatePDFCSharp
        protected void iteratePages(PdfDictionary page)
        {
            PdfName type = (PdfName)getPdfObject(page.get(PdfName.TYPE));

            if (type.Equals(PdfName.PAGE))
            {
                PdfDictionary dic = (PdfDictionary)pageInh[pageInh.Count - 1];
                foreach (PdfName key in dic.Keys)
                {
                    if (page.get(key) == null)
                    {
                        page.put(key, dic.get(key));
                    }
                }
                pages[pagesCount++] = page;
            }
            else
            {
                pushPageAttributes(page);
                PdfArray  kidsPR = (PdfArray)getPdfObject(page.get(PdfName.KIDS));
                ArrayList kids   = kidsPR.ArrayList;
                for (int k = 0; k < kids.Count; ++k)
                {
                    PdfDictionary kid = (PdfDictionary)getPdfObject((PdfObject)kids[k]);
                    iteratePages(kid);
                }
                popPageAttributes();
            }
        }
コード例 #2
0
ファイル: PdfReader.cs プロジェクト: aakkssqq/CreatePDFCSharp
        protected void readXref()
        {
            tokens.seek(tokens.Startxref);
            tokens.nextToken();
            if (!tokens.StringValue.Equals("startxref"))
            {
                throw new IOException("startxref not found.");
            }
            tokens.nextToken();
            if (tokens.TokenType != PRTokeniser.TK_NUMBER)
            {
                throw new IOException("startxref is not followed by a number.");
            }
            int startxref = tokens.IntValue;

            tokens.seek(startxref);
            int ch;

            do
            {
                ch = tokens.read();
            } while (ch != -1 && ch != 't');
            if (ch == -1)
            {
                throw new IOException("Unexpected end of file.");
            }
            tokens.backOnePosition();
            tokens.nextValidToken();
            if (!tokens.StringValue.Equals("trailer"))
            {
                throw new IOException("trailer not found.");
            }
            trailer = (PdfDictionary)readPRObject();
            if (trailer.get(PdfName.ENCRYPT) != null)
            {
                throw new IOException("Encrypted files are not supported.");
            }
            PdfNumber xrefSize = (PdfNumber)trailer.get(PdfName.SIZE);

            xref = new int[xrefSize.IntValue];
            tokens.seek(startxref);
            readXrefSection();
            PdfDictionary trailer2 = trailer;

            while (true)
            {
                PdfNumber prev = (PdfNumber)trailer2.get(PdfName.PREV);
                if (prev == null)
                {
                    break;
                }
                tokens.seek(prev.IntValue);
                readXrefSection();
                trailer2 = (PdfDictionary)readPRObject();
            }
        }
コード例 #3
0
        /**
         * Closes the AcroForm.
         */

        internal bool isValid()
        {
            if (documentFields.Size == 0)
            {
                return(false);
            }
            put(PdfName.FIELDS, documentFields);
            if (sigFlags != 0)
            {
                put(PdfName.SIGFLAGS, new PdfNumber(sigFlags));
            }
            if (calculationOrder.Size > 0)
            {
                put(PdfName.CO, calculationOrder);
            }
            if (fieldTemplates.Count == 0)
            {
                return(false);
            }
            PdfDictionary dic = new PdfDictionary();

            foreach (PdfTemplate template in fieldTemplates.Keys)
            {
                PdfFormField.mergeResources(dic, (PdfDictionary)template.Resources);
            }
            put(PdfName.DR, dic);
            PdfDictionary fonts = (PdfDictionary)dic.get(PdfName.FONT);

            if (fonts != null)
            {
                put(PdfName.DA, new PdfString("/F1 0 Tf 0 g "));
                writer.eliminateFontSubset(fonts);
            }
            return(true);
        }
コード例 #4
0
ファイル: PdfReader.cs プロジェクト: aakkssqq/CreatePDFCSharp
        /** Gets the page size without taking rotation into account. This
         * is the value of the /MediaBox key.
         * @param index the page number. The first page is 1
         * @return the page size
         */
        public Rectangle getPageSize(int index)
        {
            PdfDictionary page     = pages[index - 1];
            PdfArray      mediaBox = (PdfArray)getPdfObject(page.get(PdfName.MEDIABOX));

            return(getNormalizedRectangle(mediaBox));
        }
コード例 #5
0
ファイル: PdfReader.cs プロジェクト: aakkssqq/CreatePDFCSharp
        /** Gets the crop box without taking rotation into account. This
         * is the value of the /CropBox key. The crop box is the part
         * of the document to be displayed or printed. It usually is the same
         * as the media box but may be smaller.
         * @param index the page number. The first page is 1
         * @return the crop box
         */
        public Rectangle getCropBox(int index)
        {
            PdfDictionary page    = pages[index - 1];
            PdfArray      cropBox = (PdfArray)getPdfObject(page.get(PdfName.CROPBOX));

            if (cropBox == null)
            {
                return(getPageSize(index));
            }
            return(getNormalizedRectangle(cropBox));
        }
コード例 #6
0
ファイル: PdfReader.cs プロジェクト: aakkssqq/CreatePDFCSharp
        protected void readPages()
        {
            pageInh = new ArrayList();
            PdfDictionary catalog   = (PdfDictionary)getPdfObject(trailer.get(PdfName.ROOT));
            PdfDictionary rootPages = (PdfDictionary)getPdfObject(catalog.get(PdfName.PAGES));
            PdfNumber     count     = (PdfNumber)getPdfObject(rootPages.get(PdfName.COUNT));

            pages      = new PdfDictionary[count.IntValue];
            pagesCount = 0;
            iteratePages(rootPages);
            pageInh = null;
        }
コード例 #7
0
ファイル: PdfReader.cs プロジェクト: aakkssqq/CreatePDFCSharp
        /**
         * Gets the page rotation. This value can be 0, 90, 180 or 270.
         * @param index the page number. The first page is 1
         * @return the page rotation
         */
        public int getPageRotation(int index)
        {
            PdfDictionary page   = pages[index - 1];
            PdfNumber     rotate = (PdfNumber)getPdfObject(page.get(PdfName.ROTATE));

            if (rotate == null)
            {
                return(0);
            }
            else
            {
                return(rotate.IntValue);
            }
        }
コード例 #8
0
ファイル: PdfReader.cs プロジェクト: aakkssqq/CreatePDFCSharp
        protected void pushPageAttributes(PdfDictionary nodePages)
        {
            PdfDictionary dic = new PdfDictionary();

            if (pageInh.Count != 0)
            {
                dic.putAll((PdfDictionary)pageInh[pageInh.Count - 1]);
            }
            for (int k = 0; k < pageInhCandidates.Length; ++k)
            {
                PdfObject obj = nodePages.get(pageInhCandidates[k]);
                if (obj != null)
                {
                    dic.put(pageInhCandidates[k], obj);
                }
            }
            pageInh.Add(dic);
        }
コード例 #9
0
        internal static void mergeResources(PdfDictionary result, PdfDictionary source)
        {
            PdfDictionary dic    = null;
            PdfDictionary res    = null;
            PdfName       target = null;

            for (int k = 0; k < mergeTarget.Length; ++k)
            {
                target = mergeTarget[k];
                if ((dic = (PdfDictionary)source.get(target)) != null)
                {
                    if ((res = (PdfDictionary)result.get(target)) == null)
                    {
                        res = new PdfDictionary();
                    }
                    res.merge(dic);
                    result.put(target, res);
                }
            }
        }
コード例 #10
0
        internal PdfStream getFormXObject(int pageNumber)
        {
            PdfDictionary page     = pages[pageNumber - 1];
            PdfObject     contents = reader.getPdfObject(page.get(PdfName.CONTENTS));
            int           length   = 0;
            int           offset   = 0;
            PdfDictionary dic      = new PdfDictionary();
            MemoryStream  bout     = null;
            ArrayList     filters  = null;

            if (contents != null)
            {
                if (contents.Type == PdfObject.STREAM)
                {
                    PRStream stream = (PRStream)contents;
                    length = stream.Length;
                    offset = stream.Offset;
                    dic.putAll(stream);
                }
                else
                {
                    PdfArray  array = (PdfArray)contents;
                    ArrayList list  = array.ArrayList;
                    bout = new MemoryStream();
                    for (int k = 0; k < list.Count; ++k)
                    {
                        PRStream  stream = (PRStream)reader.getPdfObject((PdfObject)list[k]);
                        PdfObject filter = stream.get(PdfName.FILTER);
                        byte[]    b      = new byte[stream.Length];
                        file.seek(stream.Offset);
                        file.readFully(b);
                        filters = new ArrayList();
                        if (filter != null)
                        {
                            if (filter.Type == PdfObject.NAME)
                            {
                                filters.Add(filter);
                            }
                            else if (filter.Type == PdfObject.ARRAY)
                            {
                                filters = ((PdfArray)filter).ArrayList;
                            }
                        }
                        string name;
                        for (int j = 0; j < filters.Count; ++j)
                        {
                            name = ((PdfName)filters[j]).ToString();
                            if (name.Equals("/FlateDecode") || name.Equals("/Fl"))
                            {
                                b = PdfReader.FlateDecode(b);
                            }
                            else if (name.Equals("/ASCIIHexDecode") || name.Equals("/AHx"))
                            {
                                b = PdfReader.ASCIIHexDecode(b);
                            }
                            else if (name.Equals("/ASCII85Decode") || name.Equals("/A85"))
                            {
                                b = PdfReader.ASCII85Decode(b);
                            }
                            else if (name.Equals("/LZWDecode"))
                            {
                                b = PdfReader.LZWDecode(b);
                            }
                            else
                            {
                                throw new IOException("The filter " + name + " is not supported.");
                            }
                        }
                        bout.Write(b, 0, b.Length);
                        if (k != list.Count - 1)
                        {
                            bout.WriteByte((byte)'\n');
                        }
                    }
                }
            }
            dic.put(PdfName.RESOURCES, reader.getPdfObject(page.get(PdfName.RESOURCES)));
            dic.put(PdfName.TYPE, PdfName.XOBJECT);
            dic.put(PdfName.SUBTYPE, PdfName.FORM);
            dic.put(PdfName.BBOX, new PdfRectangle(((PdfImportedPage)importedPages[pageNumber]).BoundingBox));
            dic.put(PdfName.MATRIX, IDENTITYMATRIX);
            dic.put(PdfName.FORMTYPE, ONE);
            PRStream str;

            if (bout == null)
            {
                str = new PRStream(reader, offset);
                str.putAll(dic);
                str.Length = length;
            }
            else
            {
                str = new PRStream(reader, bout.ToArray());
                str.putAll(dic);
            }
            return(str);
        }