#!/usr/bin/env bash
# Generate document model test fixtures
# Requires: qpdf (via nix-shell)
set -e
FIXTURES_DIR="tests/document_model/fixtures"
BASE_PDF="$FIXTURES_DIR/base_hello.pdf"
# Create a minimal base PDF for encryption
create_base_pdf() {
cat > "$BASE_PDF" <<'EOF'
%PDF-1.4
1 0 obj<>endobj
2 0 obj<>endobj
3 0 obj<>>/Contents 5 0 R>>endobj
4 0 obj<>endobj
5 0 obj<>stream
BT /F1 12 Tf 100 700 Td (Hello World) Tj ET
endstream endobj
xref
0 6
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000115 00000 n
0000000302 00000 n
0000000377 00000 n
trailer<>
startxref 360
%%EOF
EOF
echo "Created base PDF: $BASE_PDF"
}
# Generate encrypted fixtures
generate_encrypted() {
echo "Generating encrypted fixtures..."
# RC4-40 with password "test" (EC-04)
nix-shell -p qpdf --run "qpdf --allow-weak-crypto --encrypt test test 40 -- $BASE_PDF $FIXTURES_DIR/encrypted_rc4_test.pdf"
# AES-128 with password "test" (EC-05)
nix-shell -p qpdf --run "qpdf --encrypt test test 128 -- $BASE_PDF $FIXTURES_DIR/encrypted_aes128_test.pdf"
# AES-256 with password "test" (EC-06) - requires PDF 2.0
nix-shell -p qpdf --run "qpdf --encrypt test test 256 --force-version=2.0 -- $BASE_PDF $FIXTURES_DIR/encrypted_aes256_test.pdf"
# Empty password (RC4-40)
nix-shell -p qpdf --run "qpdf --allow-weak-crypto --encrypt '' '' 40 -- $BASE_PDF $FIXTURES_DIR/encrypted_empty_password.pdf"
echo "Encrypted fixtures generated."
}
# Generate tagged PDF with 3-level outline
generate_tagged_outline() {
echo "Generating tagged_3_level_outline.pdf..."
cat > "$FIXTURES_DIR/tagged_3_level_outline.pdf" <<'EOF'
%PDF-1.4
1 0 obj<>endobj
2 0 obj<>endobj
3 0 obj<>endobj
4 0 obj<>endobj
5 0 obj<>endobj
6 0 obj<>endobj
7 0 obj<>endobj
8 0 obj<>endobj
xref
0 9
0000000000 65535 f
0000000009 00000 n
0000000066 00000 n
0000000133 00000 n
0000000222 00000 n
0000000313 00000 n
0000000404 00000 n
0000000549 00000 n
0000000680 00000 n
trailer<>
startxref 795
%%EOF
EOF
echo "Generated tagged_3_level_outline.pdf"
}
# Generate OCG with default OFF (EC-16)
generate_ocg_off() {
echo "Generating ocg_default_off.pdf..."
cat > "$FIXTURES_DIR/ocg_default_off.pdf" <<'EOF'
%PDF-1.5
1 0 obj<>>>>endobj
2 0 obj<>endobj
3 0 obj<>endobj
4 0 obj<>endobj
5 0 obj[/OCG1]endobj
xref
0 6
0000000000 65535 f
0000000009 00000 n
0000000157 00000 n
0000000232 00000 n
0000000331 00000 n
0000000424 00000 n
trailer<>
startxref 509
%%EOF
EOF
echo "Generated ocg_default_off.pdf"
}
# Generate multi-revision PDF (3 revisions)
generate_multi_revision() {
echo "Generating multi_revision_3.pdf..."
cat > "$FIXTURES_DIR/multi_revision_3.pdf" <<'EOF'
%PDF-1.4
1 0 obj<>endobj
2 0 obj<>endobj
3 0 obj<>endobj
4 0 obj<>endobj
5 0 obj<>endobj
xref
0 6
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000125 00000 n
0000000222 00000 n
0000000319 00000 n
trailer<>
startxref 416
%%EOF
EOF
echo "Generated multi_revision_3.pdf"
}
# Generate inheritance test fixtures
generate_inheritance() {
echo "Generating inheritance fixtures..."
cat > "$FIXTURES_DIR/inheritance_grandparent_mediabox.pdf" <<'EOF'
%PDF-1.4
1 0 obj<>endobj
2 0 obj<>endobj
3 0 obj<>endobj
4 0 obj<>endobj
xref
0 5
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000157 00000 n
0000000240 00000 n
trailer<>
startxref 325
%%EOF
EOF
cat > "$FIXTURES_DIR/missing_mediabox.pdf" <<'EOF'
%PDF-1.4
1 0 obj<>endobj
2 0 obj<>endobj
3 0 obj<>endobj
xref
0 4
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000125 00000 n
trailer<>
startxref 210
%%EOF
EOF
echo "Generated inheritance fixtures."
}
# Generate partial resource override fixture
generate_partial_override() {
echo "Generating partial_resource_override.pdf..."
cat > "$FIXTURES_DIR/partial_resource_override.pdf" <<'EOF'
%PDF-1.4
1 0 obj<>endobj
2 0 obj<>>>>endobj
3 0 obj<>>/Contents 8 0 R>>endobj
4 0 obj<>endobj
5 0 obj<>endobj
6 0 obj<>endobj
7 0 obj<>endobj
8 0 obj<>stream
BT /F3 12 Tf 100 700 Td (Partial override) Tj ET
endstream endobj
xref
0 9
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000245 00000 n
0000000450 00000 n
0000000547 00000 n
0000000636 00000 n
0000000747 00000 n
0000000838 00000 n
trailer<>
startxref 945
%%EOF
EOF
echo "Generated partial_resource_override.pdf"
}
# Generate JavaScript fixture
generate_js() {
echo "Generating js_in_openaction.pdf..."
cat > "$FIXTURES_DIR/js_in_openaction.pdf" <<'EOF'
%PDF-1.4
1 0 obj<>>>endobj
2 0 obj<>endobj
3 0 obj<>endobj
xref
0 4
0000000000 65535 f
0000000009 00000 n
0000000176 00000 n
0000000263 00000 n
trailer<>
startxref 348
%%EOF
EOF
echo "Generated js_in_openaction.pdf"
}
# Generate XFA form fixture
generate_xfa() {
echo "Generating xfa_form.pdf..."
cat > "$FIXTURES_DIR/xfa_form.pdf" <<'EOF'
%PDF-1.6
1 0 obj<>endobj
2 0 obj<>endobj
3 0 obj<>endobj
4 0 obj<>endobj
5 0 obj<>endobj
xref
0 6
0000000000 65535 f
0000000009 00000 n
0000000134 00000 n
0000000227 00000 n
0000000330 00000 n
0000000439 00000 n
trailer<>
startxref 528
%%EOF
EOF
echo "Generated xfa_form.pdf"
}
# Generate PDF/A-1B conformance fixture
generate_pdfa() {
echo "Generating pdfa_1b_conformance.pdf..."
cat > "$FIXTURES_DIR/pdfa_1b_conformance.pdf" <<'EOF'
%PDF-1.4
1 0 obj<>endobj
2 0 obj<>endobj
3 0 obj<>stream
1
B
endstream endobj
4 0 obj<>endobj
xref
0 5
0000000000 65535 f
0000000009 00000 n
0000000134 00000 n
0000000235 00000 n
0000000609 00000 n
trailer<>
startxref 682
%%EOF
EOF
echo "Generated pdfa_1b_conformance.pdf"
}
# Generate page labels fixture
generate_page_labels() {
echo "Generating page_labels_roman_arabic.pdf..."
cat > "$FIXTURES_DIR/page_labels_roman_arabic.pdf" <<'EOF'
%PDF-1.4
1 0 obj<>endobj
2 0 obj<>endobj
3 0 obj<>4>]>>endobj
4 0 obj<>endobj
5 0 obj<>endobj
6 0 obj<>endobj
7 0 obj<>endobj
8 0 obj<>endobj
9 0 obj<>endobj
xref
0 10
0000000000 65535 f
0000000009 00000 n
0000000134 00000 n
0000000269 00000 n
0000000447 00000 n
0000000554 00000 n
0000000661 00000 n
0000000768 00000 n
0000000875 00000 n
0000000982 00000 n
trailer<>
startxref 1089
%%EOF
EOF
echo "Generated page_labels_roman_arabic.pdf"
}
# Generate unknown handler fixture
generate_unknown_handler() {
echo "Generating encrypted_unknown_handler.pdf..."
cat > "$FIXTURES_DIR/encrypted_unknown_handler.pdf" <<'EOF'
%PDF-1.4
1 0 obj<>endobj
2 0 obj<>endobj
3 0 obj<>endobj
4 0 obj<>endobj
5 0 obj<>endobj
xref
0 6
0000000000 65535 f
0000000009 00000 n
0000000058 00000 n
0000000125 00000 n
0000000204 00000 n
0000000409 00000 n
trailer<>/ID[<1234567890abcdef1234567890abcdef>]>>
startxref 614
%%EOF
EOF
echo "Generated encrypted_unknown_handler.pdf"
}
# Main execution
main() {
echo "Generating document model test fixtures..."
mkdir -p "$FIXTURES_DIR"
create_base_pdf
generate_encrypted
generate_tagged_outline
generate_ocg_off
generate_multi_revision
generate_inheritance
generate_partial_override
generate_js
generate_xfa
generate_pdfa
generate_page_labels
generate_unknown_handler
echo "All fixtures generated successfully!"
echo "Fixtures are in: $FIXTURES_DIR"
}
main "$@"