This commit is contained in:
nusquama
2025-11-12 18:41:51 +01:00
parent 8e912596ac
commit 51e8181499
@@ -0,0 +1,208 @@
Convert HTML to PDF and Compress Files with CustomJS API
https://n8nworkflows.xyz/workflows/convert-html-to-pdf-and-compress-files-with-customjs-api-3869
# Convert HTML to PDF and Compress Files with CustomJS API
### 1. Workflow Overview
This workflow demonstrates how to convert HTML content into a PDF file, compress the resulting PDF, and handle PDF files accessed via URLs by compressing them as well. It leverages the PDF Toolkit nodes from the CustomJS API, requiring a self-hosted n8n instance and a valid CustomJS API key.
The workflow is logically split into three main blocks:
- **1.1 Input Trigger and HTML to PDF Conversion:** Starts the workflow manually, converts hardcoded HTML content into a PDF using the CustomJS HTML to PDF node.
- **1.2 PDF File Compression (from HTML Conversion):** Compresses the PDF generated by the HTML to PDF conversion.
- **1.3 PDF Compression from URL:** Accepts a PDF URL, fetches the PDF, and compresses it, enabling handling of existing PDF files from external sources.
---
### 2. Block-by-Block Analysis
#### 2.1 Input Trigger and HTML to PDF Conversion
- **Overview:**
This block initiates the workflow manually and converts a static HTML snippet into a PDF document.
- **Nodes Involved:**
- When clicking Test workflow (Manual Trigger)
- HTML to PDF (CustomJS HTML to PDF node)
- **Node Details:**
- **When clicking Test workflow**
- Type: Manual Trigger
- Role: Starts workflow on user action.
- Configuration: Default manual trigger, no parameters required.
- Inputs: None (start node)
- Outputs: Connected to both HTML to PDF and Set PDF URL nodes.
- Edge Cases: None expected; user must manually trigger workflow.
- **HTML to PDF**
- Type: CustomJS PDF Toolkit - HTML to PDF node
- Role: Converts given HTML string into a PDF binary.
- Configuration:
- `htmlInput` parameter is set statically to `<h1>Hello World</h1>`.
- Uses CustomJS API credentials for authentication.
- Inputs: Receives trigger from manual node.
- Outputs: Sends generated PDF binary data to Compress PDF file node.
- Edge Cases:
- API authentication failure if API key invalid or missing.
- HTML input too large or malformed could cause conversion errors or timeouts.
- Version Requirements: CustomJS PDF Toolkit nodes require self-hosted n8n and valid API key.
---
#### 2.2 PDF File Compression (from HTML Conversion)
- **Overview:**
Compresses the PDF generated from the HTML to PDF conversion, optimizing file size.
- **Nodes Involved:**
- Compress PDF file (CustomJS Compress PDF node)
- **Node Details:**
- **Compress PDF file**
- Type: CustomJS PDF Toolkit - Compress PDF node
- Role: Compresses PDF data received from HTML to PDF node.
- Configuration: Default compression settings; no additional parameters specified.
- Inputs: Receives PDF binary data from HTML to PDF node.
- Outputs: End node (no further nodes connected).
- Credentials: Uses the same CustomJS API key credentials.
- Edge Cases:
- Compression API failure or timeout.
- Large PDF files may exceed API limits.
- Version Requirements: Same as above.
---
#### 2.3 PDF Compression from URL
- **Overview:**
Handles compressing a PDF file accessible via a URL. First sets a PDF URL, then compresses the PDF retrieved from that URL.
- **Nodes Involved:**
- Set PDF URL (Code node)
- Compress PDF file1 (CustomJS Compress PDF node)
- **Node Details:**
- **Set PDF URL**
- Type: Code (JavaScript) node
- Role: Defines a JSON output containing a `path` key with the PDF URL string.
- Configuration:
- Hardcoded to return `{ "path": "https://www.nlbk.niedersachsen.de/download/164891/Test-pdf_3.pdf.pdf" }`.
- Inputs: Triggered by manual trigger node.
- Outputs: JSON object with URL path to Compress PDF file1 node.
- Edge Cases:
- URL may be inaccessible or invalid, leading to failure in the next node.
- Version Requirements: n8n v0.146.0+ recommended for Code node v2.
- **Compress PDF file1**
- Type: CustomJS PDF Toolkit - Compress PDF node
- Role: Compresses the PDF file located at the given URL.
- Configuration:
- `resource` parameter set to `"url"`.
- `field_name` parameter set dynamically via expression `={{ $json.path }}`, indicating the URL to fetch and compress.
- Inputs: Receives JSON with URL from Set PDF URL node.
- Outputs: End node.
- Credentials: Uses the same CustomJS API key.
- Edge Cases:
- Network failure or URL inaccessible.
- API errors during compression.
- Version Requirements: Same as above.
---
### 3. Summary Table
| Node Name | Node Type | Functional Role | Input Node(s) | Output Node(s) | Sticky Note |
|-------------------------|----------------------------------|---------------------------------------------|-----------------------------|-----------------------------|---------------------------------------------------------------------------------------------|
| When clicking Test workflow | Manual Trigger | Starts workflow manually | None | HTML to PDF, Set PDF URL | |
| HTML to PDF | CustomJS HTML to PDF | Converts HTML input to PDF | When clicking Test workflow | Compress PDF file | ### HTML to PDF<br>- Request HTML Data<br>- Convert HTML to PDF |
| Compress PDF file | CustomJS Compress PDF | Compresses PDF from HTML to PDF conversion | HTML to PDF | None | ### Compress Pages from PDF<br>- Compress PDF as a binary file. |
| Set PDF URL | Code | Outputs JSON with PDF URL | When clicking Test workflow | Compress PDF file1 | ### Set PDF URL<br>- Request PDF from URL. |
| Compress PDF file1 | CustomJS Compress PDF | Compresses PDF file from provided URL | Set PDF URL | None | ### Compress Pages from PDF<br>- Compress PDF as a binary file. |
| Sticky Note | Sticky Note | Notes for HTML to PDF block | None | None | ### HTML to PDF<br>- Request HTML Data<br>- Convert HTML to PDF |
| Sticky Note1 | Sticky Note | Notes for compressing PDF pages | None | None | ### Compress Pages from PDF<br>- Compress PDF as a binary file. |
| Sticky Note2 | Sticky Note | Notes for setting PDF URL | None | None | ### Set PDF URL<br>- Request PDF from URL. |
| Sticky Note3 | Sticky Note | Notes for compressing PDF from URL block | None | None | ### Compress Pages from PDF<br>- Compress PDF as a binary file. |
---
### 4. Reproducing the Workflow from Scratch
1. **Create a Manual Trigger node**
- Type: Manual Trigger
- Position: Starting point
- No parameters needed.
2. **Add a CustomJS HTML to PDF node**
- Node Name: `HTML to PDF`
- Type: `@custom-js/n8n-nodes-pdf-toolkit.html2Pdf`
- Parameters:
- Set `htmlInput` field to `<h1>Hello World</h1>` (or your desired HTML content).
- Credentials:
- Configure with your CustomJS API key credentials (create under Credentials > CustomJS API).
- Connect: Output of Manual Trigger → Input of HTML to PDF.
3. **Add a CustomJS Compress PDF node for local PDF compression**
- Node Name: `Compress PDF file`
- Type: `@custom-js/n8n-nodes-pdf-toolkit.CompressPDF`
- Parameters: Default (compress the incoming binary PDF).
- Credentials: Use the same CustomJS API key credentials.
- Connect: Output of HTML to PDF → Input of Compress PDF file.
4. **Add a Code node to set the PDF URL**
- Node Name: `Set PDF URL`
- Type: Code (JavaScript)
- Parameters: Insert the following JS code:
```javascript
return {
json: {
path: "https://www.nlbk.niedersachsen.de/download/164891/Test-pdf_3.pdf.pdf"
}
};
```
- Connect: Output of Manual Trigger → Input of Set PDF URL.
5. **Add a CustomJS Compress PDF node for URL-based compression**
- Node Name: `Compress PDF file1`
- Type: `@custom-js/n8n-nodes-pdf-toolkit.CompressPDF`
- Parameters:
- Set `resource` to `"url"`.
- Set `field_name` to expression `={{ $json.path }}` (to use the URL from Code node).
- Credentials: Use the same CustomJS API key credentials.
- Connect: Output of Set PDF URL → Input of Compress PDF file1.
6. **Verify all nodes are correctly connected:**
- Manual Trigger outputs to both HTML to PDF and Set PDF URL nodes.
- HTML to PDF outputs to Compress PDF file.
- Set PDF URL outputs to Compress PDF file1.
7. **Set up CustomJS API Credentials:**
- Go to Credentials in n8n.
- Create new credentials for CustomJS API.
- Paste your API key obtained from https://www.customjs.space (your profile page > Show API key).
- Assign these credentials to all CustomJS nodes.
8. **Save and activate workflow.**
- Test by clicking Execute Workflow in the Manual Trigger node.
---
### 5. General Notes & Resources
| Note Content | Context or Link |
|-----------------------------------------------------------------------------------------------------|--------------------------------------------------------|
| Community nodes like `@custom-js/n8n-nodes-pdf-toolkit` require self-hosted n8n instances. | https://docs.n8n.io/integrations/community-nodes/ |
| Obtain CustomJS API key by signing up and checking your profile on https://www.customjs.space | https://www.customjs.space |
| This workflow can be triggered by other means, e.g., Webhook, and output adapted accordingly. | Replace Manual Trigger with Webhook and add response nodes. |
| For large files (>6MB), consider additional logic to handle timeouts or API limits in CustomJS. | Best practice for production workflows |
---
This document fully describes the workflows logic, nodes, configurations, and setup instructions to enable advanced users and AI agents to understand, reproduce, and maintain the workflow effectively.