Platforms to show: All Mac Windows Linux Cross-Platform

/DynaPDF/signed pdfa/signed pdfa

Required plugins for this example: MBS DynaPDF Plugin

You find this example project in your Plugins Download as a Xojo project file within the examples folder: /DynaPDF/signed pdfa/signed pdfa

This example is the version from Wed, 14th Sep 2021.

Project "signed pdfa.xojo_binary_project"
Filetype text
Filetype icc
End FileTypes
MenuBar MenuBar1
MenuItem UntitledMenu1 = ""
MenuItem FileMenu = "&File"
MenuItem FileQuit = "Quit"
MenuItem UntitledMenu5 = ""
MenuItem EditMenu = "&Edit"
MenuItem EditUndo = "&Undo"
MenuItem UntitledMenu0 = "-"
MenuItem EditCut = "Cu&t"
MenuItem EditCopy = "&Copy"
MenuItem EditPaste = "&Paste"
MenuItem EditClear = "Clear"
MenuItem UntitledMenu4 = ""
MenuItem UntitledMenu3 = ""
MenuItem UntitledMenu2 = ""
End MenuBar
Class App Inherits Application
EventHandler Sub Open() dim pdf as new MyDynapdfMBS dim sigField, sh as integer dim outfile as FolderItem=SpecialFolder.Desktop.Child("signed pdfa.pdf") pdf.SetLicenseKey "Pro" // For this example you can use a Pro or Enterprise License call pdf.CreateNewPDF(nil) // The output file is created later call pdf.SetDocInfo(pdf.kdiCreator, "REALbasic Test application") call pdf.SetDocInfo(pdf.kdiTitle, "PDF/A and digital signatures") call pdf.Append call pdf.SetFont("Arial", pdf.kfsNone, 10.0, true, pdf.kcpUnicode) call pdf.WriteFText(pdf.ktaLeft, "This is a PDF/A 1b compatible PDF file that was digitally signed with "+_ "a self sign certificate. Because PDF/A requires that all fonts are embedded it is important "+_ "to avoid the usage of the 14 Standard fonts."+EndOfLine.unix+EndOfLine.unix+_ "When signing a PDF/A compliant PDF file with the default settings (without creation of a user "+_ "defined appearance) the font Arial must be available on the system because it is used to print "+_ "the certificate properties into the signature field."+EndOfLine.unix+EndOfLine.unix+_ "The font Arial must also be available if an empty signature field was added to the file "+_ "without signing it when closing the PDF file. Yes, it is still possible to sign a PDF/A "+_ "compliant PDF file later with Adobe's Acrobat. The signed PDF file is still compatible "+_ "to PDF/A. If you use a third party solution to digitally sign the PDF file then test "+_ "whether the signed file is still valid with the PDF/A 1b preflight tool included in Acrobat 8 "+_ "Professional."+EndOfLine.unix+EndOfLine.unix+_ "Signature fields must be visible and the print flag must be set (default). CheckConformance() "+_ "adjusts these flags if necessary and produces a warning if changes were applied. If no changes "+_ "should be allowed, just return -1 in the error callback function. If the error callback function "+_ "returns 0, DynaPDF assumes that the prior changes were accepted and processing continues."+EndOfLine.unix+EndOfLine.unix+_ "\FC[255]Notice:\FC[0]"+EndOfLine.unix+_ "It makes no sense to execute CheckConformance() without an error callback function or error event "+_ "in VB. If you cannot see what happens during the execution of CheckConformance(), it is "+_ "completely useless to use this function!"+EndOfLine.unix+EndOfLine.unix+_ "CheckConformance() should be used to find the right settings to create PDF/A compatible PDF files. "+_ "Once the the settings were found it is usually not longer recommended to execute this function. "+_ "However, it is of course possible to use CheckConformance() as a general approach to make sure "+_ "that files created with DynaPDF are PDF/A compatible.") ' /* ---------------------- Signature field appearance ---------------------- */ sigField = pdf.CreateSigField("Signature", -1, 200.0, 400.0, 200.0, 80.0) //pdf.SetFieldColor(sigField, fcBorderColor, csDeviceRGB, NO_COLOR) // Place the validation icon on the left side of the signature field. call pdf.PlaceSigFieldValidateIcon(sigField, 0.0, 15.0, 50.0, 50.0) 'This function creates a template into which you can draw whatever you want. The template 'is already opened when calling the function; it must be closed when finish with EndTemplate(). 'An appearance template of a signature field is reserved for this field. It must not be placed 'on another page! ' 'In addition, it makes no sense to create an appearance template when the file is not digitally 'signed later. Empty signature fields cannot contain a user defined appearance. call pdf.CreateSigFieldAP(sigField) call pdf.SaveGraphicState call pdf.Rectangle(0.0, 0.0, 200.0, 80.0, pdf.kfmNoFill) call pdf.ClipPath(pdf.kcmWinding, pdf.kfmNoFill) sh = pdf.CreateAxialShading(0.0, 0.0, 200.0, 0.0, 0.5, PDF.RGB(120, 120, 220), pdf.kPDF_WHITE, true, true) call pdf.ApplyShading(sh) call pdf.RestoreGraphicState call pdf.SaveGraphicState call pdf.Ellipse(50.5, 1.0, 148.5, 78.0, pdf.kfmNoFill) call pdf.ClipPath(pdf.kcmWinding, pdf.kfmNoFill) sh = pdf.CreateAxialShading(0.0, 0.0, 0.0, 78.0, 2.0, pdf.kPDF_WHITE, PDF.RGB(120, 120, 220), true, true) call pdf.ApplyShading(sh) call pdf.RestoreGraphicState call pdf.SetFont("Arial", BitwiseOr(pdf.kfsBold, pdf.kfsUnderlined), 11.0, true, pdf.kcpUnicode) call pdf.SetFillColor(PDF.RGB(120, 120, 220)) call pdf.WriteFTextEx(50.0, 60.0, 150.0, -1.0, pdf.ktaCenter, "Digitally signed by:") call pdf.SetFont("Arial", BitwiseOr(pdf.kfsBold,pdf.kfsItalic), 18.0, true, pdf.kcpUnicode) call pdf.SetFillColor(PDF.RGB(100, 100, 200)) call pdf.WriteFTextEx(50.0, 45.0, 150.0, -1.0, pdf.ktaCenter, "Jens Boschulte") call pdf.EndTemplate // Close the appearance template. '/* ------------------------------------------------------------------------ */ call pdf.EndPage // Check whether the file is compatible to PDF/A 1b select case pdf.CheckConformance(pdf.kctPDFA_1b_2005,0) case 1 // RGB case 3 // Gray dim iccpath as folderitem = FindFile("ColorMatchRGB.icc") call pdf.AddOutputIntent(iccpath) case 2 // CMYK MsgBox("CMYK output is not configured in this example.") quit end Select // No fatal error occurred? if pdf.HaveOpenDoc then // OK, now we can open the output file. if not pdf.OpenOutputFile(outFile) then MsgBox "Make sure that you have write access to the project folder." quit end if dim filepath as folderitem = FindFile("test_cert.pfx") if not pdf.CloseAndSignFile(filePath, "123456", "Test", "") then // Note: If the certificate cannot be found or when using a wrong password the PDF file is still // in memory. This is required to enable entering another password or certificate file. quit end if outfile.Launch end if quit End EventHandler
Function FindFile(name as string) As FolderItem // Look for file in parent folders from executable on dim parent as FolderItem = app.ExecutableFile.Parent while parent<>Nil dim file as FolderItem = parent.Child(name) if file<>Nil and file.Exists then Return file end if parent = parent.Parent wend End Function
End Class
Class MyDynaPDFMBS Inherits DynaPDFMBS
EventHandler Function Error(ErrorCode as integer, ErrorMessage as string, ErrorType as integer) As integer // output all messages on the console: System.DebugLog str(ErrorCode)+": "+ErrorMessage // and display dialog: Dim d as New MessageDialog //declare the MessageDialog object Dim b as MessageDialogButton //for handling the result d.icon=MessageDialog.GraphicCaution //display warning icon d.ActionButton.Caption="Continue" d.CancelButton.Visible=True //show the Cancel button // a warning or an error? if BitAnd(ErrorType, me.kE_WARNING) = me.kE_WARNING then // if user decided to ignore, we'll ignore if IgnoreWarnings then Return 0 d.Message="A warning occurred while processing your PDF code." // we add a third button to display all warnings d.AlternateActionButton.Caption = "Ignore warnings" d.AlternateActionButton.Visible = true else d.Message="An error occurred while processing your PDF code." end if d.Explanation = str(ErrorCode)+": "+ErrorMessage b=d.ShowModal //display the dialog Select Case b //determine which button was pressed. Case d.ActionButton Return 0 // ignore Case d.AlternateActionButton IgnoreWarnings = true Return 0 // ignore Case d.CancelButton Return -1 // stop End select End EventHandler
EventHandler Function OnReplaceICCProfile(Type as integer, ColorSpace as integer) As integer Select case type case kictGray break case kictRGB dim iccpath as folderitem = app.FindFile("ColorMatchRGB.icc") dim r as integer = ReplaceICCProfile(ColorSpace, iccpath) case kictCMYK Break else break end Select End EventHandler
Property IgnoreWarnings As Boolean
End Class
End Project

The items on this page are in the following plugins: MBS DynaPDF Plugin.

The biggest plugin in space...