'''' This code is part of Document Solutions for PDF .NET demos.'' Copyright (c) MESCIUS inc. All rights reserved.''ImportsSystem.IOImportsSystem.DrawingImportsSystem.TextImportsGrapeCity.Documents.TextImportsGrapeCity.Documents.DrawingImportsGrapeCity.Documents.PdfImportsGrapeCity.Documents.Pdf.StructureImportsGrapeCity.Documents.Pdf.MarkedContentImportsGrapeCity.Documents.Pdf.GraphicsImportsGrapeCity.Documents.Pdf.AnnotationsImports GCTEXT = GrapeCity.Documents.Text '' This sample shows how to create a PDF/A-3u conformant document.PublicClassPdfASubCreatePDF(ByVal stream AsStream)Dim doc = NewGcPdfDocument()Dim thedate = New DateTime(1961, 4, 12, 6, 7, 0, DateTimeKind.Utc) '' Mark the document as PDF/A-3u conformant: doc.ConformanceLevel = PdfAConformanceLevel.PdfA3u Dim fnt = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "NotoSans-Regular.ttf"))Dim gap = 36 '' PDF/A-3a requires all content to be tagged so create and populate StructElement when rendering:Dim sePart = NewStructElement("Part") doc.StructTreeRoot.Children.Add(sePart) Dim tl AsTextLayout = Nothing'' Add 3 pages with sample content tagged according to PDF/A rules:For pageNo = 1To3'' add pageDim Page = doc.Pages.Add()Dim g = Page.GraphicsDim y = 72.0FIf doc.Pages.Count = 1Then'' Create paragraph element:Dim seParagraph = NewStructElement("P") With {.DefaultPage = Page}'' Add it to Part element: sePart.Children.Add(seParagraph) tl = g.CreateTextLayout() tl.MarginAll = 72 tl.MaxWidth = Page.Size.Width tl.DefaultFormat.Font = fnt tl.DefaultFormat.FontBold = True tl.DefaultFormat.FontSize = 20 tl.Append("PDF/A-3A Document") '' PerformLayout is done automatically in a new TextLayout or after a Clear():''tl.PerformLayout(True) '' Draw TextLayout within tagged content: g.BeginMarkedContent(NewTagMcid("P", 0)) g.DrawTextLayout(tl, PointF.Empty) g.EndMarkedContent() y = tl.ContentRectangle.Bottom + gap seParagraph.ContentItems.Add(NewMcidContentItemLink(0))EndIf '' Add some sample paragraphs tagged according to PDF/A rules:For i = 1To3'' Create paragraph element:Dim seParagraph = NewStructElement("P") With {.DefaultPage = Page}'' Add it to Part element: sePart.Children.Add(seParagraph) Dim sb = NewStringBuilder() sb.Append(String.Format("Paragraph {0} on page {1}: ", i, pageNo)) sb.Append(Util.LoremIpsum(1, 2, 4, 5, 10))Dim para = sb.ToString() tl.Clear() tl.DefaultFormat.FontSize = 14 tl.DefaultFormat.FontBold = False tl.MarginTop = y tl.Append(para) '' Draw TextLayout within tagged content: g.BeginMarkedContent(NewTagMcid("P", i)) g.DrawTextLayout(tl, PointF.Empty) g.EndMarkedContent() y += tl.ContentHeight + gap '' Add content item to paragraph StructElement: seParagraph.ContentItems.Add(NewMcidContentItemLink(i)) '' PDF/A-3 allows embedding files into document, but they should be associated with some document element'' add embedded file associated with seParagraph:Dim ef1 = EmbeddedFileStream.FromBytes(doc, Encoding.UTF8.GetBytes(para))'' ModificationDate and MimeType should be specified in case of PDF/A: ef1.ModificationDate = thedate ef1.MimeType = "text/plain"Dim fn = String.Format("Page{0}_Paragraph{1}.txt", pageNo, i)Dim fs1 = FileSpecification.FromEmbeddedStream(fn, ef1)'' Relationship should be specified in case of PDF/A: fs1.Relationship = AFRelationship.Unspecified doc.EmbeddedFiles.Add(fn, fs1) seParagraph.AssociatedFiles.Add(fs1)NextNext '' PDF/A-3 allows transparency drawing in PDF file, add some:Dim gpage = doc.Pages(0).Graphics gpage.FillRectangle(NewRectangleF(20, 20, 200, 200), Color.FromArgb(40, Color.Red)) '' PDF/A-3 allows using FormXObjects, add one with transparency:Dim r = NewRectangleF(0, 0, 144, 72)Dim fxo = NewFormXObject(doc, r)Dim gfxo = fxo.Graphics gfxo.FillRectangle(r, Color.FromArgb(40, Color.Violet))Dim tf = NewTextFormat() With { .Font = fnt, .FontSize = 16, .ForeColor = Color.FromArgb(100, Color.Black) } gfxo.DrawString("FormXObject", tf, r, TextAlignment.Center, ParagraphAlignment.Center) gfxo.DrawRectangle(r, Color.Blue, 3) gpage.DrawForm(fxo, NewRectangleF(300, 250, r.Width, r.Height), Nothing, ImageAlign.ScaleImage) '' PDF/A-3 allows using embedded files, but each embedded file must be associated with a document's element:Dim ef = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "WordDocs", "ProcurementLetter.docx"))'' ModificationDate and MimeType should be specified for EmbeddedFile in PDF/A: ef.ModificationDate = thedate ef.MimeType = "application/msword"Dim fs = FileSpecification.FromEmbeddedFile(ef) fs.Relationship = AFRelationship.Unspecified doc.EmbeddedFiles.Add("ProcurementLetter.docx", fs)'' Associate embedded file with the document: doc.AssociatedFiles.Add(fs) '' Add an attachment associated with an annotation:Dim sa = NewStampAnnotation() With { .UserName = "Minerva", .Font = fnt, .Rect = NewRectangleF(300, 36, 220, 72) } sa.Flags = sa.FlagsOrAnnotationFlags.Print'' Use a FormXObject to represent the stamp annotation:Dim stampFxo = NewFormXObject(doc, NewRectangleF(PointF.Empty, sa.Rect.Size))Dim gstampFxo = stampFxo.Graphics gstampFxo.FillRectangle(stampFxo.Bounds, Color.FromArgb(40, Color.Green)) gstampFxo.DrawString("Stamp Annotation" + vbLf + "associated with minerva.jpg", tf, stampFxo.Bounds, TextAlignment.Center, ParagraphAlignment.Center) gstampFxo.DrawRectangle(stampFxo.Bounds, Color.Green, 3)'' sa.AppearanceStreams.Normal.Default = stampFxo doc.Pages(0).Annotations.Add(sa) ef = EmbeddedFileStream.FromFile(doc, Path.Combine("Resources", "Images", "minerva.jpg")) ef.ModificationDate = thedate ef.MimeType = "image/jpeg" fs = FileSpecification.FromEmbeddedFile(ef) fs.Relationship = AFRelationship.Unspecified doc.EmbeddedFiles.Add("minerva.jpg", fs) sa.AssociatedFiles.Add(fs) '' Mark the document as conforming to Tagged PDF conventions (required for PDF/A): doc.MarkInfo.Marked = True '' Metadata.CreatorTool and DocumentInfo.Creator should be the same for a PDF/A document: doc.Metadata.CreatorTool = doc.DocumentInfo.Creator'' A title should be specified for PDF/A document: doc.Metadata.Title = "DsPdf Document" doc.ViewerPreferences.DisplayDocTitle = True '' Done: doc.Save(stream)EndSubEndClass