I had to do this yesterday and found a great solution for Adobe Illustrator. I’m transcribing this from memory, so please correct me if I get the details wrong.
- Create a small circle
- Give it a stroke, but not a fill
- Select the circle and create a scatter brush from it
- Set the spacing to something like 400%
- Apply it to the path
- Edit the spacing to suit (e.g. to make it start and end with a hole, bump it in 1% increments)
- Expand appearance
- You will have both the path you want and a second path that has no stroke and no fill behind it. (?) Select a circle, send to back. Click on it again to select the invisible path that was behind it. Select…Same Fill And Stroke, then delete to be rid of them all.
Print!