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(); } }
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(); } }
/** * 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); }
/** 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)); }
/** 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)); }
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; }
/** * 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); } }
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); }
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); } } }
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); }