Mercurial > hgrepos > Python2 > PyMuPDF
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() |
