예제 #1
0
        /** Does the actual document manipulation to encrypt it.
         * @throws DocumentException on error
         * @throws IOException on error
         */
        protected void go()
        {
            body = new PdfBody(HEADER.Length, this, true);
            os.Write(HEADER, 0, HEADER.Length);
            PdfObject[] xb = reader.xrefObj;
            myXref = new int[xb.Length];
            int idx = 1;

            for (int k = 1; k < xb.Length; ++k)
            {
                if (xb[k] != null)
                {
                    myXref[k] = idx++;
                }
            }
            file.reOpen();
            for (int k = 1; k < xb.Length; ++k)
            {
                if (xb[k] != null)
                {
                    addToBody(xb[k]);
                }
            }
            file.close();
            PdfIndirectReference encryption = null;
            PdfLiteral           fileID     = null;

            if (crypto != null)
            {
                PdfIndirectObject encryptionObject = body.Add(crypto.EncryptionDictionary);
                encryptionObject.writeTo(os);
                encryption = encryptionObject.IndirectReference;
                fileID     = crypto.FileID;
            }
            // write the cross-reference table of the body
            os.Write(body.CrossReferenceTable, 0, body.CrossReferenceTable.Length);
            PRIndirectReference  iRoot = (PRIndirectReference)reader.trailer.get(PdfName.ROOT);
            PdfIndirectReference root  = new PdfIndirectReference(0, myXref[iRoot.Number]);
            PRIndirectReference  iInfo = (PRIndirectReference)reader.trailer.get(PdfName.INFO);
            PdfIndirectReference info  = null;

            if (iInfo != null)
            {
                info = new PdfIndirectReference(0, myXref[iInfo.Number]);
            }
            PdfTrailer trailer = new PdfTrailer(body.Size,
                                                body.Offset,
                                                root,
                                                info,
                                                encryption,
                                                fileID);

            byte[] tmp = trailer.toPdf(this);
            os.Write(tmp, 0, tmp.Length);
            os.Close();
        }
예제 #2
0
 /**
 * Signals that the <CODE>Document</CODE> has been opened and that
 * <CODE>Elements</CODE> can be added.
 * <P>
 * When this method is called, the PDF-document header is
 * written to the outputstream.
 */
 public override void Open() {
     base.Open();
     pdf_version.WriteHeader(os);
     body = new PdfBody(this);
     if (IsPdfX() && ((PdfXConformanceImp)pdfIsoConformance).IsPdfX32002())
     {
         PdfDictionary sec = new PdfDictionary();
         sec.Put(PdfName.GAMMA, new PdfArray(new float[]{2.2f,2.2f,2.2f}));
         sec.Put(PdfName.MATRIX, new PdfArray(new float[]{0.4124f,0.2126f,0.0193f,0.3576f,0.7152f,0.1192f,0.1805f,0.0722f,0.9505f}));
         sec.Put(PdfName.WHITEPOINT, new PdfArray(new float[]{0.9505f,1f,1.089f}));
         PdfArray arr = new PdfArray(PdfName.CALRGB);
         arr.Add(sec);
         SetDefaultColorspace(PdfName.DEFAULTRGB, AddToBody(arr).IndirectReference);
     }
 }
예제 #3
0
 internal Wrt(Stream os, FdfWriter fdf) : base(new PdfDocument(), os)
 {
     this.fdf = fdf;
     this.os.Write(HEADER_FDF, 0, HEADER_FDF.Length);
     body = new PdfBody(this);
 }
예제 #4
0
 internal Wrt(Stream os, FdfWriter fdf) : base(new PdfDocument(), os) {
     this.fdf = fdf;
     this.os.Write(HEADER_FDF, 0, HEADER_FDF.Length);
     body = new PdfBody(this);
 }
 internal Wrt(Stream os, FdfWriter fdf) : base(new PdfDocument(), os)
 {
     _fdf = fdf;
     ((DocWriter)this).Os.Write(_headerFdf, 0, _headerFdf.Length);
     Body = new PdfBody(this);
 }
예제 #6
0
        /**
        * Signals that an <CODE>Element</CODE> was added to the <CODE>Document</CODE>.
        *
        * @param element the element to add
        * @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.
        * @throws DocumentException when a document isn't open yet, or has been closed
        */
        public override bool Add(IElement element) {
            if (writer != null && writer.IsPaused()) {
                return false;
            }
            try {
                if (element.Type != Element.DIV) {
                    FlushFloatingElements();
                }
                switch (element.Type) {

                        // Information (headers)
                    case Element.HEADER:
                        info.Addkey(((Meta) element).Name, ((Meta) element).Content);
                        break;
                    case Element.TITLE:
                        info.AddTitle(((Meta) element).Content);
                        break;
                    case Element.SUBJECT:
                        info.AddSubject(((Meta) element).Content);
                        break;
                    case Element.KEYWORDS:
                        info.AddKeywords(((Meta) element).Content);
                        break;
                    case Element.AUTHOR:
                        info.AddAuthor(((Meta) element).Content);
                        break;
                    case Element.CREATOR:
                        info.AddCreator(((Meta) element).Content);
                        break;
                    case Element.LANGUAGE:
                        SetLanguage(((Meta) element).Content);
                        break;
                    case Element.PRODUCER:
                        // you can not change the name of the producer
                        info.AddProducer();
                        break;
                    case Element.CREATIONDATE:
                        // you can not set the creation date, only reset it
                        info.AddCreationDate();
                        break;

                        // content (text)
                    case Element.CHUNK: {
                        // if there isn't a current line available, we make one
                        if (line == null) {
                            CarriageReturn();
                        }

                        // we cast the element to a chunk
                        PdfChunk chunk = new PdfChunk((Chunk) element, anchorAction, tabSettings);
                        // we try to add the chunk to the line, until we succeed
                        {
                            PdfChunk overflow;
                            while ((overflow = line.Add(chunk, leading)) != null) {
                                CarriageReturn();
                                bool newlineSplit = chunk.IsNewlineSplit();
                                chunk = overflow;
                                if (!newlineSplit)
                                    chunk.TrimFirstSpace();
                            }
                        }
                        pageEmpty = false;
                        if (chunk.IsAttribute(Chunk.NEWPAGE)) {
                            NewPage();
                        }
                        break;
                    }
                    case Element.ANCHOR: {
                        Anchor anchor = (Anchor) element;
                        String url = anchor.Reference;
                        leading = anchor.Leading;
                        PushLeading();
                        if (url != null) {
                            anchorAction = new PdfAction(url);
                        }

                        // we process the element
                        element.Process(this);
                        anchorAction = null;
                        PopLeading();
                        break;
                    }
                    case Element.ANNOTATION: {
                        if (line == null) {
                            CarriageReturn();
                        }
                        Annotation annot = (Annotation) element;
                        Rectangle rect = new Rectangle(0, 0);
                        if (line != null)
                            rect = new Rectangle(annot.GetLlx(IndentRight - line.WidthLeft),
                                annot.GetUry(IndentTop - currentHeight - 20), annot.GetUrx(IndentRight - line.WidthLeft + 20),
                                annot.GetLly(IndentTop - currentHeight));
                        PdfAnnotation an = PdfAnnotationsImp.ConvertAnnotation(writer, annot, rect);
                        annotationsImp.AddPlainAnnotation(an);
                        pageEmpty = false;
                        break;
                    }
                    case Element.PHRASE: {
                        TabSettings backupTabSettings = tabSettings;
                        if (((Phrase) element).TabSettings != null)
                            tabSettings = ((Phrase) element).TabSettings;

                        // we cast the element to a phrase and set the leading of the document
                        leading = ((Phrase) element).TotalLeading;
                        PushLeading();
                        // we process the element
                        element.Process(this);
                        tabSettings = backupTabSettings;
                        PopLeading();
                        break;
                    }
                    case Element.PARAGRAPH: {
                        TabSettings backupTabSettings = tabSettings;
                        if (((Phrase) element).TabSettings != null)
                            tabSettings = ((Phrase) element).TabSettings;

                        // we cast the element to a paragraph
                        Paragraph paragraph = (Paragraph) element;
                        if (IsTagged(writer)) {
                            FlushLines();
                            text.OpenMCBlock(paragraph);
                        }
                        AddSpacing(paragraph.SpacingBefore, leading, paragraph.Font);

                        // we adjust the parameters of the document
                        alignment = paragraph.Alignment;
                        leading = paragraph.TotalLeading;
                        PushLeading();

                        CarriageReturn();
                        // we don't want to make orphans/widows
                        if (currentHeight + CalculateLineHeight() > IndentTop - IndentBottom) {
                            NewPage();
                        }

                        indentation.indentLeft += paragraph.IndentationLeft;
                        indentation.indentRight += paragraph.IndentationRight;

                        CarriageReturn();

                        IPdfPageEvent pageEvent = writer.PageEvent;
                        if (pageEvent != null && !isSectionTitle)
                            pageEvent.OnParagraph(writer, this, IndentTop - currentHeight);

                        // if a paragraph has to be kept together, we wrap it in a table object
                        if (paragraph.KeepTogether) {
                            CarriageReturn();
                            PdfPTable table = new PdfPTable(1);
                            table.KeepTogether = paragraph.KeepTogether;
                            table.WidthPercentage = 100f;
                            PdfPCell cell = new PdfPCell();
                            cell.AddElement(paragraph);
                            cell.Border = Rectangle.NO_BORDER;
                            cell.Padding = 0;
                            table.AddCell(cell);
                            indentation.indentLeft -= paragraph.IndentationLeft;
                            indentation.indentRight -= paragraph.IndentationRight;
                            this.Add(table);
                            indentation.indentLeft += paragraph.IndentationLeft;
                            indentation.indentRight += paragraph.IndentationRight;
                        } else {
                            line.SetExtraIndent(paragraph.FirstLineIndent);
                            element.Process(this);
                            CarriageReturn();
                            AddSpacing(paragraph.SpacingAfter, paragraph.TotalLeading, paragraph.Font, true);
                        }

                        if (pageEvent != null && !isSectionTitle)
                            pageEvent.OnParagraphEnd(writer, this, IndentTop - currentHeight);

                        alignment = Element.ALIGN_LEFT;
                        if (floatingElements != null && floatingElements.Count != 0) {
                            FlushFloatingElements();
                        }
                        indentation.indentLeft -= paragraph.IndentationLeft;
                        indentation.indentRight -= paragraph.IndentationRight;
                        CarriageReturn();
                        tabSettings = backupTabSettings;
                        PopLeading();
                        if (IsTagged(writer)) {
                            FlushLines();
                            text.CloseMCBlock(paragraph);
                        }
                        break;
                    }
                    case Element.SECTION:
                    case Element.CHAPTER: {
                        // Chapters and Sections only differ in their constructor
                        // so we cast both to a Section
                        Section section = (Section) element;
                        IPdfPageEvent pageEvent = writer.PageEvent;

                        bool hasTitle = section.NotAddedYet && section.Title != null;

                        // if the section is a chapter, we begin a new page
                        if (section.TriggerNewPage) {
                            NewPage();
                        }

                        if (hasTitle) {
                            float fith = IndentTop - currentHeight;
                            int rotation = pageSize.Rotation;
                            if (rotation == 90 || rotation == 180)
                                fith = pageSize.Height - fith;
                            PdfDestination destination = new PdfDestination(PdfDestination.FITH, fith);
                            while (currentOutline.Level >= section.Depth) {
                                currentOutline = currentOutline.Parent;
                            }
                            PdfOutline outline = new PdfOutline(currentOutline, destination, section.GetBookmarkTitle(),
                                section.BookmarkOpen);
                            currentOutline = outline;
                        }

                        // some values are set
                        CarriageReturn();
                        indentation.sectionIndentLeft += section.IndentationLeft;
                        indentation.sectionIndentRight += section.IndentationRight;
                        if (section.NotAddedYet && pageEvent != null)
                            if (element.Type == Element.CHAPTER)
                                pageEvent.OnChapter(writer, this, IndentTop - currentHeight, section.Title);
                            else
                                pageEvent.OnSection(writer, this, IndentTop - currentHeight, section.Depth, section.Title);

                        // the title of the section (if any has to be printed)
                        if (hasTitle) {
                            isSectionTitle = true;
                            Add(section.Title);
                            isSectionTitle = false;
                        }
                        indentation.sectionIndentLeft += section.Indentation;
                        // we process the section
                        element.Process(this);
                        // some parameters are set back to normal again
                        indentation.sectionIndentLeft -= (section.IndentationLeft + section.Indentation);
                        indentation.sectionIndentRight -= section.IndentationRight;

                        if (section.ElementComplete && pageEvent != null)
                            if (element.Type == Element.CHAPTER)
                                pageEvent.OnChapterEnd(writer, this, IndentTop - currentHeight);
                            else
                                pageEvent.OnSectionEnd(writer, this, IndentTop - currentHeight);

                        break;
                    }
                    case Element.LIST: {
                        // we cast the element to a List
                        List list = (List) element;
                        if (IsTagged(writer)) {
                            FlushLines();
                            text.OpenMCBlock(list);
                        }
                        if (list.Alignindent) {
                            list.NormalizeIndentation();
                        }
                        // we adjust the document
                        indentation.listIndentLeft += list.IndentationLeft;
                        indentation.indentRight += list.IndentationRight;
                        // we process the items in the list
                        element.Process(this);
                        // some parameters are set back to normal again
                        indentation.listIndentLeft -= list.IndentationLeft;
                        indentation.indentRight -= list.IndentationRight;
                        CarriageReturn();
                        if (IsTagged(writer)) {
                            FlushLines();
                            text.CloseMCBlock(list);
                        }
                        break;
                    }
                    case Element.LISTITEM: {
                        // we cast the element to a ListItem
                        ListItem listItem = (ListItem) element;
                        if (IsTagged(writer)) {
                            FlushLines();
                            text.OpenMCBlock(listItem);
                        }
                        AddSpacing(listItem.SpacingBefore, leading, listItem.Font);

                        // we adjust the document
                        alignment = listItem.Alignment;
                        indentation.listIndentLeft += listItem.IndentationLeft;
                        indentation.indentRight += listItem.IndentationRight;
                        leading = listItem.TotalLeading;
                        PushLeading();
                        CarriageReturn();
                        // we prepare the current line to be able to show us the listsymbol
                        line.ListItem = listItem;
                        // we process the item
                        element.Process(this);

                        AddSpacing(listItem.SpacingAfter, listItem.TotalLeading, listItem.Font, true);

                        // if the last line is justified, it should be aligned to the left
                        if (line.HasToBeJustified()) {
                            line.ResetAlignment();
                        }
                        // some parameters are set back to normal again
                        CarriageReturn();
                        indentation.listIndentLeft -= listItem.IndentationLeft;
                        indentation.indentRight -= listItem.IndentationRight;
                        PopLeading();
                        if (IsTagged(writer)) {
                            FlushLines();
                            text.CloseMCBlock(listItem.ListBody);
                            text.CloseMCBlock(listItem);
                        }
                        break;
                    }
                    case Element.RECTANGLE: {
                        Rectangle rectangle = (Rectangle) element;
                        graphics.Rectangle(rectangle);
                        pageEmpty = false;
                        break;
                    }
                    case Element.PTABLE: {
                        PdfPTable ptable = (PdfPTable) element;
                        if (ptable.Size <= ptable.HeaderRows)
                            break; //nothing to do

                        // before every table, we add a new line and flush all lines
                        EnsureNewLine();
                        FlushLines();

                        AddPTable(ptable);
                        pageEmpty = false;
                        NewLine();
                        break;
                    }
                    case Element.JPEG:
                    case Element.JPEG2000:
                    case Element.JBIG2:
                    case Element.IMGRAW:
                    case Element.IMGTEMPLATE: {
                        //carriageReturn(); suggestion by Marc Campforts
                        if (IsTagged(writer) && !((Image) element).IsImgTemplate()) {
                            FlushLines();
                            text.OpenMCBlock((Image) element);
                        }
                        Add((Image) element);
                        if (IsTagged(writer) && !((Image) element).IsImgTemplate()) {
                            FlushLines();
                            text.CloseMCBlock((Image) element);
                        }
                        break;
                    }
                    case Element.YMARK: {
                        IDrawInterface zh = (IDrawInterface) element;
                        zh.Draw(graphics, IndentLeft, IndentBottom, IndentRight, IndentTop,
                            IndentTop - currentHeight - (leadingStack.Count > 0 ? leading : 0));
                        pageEmpty = false;
                        break;
                    }
                    case Element.MARKED: {
                        MarkedObject mo;
                        if (element is MarkedSection) {
                            mo = ((MarkedSection) element).Title;
                            if (mo != null) {
                                mo.Process(this);
                            }
                        }
                        mo = (MarkedObject) element;
                        mo.Process(this);
                        break;
                    }
                    case Element.WRITABLE_DIRECT:
                        if (null != writer) {
                            ((IWriterOperation) element).Write(writer, this);
                        }
                        break;
                    case Element.DIV:
                        EnsureNewLine();
                        FlushLines();
                        AddDiv((PdfDiv) element);
                        pageEmpty = false;
                        //newLine();
                        break;
                    case Element.BODY:
                        body = (PdfBody)element;
                        graphics.Rectangle(body);
                        break;
                    default:
                        return false;
                }
                lastElementType = element.Type;
                return true;
            } catch (Exception e) {
                throw new DocumentException(e.Message);
            }
        }
예제 #7
0
 public override IList<IElement> Start(IWorkerContext ctx, Tag tag)
 {
     List<IElement> l = new List<IElement>(1);
     try
     {
         IDictionary<String, String> css = tag.CSS;
         if (css.ContainsKey(CSS.Property.BACKGROUND_COLOR))
         {
             Type type = typeof(PdfWriterPipeline);
             MapContext pipeline = (MapContext)ctx.Get(type.FullName);
             if (pipeline != null)
             {
                 Document document = (Document)pipeline[PdfWriterPipeline.DOCUMENT];
                 if (document != null)
                 {
                     Rectangle rectangle = new Rectangle(document.Left, document.Bottom, document.Right, document.Top, document.PageSize.Rotation);
                     rectangle.BackgroundColor = HtmlUtilities.DecodeColor(css[CSS.Property.BACKGROUND_COLOR]);
                     PdfBody body = new PdfBody(rectangle);
                     l.Add(body);
                 }
             }
         }
     }
     catch (NoCustomContextException e)
     {}
     
     return l;
 }