comparison tests/test_optional_content.py @ 1:1d09e1dec1d9 upstream

ADD: PyMuPDF v1.26.4: the original sdist. It does not yet contain MuPDF. This normally will be downloaded when building PyMuPDF.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:37:51 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 1:1d09e1dec1d9
1 """
2 Test of Optional Content code.
3 """
4
5 import os
6
7 import pymupdf
8
9 scriptdir = os.path.abspath(os.path.dirname(__file__))
10 filename = os.path.join(scriptdir, "resources", "joined.pdf")
11
12
13 def test_oc1():
14 """Arbitrary calls to OC code to get coverage."""
15 doc = pymupdf.open()
16 ocg1 = doc.add_ocg("ocg1")
17 ocg2 = doc.add_ocg("ocg2")
18 ocg3 = doc.add_ocg("ocg3")
19 ocmd1 = doc.set_ocmd(xref=0, ocgs=(ocg1, ocg2))
20 doc.set_layer(-1)
21 doc.add_layer("layer1")
22 test = doc.get_layer()
23 test = doc.get_layers()
24 test = doc.get_ocgs()
25 test = doc.layer_ui_configs()
26 doc.switch_layer(0)
27
28
29 def test_oc2():
30 # source file with at least 4 pages
31 src = pymupdf.open(filename)
32
33 # new PDF with one page
34 doc = pymupdf.open()
35 page = doc.new_page()
36
37 # define the 4 rectangle quadrants to receive the source pages
38 r0 = page.rect / 2
39 r1 = r0 + (r0.width, 0, r0.width, 0)
40 r2 = r0 + (0, r0.height, 0, r0.height)
41 r3 = r2 + (r2.width, 0, r2.width, 0)
42
43 # make 4 OCGs - one for each source page image.
44 # only first is ON initially
45 ocg0 = doc.add_ocg("ocg0", on=True)
46 ocg1 = doc.add_ocg("ocg1", on=False)
47 ocg2 = doc.add_ocg("ocg2", on=False)
48 ocg3 = doc.add_ocg("ocg3", on=False)
49
50 ocmd0 = doc.set_ocmd(ve=["and", ocg0, ["not", ["or", ocg1, ocg2, ocg3]]])
51 ocmd1 = doc.set_ocmd(ve=["and", ocg1, ["not", ["or", ocg0, ocg2, ocg3]]])
52 ocmd2 = doc.set_ocmd(ve=["and", ocg2, ["not", ["or", ocg1, ocg0, ocg3]]])
53 ocmd3 = doc.set_ocmd(ve=["and", ocg3, ["not", ["or", ocg1, ocg2, ocg0]]])
54 ocmds = (ocmd0, ocmd1, ocmd2, ocmd3)
55 # insert the 4 source page images, each connected to one OCG
56 page.show_pdf_page(r0, src, 0, oc=ocmd0)
57 page.show_pdf_page(r1, src, 1, oc=ocmd1)
58 page.show_pdf_page(r2, src, 2, oc=ocmd2)
59 page.show_pdf_page(r3, src, 3, oc=ocmd3)
60 xobj_ocmds = [doc.get_oc(item[0]) for item in page.get_xobjects() if item[1] != 0]
61 assert set(ocmds) <= set(xobj_ocmds)
62 assert set((ocg0, ocg1, ocg2, ocg3)) == set(tuple(doc.get_ocgs().keys()))
63 doc.get_ocmd(ocmd0)
64 page.get_oc_items()
65
66
67 def test_3143():
68 """Support for non-ascii layer names."""
69 doc = pymupdf.open(os.path.join(scriptdir, "resources", "test-3143.pdf"))
70 page = doc[0]
71 set0 = set([l["text"] for l in doc.layer_ui_configs()])
72 set1 = set([p["layer"] for p in page.get_drawings()])
73 set2 = set([b[2] for b in page.get_bboxlog(layers=True)])
74 assert set0 == set1 == set2
75
76
77 def test_3180():
78 doc = pymupdf.open()
79 page = doc.new_page()
80
81 # Define the items for the combo box
82 combo_items = ['first', 'second', 'third']
83
84 # Create a combo box field
85 combo_box = pymupdf.Widget() # create a new widget
86 combo_box.field_type = pymupdf.PDF_WIDGET_TYPE_COMBOBOX
87 combo_box.field_name = "myComboBox"
88 combo_box.field_value = combo_items[0]
89 combo_box.choice_values = combo_items
90 combo_box.rect = pymupdf.Rect(50, 50, 200, 75) # position of the combo box
91 combo_box.script_change = """
92 var value = event.value;
93 app.alert('You selected: ' + value);
94
95 //var group_id = optional_content_group_ids[value];
96
97 """
98
99 # Insert the combo box into the page
100 # https://pymupdf.readthedocs.io/en/latest/page.html#Page.add_widget
101 page.add_widget(combo_box)
102
103 # Create optional content groups
104 # https://github.com/pymupdf/PyMuPDF-Utilities/blob/master/jupyter-notebooks/optional-content.ipynb
105
106
107 # Load images and create OCGs for each
108 optional_content_group_ids = {}
109 for i, item in enumerate(combo_items):
110 optional_content_group_id = doc.add_ocg(item, on=False)
111 optional_content_group_ids[item] = optional_content_group_id
112 rect = pymupdf.Rect(50, 100, 250, 300)
113 image_file_name = f'{item}.png'
114 # xref = page.insert_image(
115 # rect,
116 # filename=image_file_name,
117 # oc=optional_content_group_id,
118 # )
119
120
121 first_id = optional_content_group_ids['first']
122 second_id = optional_content_group_ids['second']
123 third_id = optional_content_group_ids['third']
124
125 # https://pymupdf.readthedocs.io/en/latest/document.html#Document.set_layer
126
127
128 doc.set_layer(-1, basestate="OFF")
129 layers = doc.get_layer()
130 doc.set_layer(config=-1, on=[first_id])
131
132 # https://pymupdf.readthedocs.io/en/latest/document.html#Document.set_layer_ui_config
133 # configs = doc.layer_ui_configs()
134 # doc.set_layer_ui_config(0, pymupdf.PDF_OC_ON)
135 # doc.set_layer_ui_config('third', action=2)
136
137 # Save the PDF
138 doc.save(os.path.abspath(f'{__file__}/../../tests/test_3180.pdf'))
139 doc.close()