Download HTTP Live Stream

From time to time, I love to download a video stream to watch it later. For example the relive feature from provides a stream to watch live or later, but no simple video download. Same for Apple with the keynotes in stream only format.

First you need the URL of the stream. e.g. for the last Apple website for their recent keynote:

You find it for bitsundso after login on the status page and than copying the link for video for QuickTime player. How you get the stream URL doesn't matter, but as soon as you have the URL to the m3u8 file, you can download all segments and merge them to one file.
But first you download that m3u8 file and you see inside the links for the various resolutions. You also find redirects for other languages there. What you need is the final m3u8 file URL to download.

e.g. we pick full resolution for the Apple keynote:

Now you need a copy of ffmpeg command line utility, which I just downloaded as disk image and copied to home folder. Now you can go into Terminal application and use a command like the following with your URL and desired file name:

./ffmpeg -i '' -c copy -bsf:a aac_adtstoasc keynote.mp4

Once finished, you have a nice mp4 file, which is suitable for watching offline. And now you know why I need this from time to time. e.g. for watching something later in the train without reliable wifi or payable cellular.

PS: I tried the same myself with a self written app, but merging videos with AVMutableComposition and AVExportSession fails when you try to merge a few hundred little videos.

PPS: Apple's keynote podcast does have the video files, so no need to use the stream.

See you at the next Xojo Conferences

If you enjoyed or missed the Xojo conference in Denver, maybe you like to join the

Looking forward to see you in Munich in four months!

Colorspaces in Xojo

If you are interested in color handling in Xojo, we have a couple of things for you.

MBS Plugins support several color engines: We got those blog posts for you to read: And a couple of examples for you: Please try the sylwia image with your application and see if Rot is red and Blau is blue color.
If you need plugin for X-Rite's EyeOne devices, please contact us after you got the SDK + License from X-Rite.

Converting JSON to HTML for display

For the next MBS FileMaker Plugin, we add a new function JSON.ToHTML to display JSON to user in a web viewer:

We include some CSS class tags, so you can colorize this a bit. Please try when next prerelease is available or just email us for a testing copy today.

PS: Also coming for Xojo to JSONMBS class.

Spellchecking on Windows

While watching the sessions at XDC, I got the idea to look what RichText control offers and turned on spell checking:

The new Textarea.WinSpellcheckingMBS Property will enable/disable spell checking for textarea control on Windows 8 and newer. Seems like it uses language setting from the current user.
Coming soon to next MBS Xojo Plugins.

HealthKit for FileMaker on iOS

For the next version of MBS FileMaker Plugin for the FileMaker iOS SDK, we are adding HealthKit functions.

For some time now we had people asking for it, so now we start with adding some basic HealthKit support:
  • Checking for availability of health data.
  • Authentication to get permission to use it.
  • Query basic values like sex, blood type, birth date, skin type and wheelchair use.
  • Query sample data like step counts and return results as JSON block.
The new HealthKit.SampleQuery function is really very universal, so you can query 30+ things using it and request values in various units.

If you like this, please try it soon and let us know what you think. More functions are possible, but it all depends on what you like to do and what we can do from a plugin.

Coming soon for MBS FileMaker Plugin 8.2 with the next prerelease.
Requires you to enable health kit for entitlements and declare usage in info.plist of course.

MBS at XDC 2018

This year I will be at XDC in Denver as a regular attendee and speaker.

If you like, you can ask me for the coupon code for the MBS discount for conference attendees (20% off on all licenses).

For our upcoming conference in Munich, we offer a 100 Euro discount (+VAT) if you like to attend both conferences this year. So if you got your XDC badge, meet me at the conference, so I can sign you up right there! Or use coupon code XDC2018 later when getting a ticket.

Otherwise I wish you an interesting conference with a lot of great news and a lot to learn!

FileMaker Abend bei der Denkform

Am 29. Mai 2018 treffen sich interessierte FileMaker Entwickler bei der Denkform in Hofheim (Taunus).
Wir schauen uns Neues in der FileMaker Welt an.
Michael Valentin von FileMaker Deutschland kommt vorbei und präsentiert Neuigkeiten und steht dann für Fragen bereit.

Anschließend zeigt Christian Schmitz gerne ein paar Neuerungen im MBS Plugin 8.x.

Anmeldung auf der Denkform Eventseite (Link kommt noch). Zeitlich vermutlich 18 bis 21 Uhr. Eventuell mit optionalem Abendessen.
Bitte den Termin frei halten. Mehr Details zu den Programmpunkten folgen. Anmeldung hier

MBS Xojo Plugins, version 18.2pr4

New in this prerelease of the 18.2 plugins:
  • Added CURLSMBS.Paused property.
  • Added AddMimePart and FinishMime methods to CURLSMBS class.
  • Added CURLSMimePartMBS class.
  • Changed cursor functions for SQL Plugin to return field count = 0 if there is no result set.
  • Changed AutoCache for SQL Plugin to not try to cache recordsets if there is no result set.
Or ask us to be added to our shared Dropbox folder.

MBS FileMaker Plugin, version 8.2pr4

New in this prerelease of version 8.2 of the MBS FileMaker Plugin: Download at or ask for being added to the dropbox shared folder.

Use JSON functions with SQLite

In both MBS FileMaker Plugin and in the MBS Xojo SQL Plugin, we have a built-in SQLite library with various extensions. You activate it in FileMaker with SQL.InternalSQLiteLibrary.Activate and in Xojo with methods in InternalSQLiteLibraryMBS module.

Once you use a SQLite library with JSON functions, you can use seventeen new functions from the json1 extension that are useful for managing JSON content stored in an SQLite database. Twelve of the fourteen SQL functions are scalar functions:
  • json(json)
  • json_array(value1,value2,...)
  • json_array_length(json)
  • json_array_length(json,path)
  • json_extract(json,path,...)
  • json_insert(json,path,value,...)
  • json_object(label1,value1,...)
  • json_patch(json1,json2)
  • json_remove(json,path,...)
  • json_replace(json,path,value,...)
  • json_set(json,path,value,...)
  • json_type(json)
  • json_type(json,path)
  • json_valid(json)
  • json_quote(value)
There are two aggregate SQL functions:
  • json_group_array(value)
  • json_group_object(name,value)
The two table-valued functions are:
  • json_each(json)
  • json_each(json,path)
  • json_tree(json)
  • json_tree(json,path)
e.g. in a query you can use the function like in the following example:

SELECT json_array_length('[1,2,3,4]')


SELECT * FROM MyTable WHERE json_extract(JSON, '$.type') = "person"

Could be useful for projects, where you store a JSON blob in a field and you like to query against it.

Let users review your FileMaker iOS application

With next MBS FileMaker Plugin you can ask the user to review your application.

The StoreKit.RequestReview function allows you to ask the user to rate your application. The function returns directly and the dialog shows asynchronously.

Although you should call this method when it makes sense in the user experience flow of your app, the actual display of a rating/review request view is governed by App Store policy. Because this method may or may not present an alert, it's not appropriate to call it in response to a button tap or other user action.

When you call this method while your app is still in development mode, a rating/review request view is always displayed so that you can test the user interface and experience. However, this method has no effect when you call it in an app that you distribute using TestFlight.

When you call this method in your shipping app and a rating/review request view is displayed, the system handles the entire process for you. In addition, you can continue to include a persistent link in the settings or configuration screens of your app that deep-links to your App Store product page. To automatically open a page on which users can write a review in the App Store, append the query parameter action=write-review to your product URL.

Coming soon in the next MBS FileMaker Plugin 8.2 prerelease.

Do you remember Boulder?

Nine years ago we visited the REAL Studio Summit in Boulder, Colorado. A small Xojo conference with about 30 people in the office of Inspiring Apps right there at the edge of Pearl Street, the central shopping mall street in Boulder.

Now we are back to Denver for the 4-5 times larger Xojo developer conference and of course I had to make a little trip to see Boulder again. As well as Nederland the beautiful mountains and the Boulder greek. See you soon at XDC!

MBS Xojo Event Kit, version 1.2

Nickenich, Germany (April 23rd, 2018) -- Monkeybread Software releases version 1.2 of the MBS Xojo Event Kit.

The MBS Xojo Event Kit provides you with a few useful classes for using the calendar for your Xojo iOS application.

New in version 1.2:
  • Added privacy entries for info.plist via build script step.
  • Updated for Xojo 2018r1
  • Fixed bugs with color for Mac and we now use NSColor there.
  • Fixed bug with EKCalendarItemMB.URL setter
Our Event Kit requires Xojo 2015r1 or newer.

If you need similar classes for OS X (32 and 64bit), you can check the MBS Xojo Cocoa Plugins from us:
EventKit or CalendarStore

The Event Kit is available for $99 USD or 79 Euro (+VAT if needed).

You can learn more on our website.

Working on new Store Kit functions

For the next MBS Plugin we work on functions for the Mac and iOS App Store.

While this is still work in progress and getting your iOS or Mac App in the app store is quite a challenge, we prepare the necessary functions to do sell items to the user. For example you could have a solution where user buys a subscription or upgrades from trial to full version with an in-app purchase.


Before you would check our plugin functions, please read documentation from Apple on how this works. You will have to setup products in iTunes Connect website and add entitlements for in-app purchase to your app.


First you query products and you get back the product definitions you entered on Apple's website. Our StoreKit.QueryProducts function will do this and you may call it in the start script in your solution. Than later you can use StoreKit.Products to get the JSON with the definitions:




    "localizedDescription" : "Just a little contribution from you. Thanks.",

    "formattedPrice" : "$8.99",

    "price" : 8.99,

    "productIdentifier" : "123",

    "downloadable" : false,

    "localizedTitle" : "A donation to developer",

    "priceLocale" : "en_US@currency=USD"




At any time you can use StoreKit.Transactions function to query transactions and their status:




    "transactionIdentifier" : "C2CF465A-BC94-4705-BE9E-E5A02A6DD422",

    "transactionState" : "Failed",

    "payment" : {

      "quantity" : 1,

      "productIdentifier" : "123"


    "error" : "Cannot connect to iTunes Store"




And with StoreKit.AddPayment function you can start a payment process for an item. You setup a trigger to run when transactions update. So you can check if something is purchased. Than you unlock functions and call StoreKit.FinishTransaction function to let the App store know you delivered.


We are looking for interested FBA partners who want to add this to their FileMaker iOS SDK application or Mac runtime. Let us know if you are interested.

Macoun Conference

The 11th Macoun conference 2018 will be at 15th and 16th September 2018. This is one of the biggest Mac and iOS developer conferences in Europe with over 400 participants.

With 20+ sessions about coding topics & tricks it feels like a smaller WWDC in German. :-)

I expect it to be located again in Frankfurt in Germany and if you speak German or at least English, please join it!

Privacy enhancements

In preparation for the Privacy and Electronic Communications Directive here in Europe, we made a few adjustments already to comply better with regulation:
  • Attended training at denkform: Europäische Datenschutzgrundverordnung EU DS-GVO
  • We setup a new privacy policy website in English and German.
  • Our website no longer tracks access and no longer stores IP in logs. We just keeps sum counts for web analyzer. We actually did that years ago and just verified that it's configured now for all domains.
  • Our plugin's update checker is disabled for new plugin version.
  • Mailing lists are opt-in.
  • We track newsletter opt-in now in database.
  • We got a new shredder to finally destroy all papers older than 10 years safely.
  • All web forms should be on https websites and going there you should be redirected to https if needed.
  • We got some additional SSL certificates to cover more domains.
  • Google analytics is in the privacy policy, but currently we don't use it.
  • Forms got checkboxes so people can agree to send data.
So if everything works, those changes may benefit you.
Anything we may have missed so far?

PDF Forms with MBS Plugin

As you may know, you can create PDF form fields with our MBS Plugin using the DynaPDF functions. The plugin can do a lot there and not just read/write form field values, but also create new fields. In the following article, we want to show you how we do this. Our goal is to dynamically create a template PDF based on a form file created in a word processor. We add fields with data, send it to a client and when we get the modified file back, we can import the new values.




We start with a sample database. This database has a table for people and the following fields. All just plain text fields and the ID field is set to be come an UUID. That is important as a random UUID makes it difficult to guess a valid ID, which would be easy if you just count up record IDs. We store the ID in the PDF and don't want someone to make up a valid ID. Here is the field list:


Firstname Text

Lastname Text

Address Text

City Text

Country Text

Email Text

ID Text Indexed, Auto-enter Calculation replaces existing value, Can't Modify Auto



Transparent Screensaver for macOS

Our transparent screensaver is still the choice of screensaver for computers running in an office. You can see the statistics of your running applications, the console log or activity monitor to check quickly what's going on. Only when you move mouse or touch a key, you need to enter your password or use Touch ID. But otherwise the view is free to see stats.

Try it today and let me know how you like it.
On all commenters here on this blog article, we raffle on free license on Sunday.

Below the announcement from the last update: (more)

MBS Xojo Plugins, version 18.2pr3

New in this prerelease of the 18.2 plugins:
  • Added NSApplicationMBS.runModalForWindow function.
  • Added over 50 more CURL options.
  • Added more constants for CURL.
  • Added NSURLConnectionFilterMBS class for timeout change for Xojo.Net.HTTPSocket on Mac.
  • Added CURLSSSLBackendMBS class.
  • Added GetInfoActiveSocket, GetInfoHTTPVersion, GetInfoProtocol, GetInfoProxySSLVerifyResult and GetInfoScheme methods to CURLSMBS.
  • Added brotliVersion, brotliVersionNumber, iconvVersionNumber, libidnVersion, libsshVersion, SupportsBrotli, SupportsConv, SupportsGSSAPI, SupportsHTTPSProxy, SupportsKerberos5, SupportsMultiSSL, SupportsNTLMWB, SupportsPSL, SupportsTLSAUTHSRP and SupportsUnixSockets properties to CURLSVersionMBS class.
  • Added CURLSMBS.LasterrorText property.
  • Changed CURLSMultiMBS and other variants of it to have Pipelining be an integer property and added constants for it.
  • We filter events for OverlayMBS.MouseWheel which have a zero delta.
  • Updated to Xojo 2018r1 plugin SDK.
  • Changed CURLSMBS.SetupAWS to no longer complain for empty path string as this is needed for AWS Translate.
  • Updated DynaPDF to version
  • Improved fields functions for WordFileMBS class to better read/write fields.
Or ask us to be added to our shared Dropbox folder.

MBS FileMaker Plugin, version 8.2pr3

New in this prerelease of version 8.1 of the MBS FileMaker Plugin: Download at or ask for being added to the dropbox shared folder.

Xojo 2018 Release 1

Xojo 2018 Release 1 is released. Some highlights from the announcement:
  • Windows IDEs can now Run and Debug 64-bit Windows applications.
  • Windows framework updates to reduce flicker.
  • iOS builds now use iOS 11 SDK and support iPhone X screens.
  • You can now display server stats for you Xojo Cloud servers.
  • WebFileUploader has many improvements, including: Drag&Drop, multiple file selection, filtering, upload progress, supports files > 2GB.
Personally I have other highlights including those:
  • Currency comparison works correctly under 64-bit.
  • Windows IDE no longer pre-compiles plugins unnecessarily.
  • SQLiteDatabase: When compiling a prepared statement fails, we now return the error that SQLite reports, instead of a custom "unable to prepare" error message.
  • Converting floating point to unsigned integer types now works correctly under 64-bit.
Complete release notes. What are your favorites?

If you use MBS Plugins, please be aware that you need recent plugins (17.5 or newer) as the IDE is 64-bit and the plugins must support 64-bit. See Xojo versions supported by MBS Plugins.

Xojo.Net.HTTPSocket and Timeouts

For writing a web service client with Xojo you can go three ways for your socket stuff. First you can use HTTPSocket class, which still is in a lot of old projects. Or you go with newer Xojo.Net.HTTPSocket class, which sadly misses some features like timeouts. Or you go via plugin and use for example CURL class.

Last year I moved a client app from old HTTPSocket to Xojo.Net.HTTPSocket to get HTTP 1.1 support and proxy handling. Oh, well, I should have gone the plugin way as now client asks for a timeout. Some requests take longer than 2 minutes on server to provide responds and we get timeout errors in the app.

Before we switch everything to CURL, I checked for an easier way and looked into patching the Xojo class to use new timeout. Looking on a stack trace on how it works, you see this:
4 Window1.Window1.Event_Open%%o  (in test.debug) + 574
4 Xojo.Net.HTTPSocket.Send%%oyy (in test.debug) + 63
4 HTTPSocket_Send (in XojoFramework) + 83
4 HTTPSocketImpNS::Send(Text const&, Text const&) (in XojoFramework) + 312
4 HTTPSocketImpNS::StartConnection(Text const&, Text const&) (in XojoFramework) + 478
4 -[NSURLConnection initWithRequest:delegate:startImmediately:] (in CFNetwork) + 43
4 -[NSURLConnection(Private) _initWithRequest:delegate:usesCache:maxContentLength:startImmediately:connectionProperties:] (in CFNetwork) + 190
4 -[NSURLConnectionInternalConnection initWithInfo:] (in CFNetwork) + 1301
As you see the Xojo.Net.HTTPSocket class is implemented in C++ code and uses NSURLConnection class on Mac for the job. So I created a new NSURLConnectionFilterMBS class, which allows you to filter the call to initWithRequest:delegate:startImmediately: function. All calls to initWithRequest:delegate:startImmediately: are intercepted, our event FilterConnection event is triggered and you can modify the request, before the connection is created. So for Mac at least we can fix the timeout issue.

Coming soon in next prerelease for MBS Xojo Plugins 18.2.

Vote for FileMaker Plugin SDK Ideas

As you may know FileMaker comes with a plugin SDK, which C++ developers like me use to develop plugins. Now the Plugin SDK offers a way to register functions and script steps and provide additional features to the FileMaker developer.

The plugin developer can get a list of parameters with the function call and inspect them, e.g. do different things for containers, texts or numbers passed in. And the plugin can return a value as result and the SDK offers functions to return texts, numbers and assemble containers. Over the years we got a few SQL functions to do queries and modify data in the database on behalf of the FileMaker developer. With the evaluate function in the SDK, we can call Get(Functions) or do calculations.

From a plugin we can trigger a script. That means the script call is put on a queue and executed later after the current script finished. But for some reason, we can't trigger a script on FileMaker Server. The plugin SDK doesn't provide the functionality to do this.

In the plugin we can work with styled text stored in FileMaker fields. We use that to format JSON and XML text now. But we can't access alignments in a styled text.

So as a plugin developer I submitted a few ideas over time:
Please vote for them if you like. FileMaker Inc. may look right now what to deliver in 2019 and we would appreciate if something would be picked based on popular vote.

Those ideas could help to make a better plugin SDK, which may lead a dozen plugin developers to make better plugins, which hundreds of FileMaker developers could use in thousands of solutions.

Presenting at CURL up 2018

Yesterday I did make a presentation about how to use mimetic library with curl to parse email:

We use mimetic library for our MBS Xojo and FileMaker plugins.
The location is excellent for such a conference with all the technic decoration and there is much to learn. I met a few interesting people ranging from students, small companies to big players like Apache organization or Google Inc.

Combine PDFs 5.2.8 with 64-bit

Monkeybread Software today is proud to announce Combine PDFs 5.2.8, an update to their popular PDF merge and split tool for Mac OS X. With a focus on ease-of-use, Combine PDFs is a lightweight utility which allows anyone to merge PDF files and images into a single PDF file. The user need only drag & drop files onto the program icon. The main window appears, allowing the user to set the order in which the files are joined.

Version 5.2.8 is a port to 64-bit, which we provide now for testing. Let us know if you see an issue. If it works fine for everyone, we can push it to the users next week via auto update.

Combine PDFs Website

Requires MacOS 10.9 or newer for 64-bit. Older 32-bit version stays available and still works well.

CURL up 2018

Greetings from the CURL conference in Stockholm

We'll going to learn more about CURL and how to use it. See agenda.

IP in menubar 4.6

NICHENICH, Germany (April 13rd, 2018) -- Monkeybread Software Releases IP in menubar v4.6, an application to show the current IP address in the menubar.

This small application runs in the background and shows the current IP address of your Mac in the menu bar. There are options available to customize the appearance of the menu entry. The IP address is updated regularly. Switch on the Router option if you are behind a router or gateway. You can still see your local IP address in the menu.

You can quit this application using the menu or by using the Activity Monitor (see /Applications/Utilities folder).

This application is freeware and provided as is.

IP in menubar is an example of what you can do in Xojo using the MBS Plugins and their NSStatusItemMBS class.

New in version 4.6 is 64-bit support.

With Xojo moving this app to 64-bit was just a switch in the settings and rebuilding the application. As far as we see everything works fine and we hope you enjoy this application.

The application is freeware, but contributions are accepted through PayPal.

Download at the IP in menubar website.

MBS FileMaker Plugin, version 8.2pr2

New in this prerelease of version 8.1 of the MBS FileMaker Plugin: Download at or ask for being added to the dropbox shared folder.

MBS Xojo Plugins, version 18.2pr2

New in this prerelease of the 18.2 plugins: Download:
Or ask us to be added to our shared Dropbox folder.

Colorize XML in FileMaker

Do you display XML text somewhere for debugging? How about some color?

As you see, we just added a new XML.Colorize function for our MBS FileMaker Plugin which may be useful to add color. Coming in the next plugin version...

Five months till European MBS Xojo Conference in Munich

Just five months left for our European MBS Xojo Conference 2018 in Munich. If you like to join, please sign up soon.

Already over 25 attendees are registered from six countries and the schedule is filling quickly. Reserve your ticket and reserve your hotel room as soon as possible.

The schedule:

Sep 5thEveningoptional get-together with everyone arriving early
Sep 6th9:00 to 18:00First day of conference with keynotes
EveningDinner event in Augustiner Keller
Sep 7th9:00 to 18:00Second day of conference with more sessions
EveningOptional dinner together

We all look forward to presentations about Android, the new Web Framework other news in the Xojo keynote.

Registration is open. The late bird offer available till 7th June is just 599 Euro plus VAT if needed. Attending the conference costs regularly 699 Euro plus VAT, including food and beverage in the Maritim Hotel as well as an accompanying social program.

Sessions are to be held in English. Our conference is conceived as a networking event for the Xojo community. The conference is an ideal opportunity for sharing your thoughts and your own development experience with fellow users and developers. If you like to hold a presentation, please contact us as soon as possible.

Hotel room inspection protocol

Whenever I come to a hotel room, I first need to check if everything is right. Do I have light, power and warm water? Does the toilet work, is the bed tidied and doesn't the room smell strange? Do we have good Wifi reception?

Next I check if it's silent and can be made dark at night. I really hate noise when sleeping so I routinely unplug power supply for fridges or TVs with LEDs blinking all night. Usually I need to turn off a thermostat to find sleep. Sometimes it can even happen that the room next door contains the heating or air conditioning engine which may make sound day and night.

If anything is really bad, I need to request a different room before I made myself comfortable there. What do you check?

One think I always do at the first day, is to walk down the stairs, so I know the way in case of an emergency. Depending on the hotel layout, it can even be more convenient to take the steps next to my room than walking a long way to the lifts.

When choosing a hotel, I usually check if they have a lift, a restaurant, a 24h reception for checking in & out at any time, Wifi and free parking if possible.

What criteria do you have?

Colorize JSON in FileMaker

Do you display JSON text somewhere for debugging? How about some color?

As you see, we just added a new JSON.Colorize function for our MBS FileMaker Plugin which may be useful to add color. Coming in the next plugin version...

Tip of the day: Using Label to show an image in a Xojo Web App

ThumbnailToday I had a workshop with a client for Xojo Web Apps. Check out our Events & Training page if you like to have a training or join an event.

In the training we had a problem with WebImageView control in Xojo. It always shows images at 100% size and centers them. But we wanted to load existing images hosted on a server based on the URL from a database query. So we query the database and get back URLs for images already, but they may be of a different size as the thumbnails we need. That is normally no problem as a browser can load an image and scale it down easily. We tried various hacks on the WebImageView and indeed you can overwrite the CSS styles for the view to scale down the image. Sadly Xojo resets the style to fix it when you resize the website. And the feature request from 2015 to get a scale options shows no progress (Feedback case #40994). They may have other priorities...

But Xojo got in early 2017 an improvement to allow raw html tags in text for a label. Yes, a label is now used in our web app to show images! The label gets the img tag in the open even with the right URL, e.g.:

<raw><img src="" style="max-width:100px; max-height:100px;"></raw>"

You can write this in the text property in the IDE or late assign it in an open event:

Sub Open()
  me.Text = "<raw><img src="""" style=""max-width:100px; max-height:100px;""></raw>"
End Sub

As you see we define the rectangle here with max-width and max-heigh in CSS to make sure the image is scaled proportionally down. You can add more CSS tags, e.g. to center the image.

An important property is the multiline property on the WebLabel. Only if you set Multiline = true, your image will have the right size. Otherwise it's cut to 27px height by Xojo.

Creating PDF/A in FileMaker with ZUGFeRD standard

Did you know EU directive 2014/55/EU? Starting 27th November 2020, the invoices to government over 1000 Euro must be sent electronically with structured format. So no longer printed invoices or simple PDFs, but you can send PDF in ZUGFeRD format!

Several FileMaker developers now use MBS FileMaker Plugin to create their invoices in ZUGFeRD standard. That's a data exchange format defined here in Germany, but other countries have similar formats. Basically we have a PDF in PDF/A 3b format and an embedded XML file. The PDF provides the visual and printable view of the invoice while the XML contains the same data readable for computers. 

With MBS Plugin and DynaPDF we can create such a ZUGFeRD PDF. We can either create a new file or import pages from existing PDFs. So even if you generate your invoices in FileMaker from layouts, you can convert them later. Here you see an example script for doing exactly this:

#Initialize DynaPDF if needed

If [MBS("DynaPDF.IsInitialized")  ≠  1]

Perform Script [“InitDynaPDF”]

End If

#Make new PDF environments

Set Variable [$pdf; Value:MBS("DynaPDF.New")]

#Set import flags with Prepare For PDF/A enabled

Set Variable [$r; Value:MBS( "DynaPDF.SetImportFlags"; $pdf; "ImportAll¶ImportAsPage¶PrepareForPDFA" )]

#Load PDF from container

Set Variable [$r; Value:MBS("DynaPDF.OpenPDFFromContainer"; $pdf; ZUGFeRD Invoice::Invoice Template)]

#Import all pages

Set Variable [$r; Value:MBS("DynaPDF.ImportPDFFile"; $pdf)]

#PDF/A requires a language set

Set Variable [$r; Value:MBS("DynaPDF.SetLanguage"; $pdf; "en-US")]

#PDF/A requires a structure tree

Set Variable [$r; Value:MBS("DynaPDF.CreateStructureTree"; $pdf)]

#add xml with invoice data

Set Variable [$FileHandle; Value:MBS("DynaPDF.AttachFileText"; $pdf; ZUGFeRD Invoice::Invoice XML; "UTF-8"; "ZUGFeRD-invoice.xml"; "Invoice as XML")]

Set Variable [$r; Value:MBS("DynaPDF.AssociateEmbFile"; $pdf; "Catalog"; -1; "Alternative"; $FileHandle)]

#Check if this PDF conforms to PDF/A-3b

Set Variable [$c; Value:MBS("DynaPDF.CheckConformance"; $pdf; "ZUGFeRD Basic")]

If [$c = 1]

# A RGB ICC profile must be added to the document

Set Variable [$r; Value:MBS("DynaPDF.AddOutputIntentEx"; $pdf; ZUGFeRD Invoice::RGB ICC Profile)]

Else If [$c = 2]

# A CMYK ICC profile must be added to the document

Set Variable [$r; Value:MBS("DynaPDF.AddOutputIntentEx"; $pdf; ZUGFeRD Invoice::CMYK ICC Profile)]

Else If [$c = 3]

# A Gray, RGB, or CMYK ICC profile must be added to the document 

Set Variable [$r; Value:MBS("DynaPDF.AddOutputIntentEx"; $pdf; ZUGFeRD Invoice::RGB ICC Profile)]

End If

#save to container

Set Variable [$PDFData; Value:MBS("DynaPDF.Save"; $pdf; "invoice.pdf")]

Set Field [ZUGFeRD Invoice::Output PDF; $PDFData]

Commit Records/Requests []

#cleanup memory

Set Variable [$r; Value:MBS("DynaPDF.Release"; $pdf)]

As you see we first initialize DynaPDF if it's not already done. In a new PDF environment, we import from a container the whole PDF. Of course you can import from files or just import pages from different PDFs as needed to build in memory your final PDF. Than we define language and structure tree as required for PDF/A. We attach the XML from a field in this example. The XML is just a block of text which you can generate before, e.g. by filling values into a template.

Next we check conformance with ZUGFeRD standard. If you have DynaPDF Lite license, we only check and report okay or error. If you have a DynaPDF Pro + PDF/A license, we can fix errors and convert any PDF to PDF/A here (DynaPDF Editions). Next we add the required output intent ICC color profiles. Finally we save the PDF to a container.

Please do not hestiate to contact us with your questions. We also have the same examples for Xojo.

Licensing guide for MBS Xojo Plugin

You can download and try MBS Xojo Plugins for free. Just play with examples and start development your application. A few days into development and certainly a few days before shipping to testers or clients, you should order a license. By default you order our regular plugin licenses for commercial use.

If you qualify for academic status, e.g. as a student learning to program, you can order academic licenses from us. Sometimes on a case by case decision we may include a hobbyist or unemployed user for academic status. Academic licenses do not allow commercial development, so if you receive any compensation for your development, you need a commercial license. Also we do not sell academic licenses to companies.

Speaking of a company, we expect a company to buy licenses based on the number of developers using them. The reason is obvious: If you have several developers, you should contribute more to the plugin development. Of course if you have a few developers, there may be a volume discount.

As a consultant, there are two ways:
First if you just deliver a compiled app to the client and they don't see source code with a license key, you can just get a license yourself as constant and deliver the compiled application.

But if as a consultant the client wants:
  • Source code in a repository
  • Be able to read code or make changes themselves
  • Be able to build the application themselves
  • Get a backup copy of the source code
The client will probably need a Xojo Pro license as well as their own MBS licenses and you use the client's license keys in that project, but of course not in your own projects. For your own projects, we expect you to have your own license.

A violation of the license agreement can lead to have a license key voided and not valid for future releases or update orders. And of course legal actions are possible which would require you to stop using our plugins and destroy all copies of applications using the plugins.

If you have questions, please do not hesitate to contact us.

MBS FileMaker Plugin, version 8.2pr1

New in this prerelease of version 8.1 of the MBS FileMaker Plugin: Download at or ask for being added to the dropbox shared folder.

MBS Xojo Plugins, version 18.2pr1

New in this prerelease of the 18.2 plugins: Download:
Or ask us to be added to our shared Dropbox folder.

MBS FileMaker Plugin Schulung in 2018

Wir bieten in Zusammenarbeit mit der Denkform, Brainworks und dem Verein FM Konferenz einige MBS Workshops an.

3. Mai 2018Hofheim (Taunus)
14. Juni 2018Mü
19. Juli
27. Juli 2018Zü
17. Oktober 2018Malbun, LiechtensteinAnkündigung, Anmeldung
6. Dezember 2018Hofheim (Taunus)
7. März 2019Hofheim (Taunus)

Nehmen Sie sich einen Tag Zeit sich über das MBS FileMaker Plugin und all die Funktionen zu informieren.


  • Einführung in das MBS Plugin
  • Rundgang durch ausgewählte Beispiele
  • Gemeinsames Implementieren von Plugin Funktionen in eine Datenbank:
    • Einbau von Auditing in eine Datenbank
    • Upload einer Datei mit CURL auf einen FTP Server
    • Download einer Datei
    • Ausfüllen eines Formular auf einer Webseite
    • Bilder bearbeiten
    • Eine Excel Datei laden und ausfüllen
  • Fragen und Antworten

Wenn Sie bei der Veranstaltung oder kurz danach eine Pluginlizenz bestellen möchten, erhalten Sie 50 Euro Rabatt.

Xojo Developer Meeting for Stockholm

Due to the CURL conference, we will come to Stockholm in April.
So let's organize a Xojo developer meeting! Anyone interested?

Currently we'd like to know if there is interest for a dinner meeting or more?

Please fill the survey.
We meet 16th April 2018 in Stockholm in the evening.

For a dinner, we would just meet in a restaurant and chat. If we get a bigger group, maybe get a separate room and with a screen and projector, so you an show something if you like.

If you are interested in some private consulting or training, let me know and we can arrange an appointment.

FileMaker Developer Meeting for Stockholm

Due to the CURL conference, we will come to Stockholm in April.
So let's organize a FileMaker developer meeting! Anyone interested?

Currently we'd like to know if there is interest for a dinner meeting or more?

Please fill the survey.
We meet 15th April 2018 in Stockholm in the evening.

For a dinner, we would just meet in a restaurant and chat.

If you are interested in some private consulting or training, let me know and we can arrange an appointment.

Company's 18th Birthday

1st April 2000 I found my company. Well, I registered as a business by getting my Gewerbeanmeldung (business registration) here in Germany.

That was 2 months before I finished school (Gymnasium). While alternative civilian service (Zivildienst) and my time at the university, the company run well and I didn't have to depend on my parents or student loans. Actually the company got me so busy over the years, that I spend less time at university and since 2007 this is my full time job.

I had a few clients in that time interested in development in REALbasic, a very young development environment which started two years earlier. At that time I had a website with a few freeware utilities, so people could see that I can do development. Two years later the demand for plugins got so high, that end of 2001 I started publishing my own plugins.

Thanks everyone for supporting me over the years!

PS: If you need a license (update) this weekend, use coupon code Birthday for an 18% discount.

MBS Xojo Plugins for iOS and Android

For a few months now we have been working closely with Xojo, Inc. to port all the MBS Xojo Plugins to the iOS target in Xojo with the upcoming Xojo Plugin SDK for iOS. As it turned out last week the SDK is quite portable, so with building a C++ version with Android system headers allows us to generate an Android version, too!

As of today things compile well and most of the plugin parts including DynaPDF, Encryption, ChartDirector and SQL plugins are building for both iOS and Android. This includes building ARM for 32-bit and 64-bit for both targets. For iOS we target iOS 10.4 or later, but it is yet unclear what version Xojo will require as minimum with the new plugin SDK. For Android we support all version from the last years. The market there is so fragmented, we have to go back to tasty Donuts to cover a serious amount of devices out there. But still recent Ice Cream Marshmallow and Jelly Bean Oreo versions are our main targets.

iOS is working well on device, but testing for Android requires the upcoming Xojo 2018r1.4 release, which is not yet publicly available. Testing all the functions on all the devices, all Android versions in all combinations will take some time, so we expect to buy at least 20 test devices and hire a couple of testers. Nevertheless we expect to test all 60000 documented MBS Plugin functions within the next century.

The new plugin SDK uses the newer data types, so all classes now use text instead of string and auto instead of variants. In cases where this causes trouble, we may need to overload methods with xojo.core.memoryblock to take memory directly. Although array handling and passing big data structures seems to be difficult, we may switch to pass them as JSON encoded blocks for simplicity. Performance may be catastrophic, but at least you can easily read the data in the debugger.

If you like to join to sign up for the beta, please contact us soon via our contact forms. Deadline to sign up is 1st April.

PS: This was our joke for 1st April 2018. There is no beta test as there is no plugin SDK for iOS and Android is not yet available.


May 2018
Apr 2018
Mar 2018
Feb 2018
Jan 2018
Dec 2017
Nov 2017
Oct 2017
Sep 2017
Aug 2017
Jul 2017
Jun 2017
May 2017
Apr 2017
Mar 2017
Feb 2017
Jan 2017
Dec 2016
Nov 2016
Oct 2016
Sep 2016
Aug 2016
Jul 2016
Jun 2016
May 2016
Apr 2016
Mar 2016
Feb 2016
Jan 2016
Dec 2015
Nov 2015
Oct 2015
Sep 2015
Aug 2015
Jul 2015
Jun 2015
May 2015
Apr 2015
Mar 2015
Feb 2015
Jan 2015
Dec 2014
Nov 2014
Oct 2014
Sep 2014
Aug 2014
Jul 2014
Jun 2014
May 2014
Apr 2014
Mar 2014
Feb 2014
Jan 2014
Dec 2013
Nov 2013
Oct 2013
Sep 2013
Aug 2013
Jul 2013
Jun 2013
May 2013
Apr 2013
Mar 2013
Feb 2013
Jan 2013
Dec 2012
Nov 2012
Oct 2012
Sep 2012
Aug 2012
Jul 2012
Jun 2012
May 2012
Apr 2012
Mar 2012
Feb 2012
Jan 2012
Dec 2011
Nov 2011
Oct 2011
Sep 2011
Aug 2011
Jul 2011
Jun 2011
May 2011
Apr 2011
Mar 2011
Feb 2011
Jan 2011
Dec 2010
Nov 2010
Oct 2010
Sep 2010
Aug 2010
Jul 2010
Jun 2010
May 2010
Apr 2010
Mar 2010
Feb 2010
Jan 2010
Dec 2009
Nov 2009
Oct 2009
Sep 2009
Aug 2009
Jul 2009
Apr 2009
Mar 2009
Feb 2009
Dec 2008
Nov 2008
Oct 2008
Aug 2008
May 2008
Apr 2008
Mar 2008
Feb 2008