Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,17 @@ examples/aspnet/*.md text eol=lf
examples/aspnet/LICENSE text eol=lf
examples/aspnet/Assets/*.html text eol=lf
examples/aspnet/Assets/*.css text eol=lf
examples/dotnet-accessibility/*.cs text eol=lf
examples/dotnet-accessibility/*.csproj text eol=lf
examples/dotnet-accessibility/*.json text eol=lf
examples/dotnet-accessibility/*.md text eol=lf
examples/dotnet-accessibility/LICENSE text eol=lf
examples/dotnet-accessibility/Assets/*.html text eol=lf
examples/dotnet-accessibility/Assets/*.css text eol=lf
examples/dotnet-accessibility/Assets/*.svg text eol=lf
examples/dotnet-accessibility/Assets/*-OFL.txt -text whitespace=-blank-at-eol
docs/assets/dotnet-accessibility/** -text whitespace=cr-at-eol
docs/assets/dotnet-accessibility/*.pdf binary
docs/assets/playground/LICENSES.txt text eol=lf whitespace=-blank-at-eol
docs/assets/pdf-regression/*.json text eol=lf
# Evidence downloads and their manifests are verified by byte hashes.
Expand Down
34 changes: 33 additions & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,38 @@ jobs:
output/aspnet-verification/*.log
output/aspnet-verification/preview/*
retention-days: 14
tagged-notice:
name: C# tagged notice (${{ matrix.os }})
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v6
with:
python-version: '3.12'
- uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
- run: python -m pip install pypdf==6.19.0
- name: Verify the downloaded ZIP and isolated published tagged notice
run: python tools/verify_dotnet_accessibility.py
- uses: actions/upload-artifact@v4
if: always()
with:
name: dotnet-accessibility-verification-${{ matrix.os }}
path: |
output/dotnet-accessibility-verification/verification.json
output/dotnet-accessibility-verification/*.txt
output/dotnet-accessibility-verification/ua1/
output/dotnet-accessibility-verification/ua2/
retention-days: 14
build:
runs-on: ubuntu-latest
steps:
Expand Down Expand Up @@ -305,7 +337,7 @@ jobs:
path: site
deploy:
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
needs: [build, aspnet, chinese, markdown]
needs: [build, aspnet, chinese, markdown, tagged-notice]
runs-on: ubuntu-latest
permissions:
pages: write
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ examples/dotnet/obj/
examples/aspnet/bin/
examples/aspnet/obj/
examples/aspnet/output/
examples/dotnet-accessibility/bin/
examples/dotnet-accessibility/obj/
examples/dotnet-accessibility/output/

docs/assets/browser-demo/
docs/assets/react-demo/
Expand Down
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,19 @@ pages, checks their PDF text and page counts, and exercises the documented proje
commands. CI retains the PDFs, previews, and structured report. Older showcase,
playground, and tutorial downloads keep their own verified release pins.

The tagged C# notice lives in `examples/dotnet-accessibility`. When updating it,
restore its lockfile from public NuGet, render both `ua1` and `ua2`, and review
the final PDFs and native preview before replacing `docs/assets/dotnet-accessibility`.
Run `python tools/build_dotnet_accessibility_starter.py` to rebuild the stable
ZIP and source manifest, then `python tools/verify_dotnet_accessibility.py`.
The verifier needs the .NET 10 SDK, Java 21 or later, and `pypdf==6.19.0`; it
downloads a checksum-pinned veraPDF 1.30.2 validator. These are maintainer checks,
not dependencies of the console application. Pass `--refresh-evidence` when
updating the downloadable reports; it writes `verification.json`,
`verapdf-ua1.json` and `verapdf-ua2.json` only after rendering and validation pass.
CI verifies the actual ZIP in isolated published applications on Windows and
Linux and checks that the retained reports still describe those specimens.

When changing the canonical domain, update `site_url`, `docs/robots.txt`, and this README, configure GitHub Pages, and verify DNS, HTTPS, sitemap URLs, and redirects. Keep the GitHub Pages URL until the custom domain is working.

Fullbleed is MIT licensed. Do not publish unsupported performance comparisons, standards conformance claims, or stale licensing statements. Retain old page URLs through the redirect map when consolidating reference material.
Expand Down
4 changes: 4 additions & 0 deletions docs/accessibility/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ description: Author semantic documents, generate tagged PDF output, and retain a

Fullbleed provides semantic Python components, tagged PDF output profiles, inspection, and accessibility verification tools. Start with clear headings, logical reading order, meaningful table headers, document language, and appropriate alternative text.

For .NET, use the [editable C# tagged-notice starter](../guides/csharp-tagged-pdf.md).
It includes styled HTML/CSS, explicit fonts, a scoped table and a captioned
illustration, with PDF/UA-1 and PDF/UA-2 output and retained verification.

## Try the checked example

[Open the service-notice PDF](../assets/examples/accessible.pdf) · [View HTML](../assets/examples/accessible.html) · [View CSS](../assets/examples/accessible.css)
Expand Down
Binary file added docs/assets/dotnet-accessibility/notice-ua1.pdf
Binary file not shown.
Binary file added docs/assets/dotnet-accessibility/notice-ua2.pdf
Binary file not shown.
Binary file added docs/assets/dotnet-accessibility/notice.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/dotnet-accessibility/project.zip
Binary file not shown.
79 changes: 79 additions & 0 deletions docs/assets/dotnet-accessibility/source.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
{
"source": "https://github.com/fullbleed-engine/docs/tree/main/examples/dotnet-accessibility",
"framework": "net10.0",
"package": "FullBleed.DotNet",
"packageVersion": "0.1.7",
"projectZipSha256": "bff5801de233ea3bca593a0656decd739373ec51ab5e9c1f2526d0d67eae8f02",
"files": [
{
"path": "AccessibleNotice.csproj",
"bytes": 563,
"sha256": "7d9a7a9d1851786c8db87013078cfffb49b1f55928f88dd9d3d8b9a4d9508e3b"
},
{
"path": "Assets/DMSerifDisplay-OFL.txt",
"bytes": 4605,
"sha256": "a3e5cdd67d4571dd0a24fcc968de0efde7ae97ef752daf0906e4767619dd7231"
},
{
"path": "Assets/DMSerifDisplay-Regular.ttf",
"bytes": 76580,
"sha256": "8cc3643535edf039aa5d95440a8542735e9197e4f4b8d9303e980fefbf5ab616"
},
{
"path": "Assets/Inter-OFL.txt",
"bytes": 4377,
"sha256": "5b9321a4298cfeb6b34354164a1c3afc3db114569984c502b9b35d988fd58c57"
},
{
"path": "Assets/Inter-Variable.ttf",
"bytes": 876576,
"sha256": "29160a80ff49ddcab2c97711247e08b1fab27a484a329ce8b813d820dc559031"
},
{
"path": "Assets/notice.css",
"bytes": 1504,
"sha256": "3994f4ca6c1f8539bed60fda207980a9646ad3c5a111f647da8b742cb7158495"
},
{
"path": "Assets/notice.html",
"bytes": 1957,
"sha256": "e4426b77b847f02394c66a97a756878e12d1b9ec27affb4716c36f4b9c8ef7b9"
},
{
"path": "Assets/route.svg",
"bytes": 596,
"sha256": "09c4e6146359bc1c68cec600e2ef649ac6f4caf9762366cd19e9d7ad7b1fbea7"
},
{
"path": "LICENSE",
"bytes": 1079,
"sha256": "36a2115938f6e68cf0d87eccff7a6a3e57c17017e909cbd640d51aff1fa0c5a9"
},
{
"path": "Program.cs",
"bytes": 2955,
"sha256": "d3e996ccfcdb81f9808f3a4fa208dae570af53a6775a00297eb68d5f7fc944e3"
},
{
"path": "README.md",
"bytes": 1958,
"sha256": "e175125529180af2457b6ba97111c62e32bfd7a48c401d822dfbaacbfbbd9f8c"
},
{
"path": "global.json",
"bytes": 111,
"sha256": "20c93ca7812d0a9825eef71217156f95ab2f4fe5aadfeb22ebc1c24b630018d3"
},
{
"path": "packages.lock.json",
"bytes": 306,
"sha256": "612f1930c91b980f19cd58755526d4a78f67117163d761e4ff683817e1eef4af"
}
],
"outputs": {
"notice-ua1.pdf": "2aab47bbb10a7ff165c62c3d663e1638dc0abd37982e7bfa9501cdc7cdb091d8",
"notice-ua2.pdf": "20df3d1684cfc9dea142d1bf36cfb20790c9f33931979e420a4fe61c0f217fe1",
"notice.png": "445e9b5c417399eb0ada4de06ea10fad89126f2fe8d937c64f40dd57e2c8c87b"
}
}
63 changes: 63 additions & 0 deletions docs/assets/dotnet-accessibility/verapdf-ua1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{"report":{"buildInformation":{"releaseDetails":[{
"id" : "core",
"version" : "1.30.2",
"buildDate" : 1780501380000
},{
"id" : "validation-model",
"version" : "1.30.2",
"buildDate" : 1780501560000
},{
"id" : "apps",
"version" : "1.30.2",
"buildDate" : 1780502100000
}]},"jobs":[{"itemDetails":{
"name" : "C:\\dev\\workbench\\fullbleed-official\\target\\growth\\dotnet-accessibility-20261007\\docs-final\\starter-verification\\ua1\\notice.pdf",
"size" : 115082
},"validationResult":[ {
"details" : {
"passedRules" : 106,
"failedRules" : 0,
"passedChecks" : 3348,
"failedChecks" : 0,
"ruleSummaries" : [ ]
},
"jobEndStatus" : "normal",
"profileName" : "PDF/UA-1 validation profile",
"statement" : "PDF file is compliant with Validation Profile requirements.",
"compliant" : true
} ],"processingTime":{
"start" : 1791379588643,
"finish" : 1791379590061,
"difference" : 1418,
"duration" : "00:00:01.418"
}}],"batchSummary":{
"duration" : {
"start" : 1791379588399,
"finish" : 1791379590135,
"difference" : 1736,
"duration" : "00:00:01.736"
},
"totalJobs" : 1,
"outOfMemory" : 0,
"veraExceptions" : 0,
"failedEncryptedJobs" : 0,
"validationSummary" : {
"nonCompliantPdfaCount" : 0,
"failedJobCount" : 0,
"compliantPdfaCount" : 1,
"totalJobCount" : 1,
"successfulJobCount" : 1
},
"failedParsingJobs" : 0,
"repairSummary" : {
"failedJobCount" : 0,
"totalJobCount" : 0,
"successfulJobCount" : 0
},
"featuresSummary" : {
"failedJobCount" : 0,
"totalJobCount" : 0,
"successfulJobCount" : 0
},
"multiJob" : false
}}}
63 changes: 63 additions & 0 deletions docs/assets/dotnet-accessibility/verapdf-ua2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{"report":{"buildInformation":{"releaseDetails":[{
"id" : "core",
"version" : "1.30.2",
"buildDate" : 1780501380000
},{
"id" : "validation-model",
"version" : "1.30.2",
"buildDate" : 1780501560000
},{
"id" : "apps",
"version" : "1.30.2",
"buildDate" : 1780502100000
}]},"jobs":[{"itemDetails":{
"name" : "C:\\dev\\workbench\\fullbleed-official\\target\\growth\\dotnet-accessibility-20261007\\docs-final\\starter-verification\\ua2\\notice.pdf",
"size" : 115301
},"validationResult":[ {
"details" : {
"passedRules" : 1727,
"failedRules" : 0,
"passedChecks" : 5068,
"failedChecks" : 0,
"ruleSummaries" : [ ]
},
"jobEndStatus" : "normal",
"profileName" : "PDF/UA-2 + Tagged PDF validation profile",
"statement" : "PDF file is compliant with Validation Profile requirements.",
"compliant" : true
} ],"processingTime":{
"start" : 1791379595808,
"finish" : 1791379597275,
"difference" : 1467,
"duration" : "00:00:01.467"
}}],"batchSummary":{
"duration" : {
"start" : 1791379595574,
"finish" : 1791379597365,
"difference" : 1791,
"duration" : "00:00:01.791"
},
"totalJobs" : 1,
"outOfMemory" : 0,
"veraExceptions" : 0,
"multiJob" : false,
"featuresSummary" : {
"totalJobCount" : 0,
"failedJobCount" : 0,
"successfulJobCount" : 0
},
"repairSummary" : {
"totalJobCount" : 0,
"failedJobCount" : 0,
"successfulJobCount" : 0
},
"validationSummary" : {
"totalJobCount" : 1,
"compliantPdfaCount" : 1,
"failedJobCount" : 0,
"nonCompliantPdfaCount" : 0,
"successfulJobCount" : 1
},
"failedParsingJobs" : 0,
"failedEncryptedJobs" : 0
}}}
63 changes: 63 additions & 0 deletions docs/assets/dotnet-accessibility/verification.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{
"ok": true,
"checkedAt": "2026-10-07T13:26:37.436229+00:00",
"sdk": "10.0.401",
"package": "FullBleed.DotNet",
"packageVersion": "0.1.7",
"engineVersion": "2.5.13",
"packageSha256": "4334469bb70fe5896c479f9bb68025cd0fefafa280429dd367055f1818ecd1ee",
"projectZipSha256": "bff5801de233ea3bca593a0656decd739373ec51ab5e9c1f2526d0d67eae8f02",
"freshNugetCache": true,
"nativeLibraryOverride": false,
"isolatedPublishedApp": true,
"commands": [
"sdk",
"restore",
"publish",
"ua1",
"ua1-repeat",
"ua2",
"ua2-repeat"
],
"profiles": [
{
"profile": "ua1",
"pdfSha256": "2aab47bbb10a7ff165c62c3d663e1638dc0abd37982e7bfa9501cdc7cdb091d8",
"previewSha256": "445e9b5c417399eb0ada4de06ea10fad89126f2fe8d937c64f40dd57e2c8c87b",
"textSha256": "b6416f0d3b3bec1137e6d3b4bac864e1c3a3b1289283bcbd43d4cf908e8aa9da",
"repeatPdfBytesIdentical": true,
"veraPDF": {
"version": "1.30.2",
"profile": "ua1",
"failedChecks": 0,
"installerUrl": "https://software.verapdf.org/rel/1.30/verapdf-greenfield-1.30.2-installer.zip",
"installerSha256": "6cc6341cb1af644044054b81f00a6590a7918abb18f762243de115258bcad838"
}
},
{
"profile": "ua2",
"pdfSha256": "20df3d1684cfc9dea142d1bf36cfb20790c9f33931979e420a4fe61c0f217fe1",
"previewSha256": "445e9b5c417399eb0ada4de06ea10fad89126f2fe8d937c64f40dd57e2c8c87b",
"textSha256": "b6416f0d3b3bec1137e6d3b4bac864e1c3a3b1289283bcbd43d4cf908e8aa9da",
"repeatPdfBytesIdentical": true,
"veraPDF": {
"version": "1.30.2",
"profile": "ua2",
"failedChecks": 0,
"installerUrl": "https://software.verapdf.org/rel/1.30/verapdf-greenfield-1.30.2-installer.zip",
"installerSha256": "6cc6341cb1af644044054b81f00a6590a7918abb18f762243de115258bcad838"
}
}
],
"runtimeIdentity": {
"runtime": "10.0.12",
"framework": ".NETCoreApp,Version=v10.0",
"rid": "win-x64",
"nativeLibrarySha256": "7252e7add0c8639992bff4d6d01842a0584b68d57db0432e456054138eec41a9"
},
"scope": "Downloaded starter, retained final PDFs and machine-verifiable PDF/UA checks. No blanket accessibility or assistive-technology claim.",
"validatorReports": {
"verapdf-ua1.json": "a7a8007e02693e46ab9d10214a90b0b58d7a4d79469008f341805c84f7e17723",
"verapdf-ua2.json": "2d56867945fb3394152ee45be9edae80bb2f3c159748d5e6dcacce2c980cd59c"
}
}
2 changes: 2 additions & 0 deletions docs/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ Start with the [invoice guide](guides/invoices.md), or
[serve an invoice from FastAPI, Flask, or Django](guides/web-frameworks.md).
The Python starter also includes a [tested Docker image](guides/python-docker.md).
For C# web applications, try the [ASP.NET Core download starter](guides/aspnet-pdf.md).
For a tagged document, use the [editable C# library notice](guides/csharp-tagged-pdf.md)
with PDF/UA profiles, embedded fonts and retained validation reports.

</div>
</div>
Expand Down
2 changes: 2 additions & 0 deletions docs/getting-started/dotnet.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ document and retain the relevant verification evidence before making an
accessibility, archival, or print-standard claim.

For a web application, download the [ASP.NET Core PDF starter](../guides/aspnet-pdf.md).
For tagged output, use the [C# library-notice starter](../guides/csharp-tagged-pdf.md)
with PDF/UA profiles and independent validation.
It includes a download page, styled invoice, private responses, and checks against
the published application artifact.

Expand Down
Loading
Loading