iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more
A developer built a tablet-first digital planner for 2026 and 2027 as a single 871-page PDF, generated entirely with Python. The build wires 8,556 internal link annotations to named destinations rather than hard-coded page numbers, then reopens the finished file with pypdf and runs a verification script over it. According to the author’s write-up, published by DesignClarity on September 27, 2026, every link resolved and none were broken. Those results are self-reported: the figures come from the author’s own build and checker, and no independent reproduction is available. The write-up is still the most concrete public account of this workflow, and its method is reusable whatever library you choose.
What the planner contains
The page count, link count and file size are the figures the author reports for the finished file. They are useful as a scale reference for what a generated planner of this kind looks like.
| Item | Value reported by the author |
|---|---|
| Coverage | 2026 and 2027 |
| Total pages | 871 |
| Daily pages | 730 (365 per year) |
| Weekly spreads | 105 |
| Monthly spreads | 24 |
| Other pages | 12 by subtraction (the cover, home page and year pages, which the layout reserves) |
| Internal link annotations | 8,556 |
| Links from the six-tab bar | 5,226 (six per page across 871 pages) |
| Other internal links | 3,330 (the article does not break these down) |
| Page size | 768 × 1024 points |
| File size | 2.5 MB |
The tab-bar figure is worth a closer look. Six tabs appearing on every one of 871 pages gives exactly 5,226 annotations, so the tab bar is a fixed, predictable share of the link count. The remaining 3,330 links carry the date navigation and the week chain, and the article does not itemise them.
How the build is organised
The author separates the work into two passes: a rendering pass that draws the document, and a separate QA pass that reopens the output and inspects it. Keeping them apart matters because the checker then tests the file itself, not the code’s memory of what it intended to write.
#1 Best Overall
The build follows four steps:
- Fix the page plan before drawing. The layout reserves page indices for the cover, home page, year pages, 24 monthly spreads, 105 weekly spreads and 730 daily pages. Every later calculation depends on these indices.
- Map each date to a page. A function computes the page index for a given date from the start date, so any date link can be generated without searching the document.
- Create named destinations on each target page. Links point to names, not numbers.
- Reopen and verify the finished PDF. The QA pass runs after the file is written and checks what a reader would actually encounter.
Why the page plan comes first
A daily planner has a fixed, computable structure: 730 daily pages in a known order. If the page index of any day can be derived from the start date, the code never needs to look up where a day landed. The cost is that the plan must be decided up front; once the page order is fixed, adding a page means updating the arithmetic rather than hunting through links by hand.
Named destinations instead of page numbers
The author’s central design choice is to link to named destinations rather than raw page numbers. In the author’s words, inserting or removing a page during development then does not silently repoint hundreds of links. A page-number link keeps working only while the page order stays put; a named link keeps pointing at the page it was named after, even when the numbering shifts.
Rank #2
In ReportLab, the mechanism is a bookmark on the target and a link region on the source. The pattern below is illustrative and is not the author’s code. It shows the two calls the author names, bookmarkPage and linkAbsolute:
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →from reportlab.pdfgen import canvas
c = canvas.Canvas("planner.pdf", pagesize=(768, 1024))
# Target page: give it a stable name
c.bookmarkPage("day-2026-01-01")
c.drawString(40, 980, "Thursday, 1 January 2026")
c.showPage()
# Source page: a clickable region pointing at the named destination
c.linkAbsolute("", "day-2026-01-01", (40, 940, 120, 960))
c.showPage()
c.save()
Keep the names derived from the date, so the same date-to-page function that places a page can also generate its link target.
Rank #3
The six-tab navigation bar
The persistent tab bar has six destinations and appears on every page. Because it is drawn on each page, its links are predictable: six per page. This is the part of the planner most likely to be copied from a template, and it is also the easiest to test, because a missing tab shows up as a page-level count error.
Choosing a library for internal links
ReportLab and fpdf2 both document internal links, and both offer ways to target pages that are not yet known. The sources do not establish that either library was the one used in this build, and they do not provide a controlled comparison that picks a winner. The table compares the axes that matter when you choose.
Rank #4
| Axis | ReportLab | fpdf2 |
|---|---|---|
| Internal link mechanism | Clickable link regions pointing to named destinations, with bookmark and link methods | Internal links through cells, low-level link areas, HTML, and deferred internal destinations |
| Target page not yet known | Named destinations let you reference a page by name; the page number is not needed in the link itself | Destinations can be set later, when the target page number is not yet known |
| Licensing and product notes | The ReportLab PDF Toolkit is open source; ReportLab PLUS is a separate commercial product | Not stated in the sources reviewed |
| Evidence of use in this build | Not established | Not established |
If you are choosing a library for a planner like this one, the deciding factors are your comfort with the document-generation model and how much link logic you want in the code. The author’s pattern, named destinations resolved after rendering, works in either library. The sources do not confirm any referral or partner relationship with ReportLab.
Recommended Free Tools
The verification pass
The author’s checker reopens the built PDF with pypdf and runs five checks. The article presents them as its validation checklist, not as a formal PDF standard.
Best Value
- 🎤 Release Date: 2026.04.20
| Check | What it tests | What it catches |
|---|---|---|
| Page count | Exact total of 871 pages | Omitted or extra pages |
| Link resolution | Every link annotation resolves to a destination (8,556 checked, zero broken, per the author) | Unresolved or dangling targets |
| Semantic date spot-checks | Text extracted from a link’s destination page contains the expected date | Links that resolve but point to the wrong day |
| Week-chain integrity | The 105-week sequence stays intact across year boundaries | Broken weekly navigation at the 2026–2027 boundary |
| Static-file check | No JavaScript and no external URIs, so the file is self-contained and offline | Scripts or outbound links that the author’s constraints exclude |
The semantic date check is the one most projects skip, and it is the one that matters most for a planner. A link can resolve to a real page and still be wrong. Extracting the text of the destination page and matching the expected date tests the thing a user actually cares about.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.What a zero-broken result does and does not show
The zero-broken figure means the author’s checker found no unresolved link among the 8,556 annotations it inspected, on the file it built. It is a structural and semantic check of one PDF, produced by one build, run by the same author who wrote the code.
- It does not show that every PDF viewer will follow the links the same way. Viewer behaviour is not tested in the write-up.
- It does not show that the checker is independent of the build. The author wrote both.
- It does show that the checks themselves can be run on any generated PDF, and that a clean run is achievable with named destinations and a fixed page plan.
Tablet compatibility: intended, not verified
The author describes the PDF as tablet-first, with 768 × 1024 point pages, and says it was built to match the import expectations of GoodNotes and Notability. The article states that on-device testing was still on the author’s checklist. Treat the match with those two apps as intended, and confirm it on your own device and app version before relying on the links.
Free tools Windows power users keep installed
One-click scans. No signup required.
Practical checklist for your own build
- Plan the page order and reserve indices before drawing anything.
- Derive each date’s page index from a single function so links and pages cannot disagree.
- Give every target page a stable, date-derived name, and link to names rather than numbers.
- Run the QA pass on the finished file, not on the drawing code.
- Include at least one semantic check that reads the destination page’s text.
- Test on the actual reading app and device before you distribute the file.
The method the author describes is the reusable part. The specific counts are a single build, and the checks are the author’s own.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

