Files
CGW-Printing/TODO.md
T
2026-06-11 10:22:45 -05:00

9.2 KiB
Raw Blame History

LAAPC Print Service - Remaining Work

Completed

  • Core service architecture (queue, IPC, file monitoring)
  • CLI with self-installation capability
  • Basic printing with tray control
  • PDF output for testing
  • System tray application with status display
  • Configuration dialog for printer/tray assignments
  • Fixed System.Drawing.Common platform compatibility

🅿️ Parking Lot - Future Enhancements

Configuration Dialog Issues (Non-Critical)

  • Printer resets on add page: When adding a new page to a document type, the printer dropdown resets to the first printer in the list if the configuration hasn't been saved yet

    • Expected: Should remember previous page's printer selection or default intelligently
    • Workaround: Save after configuring each page
  • Save closes dialog: Clicking Save closes the configuration dialog, forcing users to reopen it to continue editing

    • Expected: Save button should persist changes but keep dialog open
    • Suggested: Add "Save & Close" and "Save" as separate buttons, or just make Save not close the dialog

Printing Enhancements

  • Skip blank pages: Add option to skip printing pages with no content
    • Use case: Save paper/toner when certain pages in a document are empty
    • Implementation: Check if page has content before setting HasMorePages = true
    • Could be a global setting or per-document-type configuration

🔲 Immediate Testing

Test Configuration Dialog

  • Right-click tray icon → "Configure Printers..."
  • Create new document type
  • Add pages with printer/tray assignments
  • Save configuration (test both local and global)
  • Verify printer-config.json file created correctly
  • Test loading existing configuration

🔨 High Priority - Service Integration

1. Integrate printer-config.json into PrintService

Goal: Service should read printer-config.json instead of appsettings.json

Files to modify:

  • PrintService/Services/ConfigurationService.cs (CREATE NEW)

    • Load printer-config.json from C:\ProgramData\LAAPC\ (global) and %LOCALAPPDATA%\LAAPC\ (local)
    • Merge local over global (same logic as tray app)
    • Return PrinterConfiguration object
  • PrintService/Models/PrinterConfig.cs (COPY from PrintServiceTray)

    • Copy the new config models into PrintService project
  • PrintService/Worker.cs (MODIFY)

    • Replace DocumentConfig loading with PrinterConfiguration loading
    • Pass PageConfig[] to DocumentProcessor
  • PrintService/Services/DocumentProcessor.cs (MODIFY - or DELETE if not needed)

    • Update to work with new PageConfig format
    • May need to refactor logic
  • PrintService/Services/PrinterService.cs (MODIFY)

    • Update Print() method signature to accept PageConfig[]
    • Print each page to correct printer/tray based on PageConfig

Notes:

  • Keep appsettings.json for service-level settings (queue path, retry counts, etc.)
  • printer-config.json ONLY for document type → printer/tray mappings
  • Support missing config gracefully (log warning, skip job)

🔨 High Priority - Page Duplication Pattern

2. Implement Multi-Tray Page Duplication

User Requirement: Print EACH original page to ALL trays in sequence

Current Behavior:

TraySequence: [3,4,1,2]
Original document: 4 pages
Output: 4 pages (page 1→tray3, page 2→tray4, page 3→tray1, page 4→tray2)

New Behavior:

TraySequence: [3,4,1,2]
Original document: 4 pages
Output: 16 pages
  Page 1 → Tray 3
  Page 1 → Tray 4
  Page 1 → Tray 1
  Page 1 → Tray 2
  Page 2 → Tray 3
  Page 2 → Tray 4
  Page 2 → Tray 1
  Page 2 → Tray 2
  ... (and so on)

Files to modify:

  • PrintService/Services/PrinterService.cs
    • Modify PrintPage event handler
    • Add page duplication logic
    • Track: originalPageIndex, trayIndex, currentOutputPage
    • For each original page, cycle through all trays before moving to next page

Algorithm:

int originalPageIndex = 0;
int trayIndex = 0;
int totalOriginalPages = CalculateTotalPages(lines);
bool hasMorePages = true;

PrintPage event:
  1. Render lines for originalPageIndex
  2. Set tray to pageConfigs[originalPageIndex].TrayNumber
  3. Increment trayIndex
  4. If trayIndex >= trays.Length:
       trayIndex = 0
       originalPageIndex++
  5. hasMorePages = (originalPageIndex < totalOriginalPages)

🔨 Medium Priority - Content Modifications

3. Port Rust Content Transformation Logic

Reference: RUST/cgwprint/src/background.rs and RUST/cgwprint/data/printers.json

DO NOT START UNTIL: Tray config and page duplication are complete and tested

New config fields needed in PageConfig:

{
  "PageNumber": 1,
  "PrinterName": "Brother HL-L6415DW",
  "TrayNumber": 3,
  "TrayLabel": "Pink",
  
  // NEW FIELDS:
  "RemoveOrderNumber": false,
  "RemoveOrderNumberLabel": false,
  "IndentOrderNumber": 0,
  "RowShift": {
    "5": -2,    // Move line 5 up by 2 positions
    "12": 1     // Move line 12 down by 1 position
  },
  "RowTrim": {
    "3": { "Start": 0, "End": 40 },  // Keep only first 40 chars of line 3
    "7": { "Start": 10, "End": 50 }  // Keep chars 10-50 of line 7
  },
  "BoldFont": "Courier New Bold",
  "NormalFont": "Courier New"
}

Processing steps:

  1. Parse hex escapes (\xHH → bytes)
  2. Split on form feed (\x0C) into pages
  3. Font replacement (ESC+w+1 → bold, ESC+w+0 → normal)
  4. Order number manipulation (remove/indent based on config)
  5. Apply row_shift (vertical position adjustments)
  6. Apply row_trim (substring extraction)
  7. Add PCL/PJL header/footer wrapping

Files to modify:

  • PrintService/Models/PageConfig.cs - Add new properties
  • PrintService/Services/DocumentProcessor.cs - Add content transformation
  • PrintService/Services/ContentTransformer.cs (CREATE NEW)
    • ParseHexEscapes()
    • SplitPages()
    • ProcessFontCodes()
    • ManipulateOrderNumber()
    • ApplyRowShift()
    • ApplyRowTrim()
    • WrapWithPclHeaders()

Location-specific variations:

  • "there are 3 locations where this app is used and each has a slight different layout"
  • Use document type naming to differentiate: "Invoice_Location1", "Invoice_Location2", etc.
  • Or add "Location" field to config and filter by it

📋 Testing Checklist

Before Production Deployment

  • Test service installation on clean 32-bit Windows 10 machine
  • Test CLI from Harbor/Clipper integration
  • Test rapid concurrent print requests (race condition prevention)
  • Test multi-tray printing on Brother HL-L6415DW
  • Test configuration changes without service restart
  • Test queue persistence (stop service mid-job, restart, verify resume)
  • Test error handling (printer offline, invalid tray, etc.)
  • Test tray app startup on Windows boot (add to Startup folder?)
  • Verify file cleanup after successful print
  • Verify error folder gets populated on failures

🎯 Future Enhancements (Low Priority)

  • Add logging to file for tray app (currently only service logs)
  • Add "Start/Stop Service" option in tray menu
  • Add "View Logs" option in tray menu
  • Add notification sound for completed jobs
  • Add job history view (last 50 jobs)
  • Support per-page margins configuration
  • Support custom font sizes per document type
  • Add web UI for remote monitoring

📝 Important Notes

Platform Compatibility

  • System.Drawing.Common: Requires RuntimeHostConfigurationOption in .csproj
  • Remove explicit package reference to avoid startup errors
  • WinForms apps automatically include System.Drawing on Windows

Configuration Locations

  • Global: C:\ProgramData\LAAPC\printer-config.json (shared, requires admin)
  • Local: %LOCALAPPDATA%\LAAPC\printer-config.json (per-user, no admin)
  • Merge strategy: Local settings override global settings by document type

Print Service Config

  • Service currently uses: appsettings.json (old format with DocumentConfig)
  • Service needs to migrate to: printer-config.json (new format with PageConfig[])
  • Keep appsettings.json for non-printer settings (QueuePath, MaxRetries, etc.)

Page Duplication Logic

  • Current: One page per tray (simple mapping)
  • Required: All pages to all trays (page duplication with tray cycling)
  • Example: 4-page invoice × 5 trays = 20 physical pages printed
  • Reason: Simulates carbon copy paper (each page needs copy in each color)

Content Modifications

  • Do LAST (most complex, least critical for initial deployment)
  • Three locations have slightly different requirements
  • May need per-location configuration or document type naming convention
  • PCL/PJL wrapping may only apply to specific printers

Git Status

  • Last commit: cce9248
  • RUST/ folder excluded from version control
  • Remember to commit after each major milestone

🚀 Next Steps (In Order)

  1. RIGHT NOW: Test configuration dialog in tray app
  2. Integrate printer-config.json into service
  3. Implement page duplication pattern
  4. Test on production hardware (Brother HL-L6415DW)
  5. Deploy to first location
  6. Gather feedback
  7. Port content modifications from Rust
  8. Deploy to remaining two locations