Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
c322e53
Rebrand application to Linkco PDF Editor by Al Rawabet Commercial Ser…
b-lincko Oct 8, 2026
0b7c38b
Complete Linkco PDF Editor cleanup, README recreation, screenshots, a…
b-lincko Oct 8, 2026
82d7875
Add build.py and installer.py for building Linkco PDF Editor and Wind…
b-lincko Oct 10, 2026
fc28019
Auto-install missing Rust, CMake, MSVC Build Tools, and installer dep…
b-lincko Oct 10, 2026
207d473
Fix PowerShell 5.1 ellipsis encoding in test-msi.ps1 and remove unuse…
b-lincko Oct 10, 2026
dd562e6
Add official Linkco (linkco.com.qa) brand identity, 4-node network em…
b-lincko Oct 10, 2026
986e714
Fix Windows File Explorer PDF preview handler, printer detection, and…
b-lincko Oct 10, 2026
8f6f003
Finalize Linkco PDF Editor QA, per-user/admin installer support, rele…
b-lincko Oct 10, 2026
447e0a6
Merge upstream storytold/pdfcraft v0.4.0–v0.5.0 (198 commits) into Li…
b-lincko Oct 10, 2026
9ef0f77
Update CLI version resource, signature Prop_Build, parity TOML, and W…
b-lincko Oct 10, 2026
0fc9daf
Fix mutable byte slice access on pdfcraft_render::Pixels for grayscal…
b-lincko Oct 10, 2026
227d0b8
Specify explicit turbofish type for --dpi and --page parse in pdfcraf…
b-lincko Oct 10, 2026
0b481f6
Register Windows PDF Preview Handler in HKCU/ProgIds during build and…
b-lincko Oct 10, 2026
9deb580
Windows preview: production-ready File Explorer preview handler
b-lincko Oct 10, 2026
a325352
Windows: File Explorer PDF thumbnails + any-OS C# compile check
b-lincko Oct 10, 2026
3564814
Windows uninstall: remove the Explorer registration for every user pr…
b-lincko Oct 10, 2026
ef78db3
Windows preview: stop re-registering on every start for non-ASCII ins…
b-lincko Oct 10, 2026
73e7ef7
Merge storytold/pdfcraft upstream (68e91d4..5d59060) with Linkco bran…
b-lincko Oct 10, 2026
de1009a
Merge storytold/pdfcraft upstream v0.6.0 (5d59060..bbbe600) with Link…
b-lincko Oct 11, 2026
60519fb
rustfmt: format six workspace files to pass cargo fmt --check
b-lincko Oct 11, 2026
f80ab77
Print dialog: size it like a normal window, keep the preview pixel-sharp
b-lincko Oct 11, 2026
fa64820
Linkco PDF Editor 1.0.0: network printers, network-share previews, de…
b-lincko Oct 11, 2026
d89ec6d
Windows preview: never keep loading or spinning
b-lincko Oct 11, 2026
2890818
Windows preview: diagnose and prevent 'error in the Linkco PDF Previe…
b-lincko Oct 11, 2026
b83af2c
Windows preview: own prevhost AppID, guarded COM entry points, instal…
b-lincko Oct 11, 2026
4e4d4db
Windows preview: host the handler like File Explorer on a real Window…
b-lincko Oct 11, 2026
bd884ca
test-preview-host.ps1: always write the report; compile PreviewHostTe…
b-lincko Oct 11, 2026
640adfd
preview handler workflow: don't pass an empty -Cli; keep the script's…
b-lincko Oct 11, 2026
0305f8b
test-preview-host: Fusion binding log, full CLR exception, elevated c…
b-lincko Oct 11, 2026
8867805
test-preview-host: show csc output
b-lincko Oct 11, 2026
e06e452
test-preview-host: create the work folder
b-lincko Oct 11, 2026
924e4b5
test-preview-host: CodeBase experiments
b-lincko Oct 11, 2026
e64ad70
test-preview-host: native client and RegAsm control
b-lincko Oct 11, 2026
725c157
test-preview-host: print failed binding logs
b-lincko Oct 11, 2026
074d9db
Windows preview: write CodeBase the way regasm does - .NET does not p…
b-lincko Oct 11, 2026
0a64a16
Windows preview: Diagnose() knows COM ignores per-user registrations …
b-lincko Oct 11, 2026
14c8119
test-preview-host: run the host with a filtered (medium) token via a …
b-lincko Oct 11, 2026
d9f2bcf
test-preview-host: scenario U - a real standard user registers per us…
b-lincko Oct 11, 2026
65bde71
Preview host test: explain the in-process .NET host limitation; relea…
b-lincko Oct 11, 2026
0bdb4a7
Preview host test: measure the handler window itself (PrintWindow), r…
b-lincko Oct 11, 2026
f47e641
Preview host test: PrintWindow on a worker thread with a 5 s limit; r…
b-lincko Oct 11, 2026
11d33eb
Preview host test: is the handler window thread answering, and a text…
b-lincko Oct 11, 2026
599276d
Preview host test: control run with Microsoft's PDF previewer
b-lincko Oct 11, 2026
a3e288a
Windows preview: run every call on the handler's STA thread (Standard…
b-lincko Oct 11, 2026
4ed7298
Preview host test: fail the workflow unless a standard user's per-use…
b-lincko Oct 11, 2026
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
26 changes: 26 additions & 0 deletions .github/scripts/annotate-report.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Publishes a text report as GitHub Actions annotations (which, unlike logs, the checks API returns):
# chunks First .. First+9 of about 3000 characters each, titled "<file> part N of M".
param(
[Parameter(Mandatory = $true)] [string] $Path,
[int] $First = 0,
[string] $Kind = 'notice'
)
if (-not (Test-Path -LiteralPath $Path)) { Write-Output "::$Kind title=report::$Path was not written"; exit 0 }
$text = (Get-Content -LiteralPath $Path -Raw) -replace "`r", ''
$size = 3000
$chunks = [System.Collections.Generic.List[string]]::new()
$start = 0
while ($start -lt $text.Length) {
$len = [Math]::Min($size, $text.Length - $start)
if ($start + $len -lt $text.Length) {
$cut = $text.LastIndexOf("`n", $start + $len - 1, $len)
if ($cut -gt $start) { $len = $cut - $start + 1 }
}
$chunks.Add($text.Substring($start, $len))
$start += $len
}
$name = Split-Path -Leaf $Path
for ($i = $First; $i -lt [Math]::Min($First + 10, $chunks.Count); $i++) {
$msg = $chunks[$i] -replace '%', '%25' -replace "`n", '%0A'
Write-Output "::$Kind title=$name part $($i + 1) of $($chunks.Count)::$msg"
}
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ jobs:
echo "date=$(date -u +%Y-%m-%d)"
echo "prerelease=$pre"
} >>"$GITHUB_OUTPUT"
echo "### PdfCraft v$v (\`${GITHUB_SHA::9}\`)" >>"$GITHUB_STEP_SUMMARY"
echo "### Linkco PDF Editor v$v (\`${GITHUB_SHA::9}\`)" >>"$GITHUB_STEP_SUMMARY"

macos:
name: macOS universal
Expand Down Expand Up @@ -488,7 +488,7 @@ jobs:
working-directory: artifacts
run: |
tag="v$VERSION"
title="PdfCraft v$VERSION"
title="Linkco PDF Editor v$VERSION"
pre=()
if [ "$PRERELEASE" = true ]; then pre=(--prerelease); fi
if draft="$(gh release view "$tag" --json isDraft --jq .isDraft 2>/dev/null)"; then
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/windows-arm64.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,19 +83,19 @@ jobs:
$p = Start-Process msiexec.exe -ArgumentList '/i', "`"$msi`"", '/qn', '/l*v', 'install.log' -Wait -PassThru
if ($p.ExitCode -ne 0) { Get-Content install.log -Tail 60; throw "msiexec /i exited $($p.ExitCode)" }
$shortcuts = @(
(Join-Path ([Environment]::GetFolderPath('CommonPrograms')) 'PdfCraft.lnk'),
(Join-Path ([Environment]::GetFolderPath('CommonDesktopDirectory')) 'PdfCraft.lnk')
(Join-Path ([Environment]::GetFolderPath('CommonPrograms')) 'Linkco PDF Editor.lnk'),
(Join-Path ([Environment]::GetFolderPath('CommonDesktopDirectory')) 'Linkco PDF Editor.lnk')
)
# Plain shortcuts to the program (#143), not advertised ones, so TargetPath is the exe.
$exePath = Join-Path $env:ProgramFiles 'PdfCraft\pdfcraft.exe'
$exePath = Join-Path $env:ProgramFiles 'Linkco\Linkco PDF Editor\pdfcraft.exe'
$wsh = New-Object -ComObject WScript.Shell
foreach ($shortcut in $shortcuts) {
if (-not (Test-Path -LiteralPath $shortcut)) { throw "installer did not create $shortcut" }
$target = $wsh.CreateShortcut($shortcut).TargetPath
if ($target -ne $exePath) { throw "$shortcut points to '$target', not $exePath" }
Write-Output "ok $shortcut -> $target"
}
$dir = Join-Path $env:ProgramFiles 'PdfCraft'
$dir = Join-Path $env:ProgramFiles 'Linkco\Linkco PDF Editor'
foreach ($exe in 'pdfcraft.exe', 'pdfcraft-cli.exe') {
$path = Join-Path $dir $exe
if (-not (Test-Path $path)) { Get-ChildItem -Recurse $env:ProgramFiles -Filter $exe | Select-Object -First 3; throw "$exe not installed in $dir" }
Expand Down
63 changes: 63 additions & 0 deletions .github/workflows/windows-preview-handler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Windows preview handler

# Hosts the File Explorer PDF preview handler on a real Windows machine the way Explorer does
# (packaging/windows/test-preview-host.ps1) and publishes the step-by-step report as annotations.

on:
pull_request:
paths:
- packaging/windows/**
- apps/pdfcraft-cli/**
- .github/workflows/windows-preview-handler.yml
workflow_dispatch:

concurrency:
group: preview-handler-${{ github.ref }}
cancel-in-progress: true

jobs:
host:
name: preview handler (${{ matrix.engine }})
runs-on: windows-latest
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
engine: [no engine, pdfcraft-cli]
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
if: matrix.engine == 'pdfcraft-cli'

- uses: Swatinem/rust-cache@v2
if: matrix.engine == 'pdfcraft-cli'

- name: Build pdfcraft-cli
if: matrix.engine == 'pdfcraft-cli'
run: cargo build --release -p pdfcraft-cli

- name: Host the preview handler like File Explorer
shell: powershell
run: |
$testArgs = @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', 'packaging\windows\test-preview-host.ps1', '-Report', 'preview-host-report.txt')
if ('${{ matrix.engine }}' -eq 'pdfcraft-cli') { $testArgs += @('-Cli', 'target\release\pdfcraft-cli.exe') }
$ErrorActionPreference = 'Continue'
& powershell @testArgs *>&1 | ForEach-Object { "$_" } | Tee-Object -FilePath host-output.txt
$code = $LASTEXITCODE
if (-not (Test-Path preview-host-report.txt)) { Copy-Item host-output.txt preview-host-report.txt }
exit $code

# Annotations are readable through the API; at most 10 per type and step, so split the report.
- name: Report (1)
if: always()
shell: pwsh
run: ./.github/scripts/annotate-report.ps1 -Path preview-host-report.txt -First 0 -Kind notice
- name: Report (2)
if: always()
shell: pwsh
run: ./.github/scripts/annotate-report.ps1 -Path preview-host-report.txt -First 10 -Kind notice
- name: Report (3)
if: always()
shell: pwsh
run: ./.github/scripts/annotate-report.ps1 -Path preview-host-report.txt -First 20 -Kind notice
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@ plan/
/assets/models
# A craft-fonts checkout used as the optional CRAFT_FONTS_DIR build input (CI and releases put it here).
/craft-fonts

__pycache__/
*.pyc
Loading