Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

MERGE PDF

The MERGE PDF keyword combines multiple PDF files into a single document, enabling bots to consolidate reports, compile documents, and create comprehensive file packages.


Syntax

result = MERGE PDF files, "output.pdf"

Parameters

ParameterTypeDescription
filesArray/StringArray of PDF file paths or single path
outputStringOutput filename for the merged PDF

Description

MERGE PDF takes multiple PDF files and combines them into a single document in the order specified. This is useful for creating comprehensive reports, combining related documents, or building document packages for clients.

Use cases include:

  • Combining invoice and receipt PDFs
  • Merging report sections into complete reports
  • Creating document packages for clients
  • Consolidating scanned documents
  • Building compliance document bundles

Examples

Basic PDF Merge

' Merge two PDF files
files = ["report-part1.pdf", "report-part2.pdf"]
result = MERGE PDF files, "complete-report.pdf"

TALK "Report merged: " + result.localName

Merge Multiple Documents

' Merge multiple documents into one package
documents = [
    "contracts/agreement.pdf",
    "documents/terms.pdf",
    "documents/privacy-policy.pdf",
    "documents/appendix-a.pdf"
]

result = MERGE PDF documents, "client-package-" + client_id + ".pdf"

TALK "Document package created!"
DOWNLOAD result.url AS "Complete Package.pdf"

Dynamic Document Collection

' Find and merge all invoices for a month
invoice_files = []

invoices = FIND "invoices" WHERE month = current_month
FOR EACH inv IN invoices
    invoice_files = invoice_files + ["invoices/" + inv.filename]
END FOR

result = MERGE PDF invoice_files, "monthly-invoices-" + FORMAT(NOW(), "YYYYMM") + ".pdf"

TALK "Merged " + LEN(invoice_files) + " invoices into one document"

Merge with Generated PDFs

' Generate PDFs first, then merge them
cover = GENERATE PDF "templates/cover.html", cover_data, "temp/cover.pdf"
body = GENERATE PDF "templates/report.html", report_data, "temp/body.pdf"
appendix = GENERATE PDF "templates/appendix.html", appendix_data, "temp/appendix.pdf"

files = [cover.localName, body.localName, appendix.localName]
result = MERGE PDF files, "reports/full-report-" + report_id + ".pdf"

TALK "Complete report generated with " + LEN(files) + " sections"

Merge and Email

' Create document package and email to client
documents = [
    "proposals/proposal-" + deal_id + ".pdf",
    "documents/service-agreement.pdf",
    "documents/pricing-schedule.pdf"
]

result = MERGE PDF documents, "packages/" + client_name + "-proposal.pdf"

SEND MAIL client_email, 
    "Your Proposal Package",
    "Please find attached your complete proposal package.",
    [result.localName]

TALK "Proposal package sent to " + client_email

Return Value

Returns an object with merge details:

PropertyDescription
result.urlFull URL to the merged PDF (S3/MinIO path)
result.localNameLocal filename of the merged PDF

Common Use Cases

Monthly Report Compilation

' Compile all weekly reports into monthly report
weekly_reports = [
    "reports/week1.pdf",
    "reports/week2.pdf",
    "reports/week3.pdf",
    "reports/week4.pdf"
]

' Generate cover page
cover = GENERATE PDF "templates/monthly-cover.html", #{
    "month": FORMAT(NOW(), "MMMM YYYY"),
    "generated": FORMAT(NOW(), "YYYY-MM-DD")
}, "temp/cover.pdf"

' Merge cover with weekly reports
all_files = [cover.localName] + weekly_reports
result = MERGE PDF all_files, "reports/monthly-" + FORMAT(NOW(), "YYYYMM") + ".pdf"

TALK "Monthly report compiled!"

Client Onboarding Package

' Create onboarding document package for new client
package_files = [
    "templates/welcome-letter.pdf",
    "contracts/service-agreement-" + contract_id + ".pdf",
    "documents/user-guide.pdf",
    "documents/faq.pdf",
    "documents/support-contacts.pdf"
]

result = MERGE PDF package_files, "onboarding/" + client_id + "-welcome-package.pdf"

SEND MAIL client_email,
    "Welcome to Our Service!",
    "Please find your complete onboarding package attached.",
    [result.localName]

TALK "Onboarding package sent to " + client_name

Compliance Document Bundle

' Bundle all compliance documents for audit
compliance_docs = FIND "compliance_documents" WHERE year = audit_year

file_list = []
FOR EACH doc IN compliance_docs
    file_list = file_list + [doc.file_path]
END FOR

' Add table of contents
toc = GENERATE PDF "templates/compliance-toc.html", #{
    "documents": compliance_docs,
    "audit_year": audit_year
}, "temp/toc.pdf"

all_files = [toc.localName] + file_list
result = MERGE PDF all_files, "audits/compliance-bundle-" + audit_year + ".pdf"

TALK "Compliance bundle ready with " + LEN(compliance_docs) + " documents"

Invoice Bundle for Accounting

' Create quarterly invoice bundle
quarter_start = DATEADD(NOW(), -3, "month")
invoices = FIND "generated_invoices" WHERE created_at >= quarter_start

invoice_files = []
FOR EACH inv IN invoices
    invoice_files = invoice_files + ["invoices/" + inv.pdf_filename]
END FOR

IF LEN(invoice_files) > 0 THEN
    result = MERGE PDF invoice_files, "accounting/Q" + quarter + "-invoices.pdf"
    TALK "Bundled " + LEN(invoice_files) + " invoices for Q" + quarter
ELSE
    TALK "No invoices found for this quarter"
END IF

Error Handling

ON ERROR RESUME NEXT

files = ["doc1.pdf", "doc2.pdf", "doc3.pdf"]
result = MERGE PDF files, "merged.pdf"

IF ERROR THEN
    error_msg = ERROR_MESSAGE
    
    IF INSTR(error_msg, "not found") > 0 THEN
        TALK "One or more PDF files could not be found."
    ELSE IF INSTR(error_msg, "invalid") > 0 THEN
        TALK "One of the files is not a valid PDF."
    ELSE IF INSTR(error_msg, "storage") > 0 THEN
        TALK "Not enough storage space for the merged file."
    ELSE
        TALK "Merge failed: " + error_msg
    END IF
ELSE
    TALK "PDFs merged successfully!"
END IF

Validating Files Before Merge

' Check files exist before attempting merge
files_to_merge = ["report1.pdf", "report2.pdf", "report3.pdf"]
valid_files = []

FOR EACH f IN files_to_merge
    file_info = LIST f
    IF file_info THEN
        valid_files = valid_files + [f]
    ELSE
        PRINT "Warning: " + f + " not found, skipping"
    END IF
END FOR

IF LEN(valid_files) > 0 THEN
    result = MERGE PDF valid_files, "merged-output.pdf"
    TALK "Merged " + LEN(valid_files) + " of " + LEN(files_to_merge) + " files"
ELSE
    TALK "No valid PDF files found to merge"
END IF

Common Errors

ErrorCauseSolution
FILE_NOT_FOUNDSource PDF doesn’t existVerify file paths
INVALID_PDFFile is not a valid PDFCheck file format
EMPTY_INPUTNo files providedEnsure array has files
STORAGE_FULLInsufficient disk spaceClean up storage
PERMISSION_DENIEDCannot read source fileCheck file permissions

Best Practices

File Organization

' Organize files in logical order before merge
sections = [
    "01-cover.pdf",
    "02-executive-summary.pdf",
    "03-introduction.pdf",
    "04-analysis.pdf",
    "05-recommendations.pdf",
    "06-appendices.pdf"
]

result = MERGE PDF sections, "final-report.pdf"

Temporary File Cleanup

' Clean up temporary files after merge
temp_files = []

' Generate temporary PDFs
FOR i = 1 TO 5
    temp_file = "temp/section-" + i + ".pdf"
    GENERATE PDF "templates/section.html", section_data[i], temp_file
    temp_files = temp_files + [temp_file]
END FOR

' Merge all sections
result = MERGE PDF temp_files, "final-document.pdf"

' Clean up temp files
FOR EACH tf IN temp_files
    DELETE tf
END FOR

TALK "Document created and temp files cleaned up"

Large Document Sets

' For very large document sets, batch if needed
all_files = get_all_pdf_files()  ' Assume this returns many files

IF LEN(all_files) > 100 THEN
    ' Process in batches
    batch_size = 50
    batch_outputs = []
    
    FOR batch_num = 0 TO (LEN(all_files) / batch_size)
        start_idx = batch_num * batch_size
        batch_files = SLICE(all_files, start_idx, start_idx + batch_size)
        
        batch_output = "temp/batch-" + batch_num + ".pdf"
        MERGE PDF batch_files, batch_output
        batch_outputs = batch_outputs + [batch_output]
    END FOR
    
    ' Final merge of batches
    result = MERGE PDF batch_outputs, "complete-archive.pdf"
ELSE
    result = MERGE PDF all_files, "complete-archive.pdf"
END IF

Configuration

No specific configuration required. Uses the bot’s standard drive storage settings from config.csv.

Output files are stored in the bot’s .gbdrive storage location.


Implementation Notes

  • Implemented in Rust under src/basic/keywords/file_operations.rs
  • Maintains PDF metadata and bookmarks where possible
  • Preserves page sizes and orientations
  • Handles password-protected PDFs (if password provided)
  • Maximum combined size: 500 MB
  • Processing timeout: 120 seconds


Summary

MERGE PDF combines multiple PDF files into a single document, making it easy to create comprehensive document packages, compile reports, and bundle related files. Use it with GENERATE PDF to create multi-section reports or with existing files to build client packages. The keyword handles the complexity of PDF merging while providing a simple array-based interface.