public virtual void Test01() { String outFile = destinationFolder + "parentTreeTest01.pdf"; String cmpFile = sourceFolder + "cmp_parentTreeTest01.pdf"; PdfDocument document = new PdfDocument(new PdfWriter(outFile)); document.SetTagged(); PdfStructElem doc = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); PdfPage firstPage = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(firstPage); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.COURIER), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, firstPage)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(firstPage, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrDictionary(firstPage, span1)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); PdfPage secondPage = document.AddNewPage(); document.Close(); NUnit.Framework.Assert.IsTrue(CheckParentTree(outFile, cmpFile)); }
public virtual void StructElemTest08() { PdfWriter writer = new PdfWriter(destinationFolder + "structElemTest08.pdf"); writer.SetCompressionLevel(CompressionConstants.NO_COMPRESSION); PdfDocument document = new PdfDocument(writer); document.SetTagged(); PdfStructTreeRoot doc = document.GetStructTreeRoot(); PdfPage firstPage = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(firstPage); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.COURIER), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, firstPage)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(firstPage, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrDictionary(firstPage, span1)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); PdfPage secondPage = document.AddNewPage(); // on flushing, the Document tag is not added firstPage.Flush(); secondPage.Flush(); document.Close(); CompareResult("structElemTest08.pdf", "cmp_structElemTest08.pdf", "diff_structElem_08_"); }
public virtual void StructTreeCopyingTest07() { PdfReader reader = new PdfReader(sourceFolder + "quick-brown-fox.pdf"); PdfWriter writer = new PdfWriter(destinationFolder + "structTreeCopyingTest07.pdf"); PdfDocument document = new PdfDocument(writer); document.SetTagged(); PdfStructElem doc = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); PdfPage page1 = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(page1); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.COURIER), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page1)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page1, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrDictionary(page1, span1)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); PdfDocument document1 = new PdfDocument(reader); document1.InitializeOutlines(); document1.CopyPagesTo(1, 1, document); document.Close(); document1.Close(); CompareResult("structTreeCopyingTest07.pdf", "cmp_structTreeCopyingTest07.pdf", "diff_copying_07_"); }
/// <summary>Removes the current tag.</summary> /// <remarks> /// Removes the current tag. If it has kids, they will become kids of the current tag parent. /// This method call moves this /// <c>TagTreePointer</c> /// to the current tag parent. /// <br/><br/> /// You cannot remove root tag, and also you cannot remove any tag if document's tag structure was partially flushed; /// in this two cases an exception will be thrown. /// </remarks> /// <returns> /// this /// <see cref="TagStructureContext"/> /// instance. /// </returns> public virtual iText.Kernel.Pdf.Tagutils.TagTreePointer RemoveTag() { IPdfStructElem parentElem = GetCurrentStructElem().GetParent(); if (parentElem is PdfStructTreeRoot) { throw new PdfException(PdfException.CannotRemoveDocumentRootTag); } IList <IPdfStructElem> kids = GetCurrentStructElem().GetKids(); PdfStructElem parent = (PdfStructElem)parentElem; if (parent.IsFlushed()) { throw new PdfException(PdfException.CannotRemoveTagBecauseItsParentIsFlushed); } int removedKidIndex = parent.RemoveKid(GetCurrentStructElem()); GetCurrentStructElem().GetPdfObject().GetIndirectReference().SetFree(); foreach (IPdfStructElem kid in kids) { if (kid is PdfStructElem) { parent.AddKid(removedKidIndex++, (PdfStructElem)kid); } else { PdfMcr mcr = PrepareMcrForMovingToNewParent((PdfMcr)kid, parent); parent.AddKid(removedKidIndex++, mcr); } } SetCurrentStructElem(parent); return(this); }
public virtual void StructElemTest02() { PdfWriter writer = new PdfWriter(destinationFolder + "structElemTest02.pdf"); writer.SetCompressionLevel(CompressionConstants.NO_COMPRESSION); PdfDocument document = new PdfDocument(writer); document.SetTagged(); document.GetStructTreeRoot().GetRoleMap().Put(new PdfName("Chunk"), PdfName.Span); PdfStructElem doc = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); PdfPage page = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(page); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.COURIER), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); PdfStructElem span2 = paragraph.AddKid(new PdfStructElem(document, new PdfName("Chunk"), page)); canvas.OpenTag(new CanvasTag(span2.AddKid(new PdfMcrNumber(page, span2)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); page.Flush(); document.Close(); CompareResult("structElemTest02.pdf", "cmp_structElemTest02.pdf", "diff_structElem_02_"); }
/// <summary>Transforms root tags in a way that complies with the PDF References.</summary> /// <remarks> /// Transforms root tags in a way that complies with the PDF References. /// <br/><br/> /// PDF Reference /// 10.7.3 Grouping Elements: /// <br/><br/> /// For most content extraction formats, the document must be a tree with a single top-level element; /// the structure tree root (identified by the StructTreeRoot entry in the document catalog) must have /// only one child in its K (kids) array. If the PDF file contains a complete document, the structure /// type Document is recommended for this top-level element in the logical structure hierarchy. If the /// file contains a well-formed document fragment, one of the structure types Part, Art, Sect, or Div /// may be used instead. /// </remarks> public virtual void NormalizeDocumentRootTag() { // in this method we could deal with existing document, so we don't won't to throw exceptions here bool forbid = forbidUnknownRoles; forbidUnknownRoles = false; IList <IPdfStructElem> rootKids = document.GetStructTreeRoot().GetKids(); if (rootKids.Count == 1 && allowedRootTagRoles.Contains(rootKids[0].GetRole())) { rootTagElement = (PdfStructElem)rootKids[0]; } else { PdfStructElem prevRootTag = rootTagElement; document.GetStructTreeRoot().GetPdfObject().Remove(PdfName.K); if (prevRootTag == null) { rootTagElement = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); } else { document.GetStructTreeRoot().AddKid(rootTagElement); if (!PdfName.Document.Equals(rootTagElement.GetRole())) { WrapAllKidsInTag(rootTagElement, rootTagElement.GetRole()); rootTagElement.SetRole(PdfName.Document); } } int originalRootKidsIndex = 0; bool isBeforeOriginalRoot = true; foreach (IPdfStructElem elem in rootKids) { // StructTreeRoot kids are always PdfStructElem, so we are save here to cast it PdfStructElem kid = (PdfStructElem)elem; if (kid.GetPdfObject() == rootTagElement.GetPdfObject()) { isBeforeOriginalRoot = false; continue; } bool kidIsDocument = PdfName.Document.Equals(kid.GetRole()); if (isBeforeOriginalRoot) { rootTagElement.AddKid(originalRootKidsIndex, kid); originalRootKidsIndex += kidIsDocument ? kid.GetKids().Count : 1; } else { rootTagElement.AddKid(kid); } if (kidIsDocument) { RemoveOldRoot(kid); } } } forbidUnknownRoles = forbid; }
public virtual void StructElemTest03() { PdfWriter writer = new PdfWriter(destinationFolder + "structElemTest03.pdf"); writer.SetCompressionLevel(CompressionConstants.NO_COMPRESSION); PdfDocument document = new PdfDocument(writer); document.SetTagged(); document.GetStructTreeRoot().GetRoleMap().Put(new PdfName("Chunk"), PdfName.Span); PdfStructElem doc = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); PdfPage page1 = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(page1); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.COURIER), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page1)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page1, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); PdfStructElem span2 = paragraph.AddKid(new PdfStructElem(document, new PdfName("Chunk"), page1)); canvas.OpenTag(new CanvasTag(span2.AddKid(new PdfMcrNumber(page1, span2)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); PdfPage page2 = document.AddNewPage(); canvas = new PdfCanvas(page2); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.HELVETICA), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page2)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page2, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); span2 = paragraph.AddKid(new PdfStructElem(document, new PdfName("Chunk"), page2)); canvas.OpenTag(new CanvasTag(span2.AddKid(new PdfMcrNumber(page2, span2)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); page1.Flush(); page2.Flush(); document.Close(); document = new PdfDocument(new PdfReader(destinationFolder + "structElemTest03.pdf")); NUnit.Framework.Assert.AreEqual(2, (int)document.GetNextStructParentIndex()); PdfPage page = document.GetPage(1); NUnit.Framework.Assert.AreEqual(0, page.GetStructParentIndex()); NUnit.Framework.Assert.AreEqual(2, page.GetNextMcid()); document.Close(); }
public virtual void StructElemTest01() { FileStream fos = new FileStream(destinationFolder + "structElemTest01.pdf", FileMode.Create); PdfWriter writer = new PdfWriter(fos); writer.SetCompressionLevel(CompressionConstants.NO_COMPRESSION); PdfDocument document = new PdfDocument(writer); document.SetTagged(); PdfStructElem doc = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); PdfPage page1 = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(page1); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.COURIER), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page1)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page1, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrDictionary(page1, span1)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); PdfPage page2 = document.AddNewPage(); canvas = new PdfCanvas(page2); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.HELVETICA), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page2)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page2, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); PdfStructElem span2 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page2)); canvas.OpenTag(new CanvasTag(span2.AddKid(new PdfMcrNumber(page2, span2)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); page1.Flush(); page2.Flush(); document.Close(); CompareResult("structElemTest01.pdf", "cmp_structElemTest01.pdf", "diff_structElem_01_"); }
public virtual void StructElemTest06() { PdfWriter writer = new PdfWriter(destinationFolder + "structElemTest06.pdf"); writer.SetCompressionLevel(CompressionConstants.NO_COMPRESSION); PdfDocument document = new PdfDocument(writer); document.SetTagged(); PdfStructElem doc = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); PdfPage page = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(page); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.COURIER), 14); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page, span1))).AddProperty(PdfName.Lang, new PdfString ("en-US")).AddProperty(PdfName.ActualText, new PdfString("The actual text is: Text with property list" ))); canvas.ShowText("Text with property list"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); document.Close(); CompareResult("structElemTest06.pdf", "cmp_structElemTest06.pdf", "diff_structElem_06_"); }
/// <summary>Removes the current tag.</summary> /// <remarks> /// Removes the current tag. If it has kids, they will become kids of the current tag parent. /// This method call moves this /// <c>TagTreePointer</c> /// to the current tag parent. /// <br /><br /> /// You cannot remove root tag, and also you cannot remove the tag if it's parent is already flushed; /// in this two cases an exception will be thrown. /// </remarks> /// <returns> /// this /// <see cref="TagStructureContext"/> /// instance. /// </returns> public virtual iText.Kernel.Pdf.Tagutils.TagTreePointer RemoveTag() { PdfStructElem currentStructElem = GetCurrentStructElem(); IStructureNode parentElem = currentStructElem.GetParent(); if (parentElem is PdfStructTreeRoot) { throw new PdfException(PdfException.CannotRemoveDocumentRootTag); } IList <IStructureNode> kids = currentStructElem.GetKids(); PdfStructElem parent = (PdfStructElem)parentElem; if (parent.IsFlushed()) { throw new PdfException(PdfException.CannotRemoveTagBecauseItsParentIsFlushed); } // remove waiting tag state if tag is removed Object objForStructDict = tagStructureContext.GetWaitingTagsManager().GetObjForStructDict(currentStructElem .GetPdfObject()); tagStructureContext.GetWaitingTagsManager().RemoveWaitingState(objForStructDict); int removedKidIndex = parent.RemoveKid(currentStructElem); PdfIndirectReference indRef = currentStructElem.GetPdfObject().GetIndirectReference(); if (indRef != null) { // TODO how about possible references to structure element from refs or structure destination for instance? indRef.SetFree(); } foreach (IStructureNode kid in kids) { if (kid is PdfStructElem) { parent.AddKid(removedKidIndex++, (PdfStructElem)kid); } else { PdfMcr mcr = PrepareMcrForMovingToNewParent((PdfMcr)kid, parent); parent.AddKid(removedKidIndex++, mcr); } } currentStructElem.GetPdfObject().Clear(); SetCurrentStructElem(parent); return(this); }
public virtual void StructElemTest05() { FileStream fos = new FileStream(destinationFolder + "structElemTest05.pdf", FileMode.Create); PdfWriter writer = new PdfWriter(fos); writer.SetCompressionLevel(CompressionConstants.NO_COMPRESSION); PdfDocument document = new PdfDocument(writer); document.SetTagged(); PdfStructElem doc = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); PdfPage page = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(page); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.COURIER), 14); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page, span1)))); canvas.ShowText("Click "); canvas.CloseTag(); PdfStructElem link = paragraph.AddKid(new PdfStructElem(document, PdfName.Link, page)); canvas.OpenTag(new CanvasTag(link.AddKid(new PdfMcrNumber(page, link)))); canvas.SetFillColorRgb(0, 0, 1).ShowText("here"); PdfLinkAnnotation linkAnnotation = new PdfLinkAnnotation(new Rectangle(80, 508, 40, 18)); linkAnnotation.SetColor(new float[] { 0, 0, 1 }).SetBorder(new PdfArray(new float[] { 0, 0, 1 })); page.AddAnnotation(-1, linkAnnotation, false); link.AddKid(new PdfObjRef(linkAnnotation, link)); canvas.CloseTag(); PdfStructElem span2 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page)); canvas.OpenTag(new CanvasTag(span2.AddKid(new PdfMcrNumber(page, span2)))); canvas.SetFillColorRgb(0, 0, 0); canvas.ShowText(" to visit iText site."); canvas.CloseTag(); canvas.EndText(); canvas.Release(); document.Close(); CompareResult("structElemTest05.pdf", "cmp_structElemTest05.pdf", "diff_structElem_05_"); }
private void AddStructTreeRootKidsToTheRootTag(IList <IStructureNode> rootKids) { int originalRootKidsIndex = 0; bool isBeforeOriginalRoot = true; foreach (IStructureNode elem in rootKids) { // StructTreeRoot kids are always PdfStructElement, so we are save here to cast it PdfStructElem kid = (PdfStructElem)elem; if (kid.GetPdfObject() == rootTagElement.GetPdfObject()) { isBeforeOriginalRoot = false; continue; } // This boolean is used to "flatten" possible deep "stacking" of the tag structure in case of the multiple pages copying operations. // This could happen due to the wrapping of all the kids in the createNewRootTag or ensureExistingRootTagIsDocument methods. // And therefore, we don't need here to resolve mappings, because we exactly know which role we set. bool kidIsDocument = PdfName.Document.Equals(kid.GetRole()); if (kidIsDocument && kid.GetNamespace() != null && context.TargetTagStructureVersionIs2()) { // we flatten only tags of document role in standard structure namespace String kidNamespaceName = kid.GetNamespace().GetNamespaceName(); kidIsDocument = StandardNamespaces.PDF_1_7.Equals(kidNamespaceName) || StandardNamespaces.PDF_2_0.Equals(kidNamespaceName ); } if (isBeforeOriginalRoot) { rootTagElement.AddKid(originalRootKidsIndex, kid); originalRootKidsIndex += kidIsDocument ? kid.GetKids().Count : 1; } else { rootTagElement.AddKid(kid); } if (kidIsDocument) { RemoveOldRoot(kid); } } }
public virtual void StructElemTest07() { PdfWriter writer = new PdfWriter(destinationFolder + "structElemTest07.pdf"); writer.SetCompressionLevel(CompressionConstants.NO_COMPRESSION); PdfDocument document = new PdfDocument(writer); document.SetTagged(); PdfStructElem doc = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); PdfPage page = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(page); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.COURIER), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); PdfStructElem span2 = paragraph.AddKid(new PdfStructElem(document, new PdfName("Chunk"), page)); canvas.OpenTag(new CanvasTag(span2.AddKid(new PdfMcrNumber(page, span2)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); PdfNamespace @namespace = new PdfNamespace("http://www.w3.org/1999/xhtml"); span1.SetNamespace(@namespace); span1.AddRef(span2); span1.SetPhoneticAlphabet(PdfName.ipa); span1.SetPhoneme(new PdfString("Heeeelllloooooo")); @namespace.AddNamespaceRoleMapping(StandardRoles.SPAN, StandardRoles.SPAN); document.GetStructTreeRoot().AddNamespace(@namespace); page.Flush(); document.Close(); CompareResult("structElemTest07.pdf", "cmp_structElemTest07.pdf", "diff_structElem_07_"); }
internal virtual int CreateNextMcidForStructElem(PdfStructElem elem, int index) { ThrowExceptionIfCurrentPageIsNotInited(); PdfMcr mcr; if (!MarkedContentNotInPageStream() && EnsureElementPageEqualsKidPage(elem, currentPage.GetPdfObject())) { mcr = new PdfMcrNumber(currentPage, elem); } else { mcr = new PdfMcrDictionary(currentPage, elem); if (MarkedContentNotInPageStream()) { ((PdfDictionary)mcr.GetPdfObject()).Put(PdfName.Stm, contentStream); } } elem.AddKid(index, mcr); return(mcr.GetMcid()); }
public virtual void StructElemTest04() { MemoryStream baos = new MemoryStream(); PdfWriter writer = new PdfWriter(baos); writer.SetCompressionLevel(CompressionConstants.NO_COMPRESSION); PdfDocument document = new PdfDocument(writer); document.SetTagged(); document.GetStructTreeRoot().GetRoleMap().Put(new PdfName("Chunk"), PdfName.Span); PdfStructElem doc = document.GetStructTreeRoot().AddKid(new PdfStructElem(document, PdfName.Document)); PdfPage page = document.AddNewPage(); PdfCanvas canvas = new PdfCanvas(page); canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.COURIER), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 512); PdfStructElem paragraph = doc.AddKid(new PdfStructElem(document, PdfName.P)); PdfStructElem span1 = paragraph.AddKid(new PdfStructElem(document, PdfName.Span, page)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page, span1)))); canvas.ShowText("Hello "); canvas.CloseTag(); PdfStructElem span2 = paragraph.AddKid(new PdfStructElem(document, new PdfName("Chunk"), page)); canvas.OpenTag(new CanvasTag(span2.AddKid(new PdfMcrNumber(page, span2)))); canvas.ShowText("World"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); page.Flush(); document.Close(); byte[] bytes = baos.ToArray(); PdfReader reader = new PdfReader(new MemoryStream(bytes)); writer = new PdfWriter(destinationFolder + "structElemTest04.pdf"); writer.SetCompressionLevel(CompressionConstants.NO_COMPRESSION); document = new PdfDocument(reader, writer); page = document.GetPage(1); canvas = new PdfCanvas(page); PdfStructElem p = (PdfStructElem)document.GetStructTreeRoot().GetKids()[0].GetKids()[0]; canvas.BeginText(); canvas.SetFontAndSize(PdfFontFactory.CreateFont(StandardFonts.COURIER), 24); canvas.SetTextMatrix(1, 0, 0, 1, 32, 490); //Inserting span between of 2 existing ones. span1 = p.AddKid(1, new PdfStructElem(document, PdfName.Span, page)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page, span1)))); canvas.ShowText("text1"); canvas.CloseTag(); //Inserting span at the end. span1 = p.AddKid(new PdfStructElem(document, PdfName.Span, page)); canvas.OpenTag(new CanvasTag(span1.AddKid(new PdfMcrNumber(page, span1)))); canvas.ShowText("text2"); canvas.CloseTag(); canvas.EndText(); canvas.Release(); page.Flush(); document.Close(); CompareResult("structElemTest04.pdf", "cmp_structElemTest04.pdf", "diff_structElem_04_"); }