diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml new file mode 100644 index 0000000..18646e6 --- /dev/null +++ b/.github/workflows/generate-pdf.yml @@ -0,0 +1,37 @@ +name: Generate PDF Labels + +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + workflow_dispatch: + +jobs: + generate-pdf: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install + + - name: Install Playwright Chromium + run: npx playwright install chromium + + - name: Generate PDF + run: npm run generate-pdf + + - name: Upload PDF artifact + uses: actions/upload-artifact@v4 + with: + name: asn-labels-pdf + path: asn-labels.pdf + retention-days: 30 diff --git a/package.json b/package.json new file mode 100644 index 0000000..6531df0 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "asn-qr-code-label-generator", + "version": "1.0.0", + "description": "QR code label generator for Paperless-ngx Archive Serial Numbers", + "private": true, + "scripts": { + "generate-pdf": "node scripts/generate-pdf.js" + }, + "devDependencies": { + "playwright": "^1.49.0" + } +} diff --git a/scripts/generate-pdf.js b/scripts/generate-pdf.js new file mode 100644 index 0000000..56d4220 --- /dev/null +++ b/scripts/generate-pdf.js @@ -0,0 +1,41 @@ +const { chromium } = require('playwright'); +const path = require('path'); + +async function generatePDF() { + const browser = await chromium.launch(); + const context = await browser.newContext(); + const page = await context.newPage(); + + // Load the local HTML file + const htmlPath = path.join(__dirname, '..', 'index.html'); + await page.goto(`file://${htmlPath}`); + + // Wait for AlpineJS to initialize and generate labels + await page.waitForFunction(() => { + const labels = document.querySelectorAll('ol li'); + return labels.length === 189; // 7 columns x 27 rows + }); + + // Wait for all QR code images to load + await page.waitForFunction(() => { + const images = document.querySelectorAll('ol li img'); + return Array.from(images).every(img => img.complete && img.naturalHeight > 0); + }, { timeout: 60000 }); + + // Generate PDF with A4 format and print media + await page.pdf({ + path: 'asn-labels.pdf', + format: 'A4', + printBackground: true, + margin: { top: 0, right: 0, bottom: 0, left: 0 } + }); + + console.log('PDF generated successfully: asn-labels.pdf'); + + await browser.close(); +} + +generatePDF().catch(err => { + console.error('Error generating PDF:', err); + process.exit(1); +});