PdfA.vb
C# VB
'''' This code is part of Document Solutions for PDF .NET demos.'' Copyright (c) MESCIUS inc. All rights reserved.''Imports System.IOImports System.DrawingImports System.TextImports GrapeCity.Documents.TextImports GrapeCity.Documents.DrawingImports GrapeCity.Documents.PdfImports GrapeCity.Documents.Pdf.StructureImports GrapeCity.Documents.Pdf.MarkedContentImports GrapeCity.Documents.Pdf.GraphicsImports GrapeCity.Documents.Pdf.AnnotationsImports GCTEXT = GrapeCity.Documents.Text
'' This sample shows how to create a PDF/A-3u conformant document.Public Class PdfA Sub CreatePDF(ByVal stream As Stream) Dim doc = New GcPdfDocument() 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 = New StructElement("Part") doc.StructTreeRoot.Children.Add(sePart)
Dim tl As TextLayout = Nothing '' Add 3 pages with sample content tagged according to PDF/A rules: For pageNo = 1 To 3 '' add page Dim Page = doc.Pages.Add() Dim g = Page.Graphics Dim y = 72.0F If doc.Pages.Count = 1 Then '' Create paragraph element: Dim seParagraph = New StructElement("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(New TagMcid("P", 0)) g.DrawTextLayout(tl, PointF.Empty) g.EndMarkedContent()
y = tl.ContentRectangle.Bottom + gap
seParagraph.ContentItems.Add(New McidContentItemLink(0)) End If
'' Add some sample paragraphs tagged according to PDF/A rules: For i = 1 To 3 '' Create paragraph element: Dim seParagraph = New StructElement("P") With {.DefaultPage = Page} '' Add it to Part element: sePart.Children.Add(seParagraph)
Dim sb = New StringBuilder() 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(New TagMcid("P", i)) g.DrawTextLayout(tl, PointF.Empty) g.EndMarkedContent()
y += tl.ContentHeight + gap
'' Add content item to paragraph StructElement: seParagraph.ContentItems.Add(New McidContentItemLink(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) Next Next
'' PDF/A-3 allows transparency drawing in PDF file, add some: Dim gpage = doc.Pages(0).Graphics gpage.FillRectangle(New RectangleF(20, 20, 200, 200), Color.FromArgb(40, Color.Red))
'' PDF/A-3 allows using FormXObjects, add one with transparency: Dim r = New RectangleF(0, 0, 144, 72) Dim fxo = New FormXObject(doc, r) Dim gfxo = fxo.Graphics gfxo.FillRectangle(r, Color.FromArgb(40, Color.Violet)) Dim tf = New TextFormat() 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, New RectangleF(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 = New StampAnnotation() With { .UserName = "Minerva", .Font = fnt, .Rect = New RectangleF(300, 36, 220, 72) } sa.Flags = sa.Flags Or AnnotationFlags.Print '' Use a FormXObject to represent the stamp annotation: Dim stampFxo = New FormXObject(doc, New RectangleF(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) End SubEnd Class