''
'' This code is part of Document Solutions for PDF demos.
'' Copyright (c) MESCIUS inc. All rights reserved.
''
Imports System.IO
Imports System.Drawing
Imports System.Text
Imports GrapeCity.Documents.Text
Imports GrapeCity.Documents.Common
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.Structure
Imports GrapeCity.Documents.Pdf.MarkedContent
Imports GrapeCity.Documents.Pdf.Graphics
Imports GrapeCity.Documents.Pdf.Annotations
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing
'' 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", "arial.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 And 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 Sub
End Class