def test_write_embedded_string_objstream(): ffile = ttLib.TTFont(NOTO_SERIF_JP) ga = GlyphAccumulator(ffile) cid_hx, _ = ga.feed_string('テスト') assert cid_hx == '0637062a0639' w = IncrementalPdfFileWriter(BytesIO(MINIMAL_XREF)) obj_stream = w.prepare_object_stream() font_ref = ga.embed_subset(w, obj_stream=obj_stream) stream = generic.StreamObject( stream_data=f'BT /FEmb 18 Tf 0 100 Td <{cid_hx}> Tj ET'.encode( 'ascii')) stream_ref = w.add_object(stream) w.add_stream_to_page(0, stream_ref, resources=generic.DictionaryObject({ pdf_name('/Font'): generic.DictionaryObject( {pdf_name('/FEmb'): font_ref}) })) out = BytesIO() w.write(out) out.seek(0) r = PdfFileReader(out) page_obj = r.root['/Pages']['/Kids'][0].get_object() conts = page_obj['/Contents'] assert len(conts) == 2 assert stream_ref.idnum in (c.idnum for c in conts) assert font_ref.idnum in r.xrefs.in_obj_stream out.seek(0) # attempt to grab the font from the object stream font_ref.pdf = r font = font_ref.get_object() assert font['/Type'] == pdf_name('/Font')
def test_write_embedded_string(): w = IncrementalPdfFileWriter(BytesIO(MINIMAL)) with open(NOTO_SERIF_JP, 'rb') as ffile: ga = GlyphAccumulator(w, ffile, font_size=10) # shape the string, just to register the glyphs as used ga.shape('テスト') # ... but we're not going to use the result # hardcoded CIDs cid_hx = '0637062a0639' stream = generic.StreamObject( stream_data=f'BT /FEmb 18 Tf 0 100 Td <{cid_hx}> Tj ET'.encode('ascii') ) stream_ref = w.add_object(stream) w.add_stream_to_page( 0, stream_ref, resources=generic.DictionaryObject({ pdf_name('/Font'): generic.DictionaryObject({ pdf_name('/FEmb'): ga.as_resource() }) }) ) out = BytesIO() w.write(out) out.seek(0) r = PdfFileReader(out) page_obj = r.root['/Pages']['/Kids'][0].get_object() conts = page_obj['/Contents'] assert len(conts) == 2 assert stream_ref.idnum in (c.idnum for c in conts)
def test_add_stream_to_direct_arr(): w = writer.PdfFileWriter() w.insert_page(simple_page(w, 'Test Test', extra_stream=True)) out = BytesIO() w.write(out) out.seek(0) w = IncrementalPdfFileWriter(out) new_stream = 'BT /F1 18 Tf 0 50 Td (Test2 Test2) Tj ET'.encode('ascii') stream = generic.StreamObject(stream_data=new_stream) stream_ref = w.add_object(stream) w.add_stream_to_page(0, stream_ref) out = BytesIO() w.write(out) out.seek(0) r = PdfFileReader(out) # check if the content stream was added page_obj_ref = r.root['/Pages']['/Kids'].raw_get(0) assert isinstance(page_obj_ref, generic.IndirectObject) page_obj = page_obj_ref.get_object() conts = page_obj['/Contents'] assert len(conts) == 3 assert stream_ref.idnum in (c.idnum for c in conts) # check if resource dictionary is still OK assert '/F1' in page_obj['/Resources']['/Font']
def test_code128_render(): writer = IncrementalPdfFileWriter(BytesIO(MINIMAL)) bb = barcodes.BarcodeBox("code128", "this is a test") xobj_ref = writer.add_object(bb.as_form_xobject()) stamp_wrapper_stream = generic.StreamObject( stream_data=b'q 1 0 0 1 50 50 cm /Barcode Do Q') resources = generic.DictionaryObject({ pdf_name('/XObject'): generic.DictionaryObject({pdf_name('/Barcode'): xobj_ref}) }) writer.add_stream_to_page(0, writer.add_object(stamp_wrapper_stream), resources)
def test_add_stream(): w = IncrementalPdfFileWriter(BytesIO(MINIMAL)) def stream_data(y): return f'BT /F1 18 Tf 0 {y} Td (Test Test) Tj ET'.encode('ascii') stream = generic.StreamObject(stream_data=stream_data(50)) stream_ref = w.add_object(stream) w.add_stream_to_page(0, stream_ref) out = BytesIO() w.write(out) out.seek(0) r = PdfFileReader(out) # check if the content stream was added page_obj_ref = r.root['/Pages']['/Kids'].raw_get(0) assert isinstance(page_obj_ref, generic.IndirectObject) page_obj = page_obj_ref.get_object() conts = page_obj['/Contents'] assert len(conts) == 2 assert stream_ref.idnum in (c.idnum for c in conts) # check if resource dictionary is still OK assert '/F1' in page_obj['/Resources']['/Font'] # let's try adding a third out.seek(0) w = IncrementalPdfFileWriter(out) stream = generic.StreamObject(stream_data=stream_data(100)) new_stream_ref = w.add_object(stream) w.add_stream_to_page(0, new_stream_ref) out = BytesIO() w.write(out) out.seek(0) r = PdfFileReader(out) # check if the content stream was added page_obj_ref = r.root['/Pages']['/Kids'].raw_get(0) assert isinstance(page_obj_ref, generic.IndirectObject) page_obj = page_obj_ref.get_object() conts = page_obj['/Contents'] assert len(conts) == 3 ids = [c.idnum for c in conts] assert stream_ref.idnum in ids and new_stream_ref.idnum in ids
def test_code128_render(): writer = IncrementalPdfFileWriter(BytesIO(MINIMAL)) bb = barcodes.BarcodeBox("code128", "this is a test") xobj_ref = writer.add_object(bb.as_form_xobject()) stamp_wrapper_stream = generic.StreamObject( stream_data=b'q 1 0 0 1 50 50 cm /Barcode Do Q') resources = generic.DictionaryObject({ pdf_name('/XObject'): generic.DictionaryObject({pdf_name('/Barcode'): xobj_ref}) }) writer.add_stream_to_page(0, writer.add_object(stamp_wrapper_stream), resources) # TODO try to read back the code using some kind of barcode scanning # library, perhaps. compare_output(writer, f'{EXPECTED_OUTPUT_DIR}/code128-test.pdf')
def test_write_embedded_string_objstream(): w = IncrementalPdfFileWriter(BytesIO(MINIMAL_XREF)) obj_stream = w.prepare_object_stream() with open(NOTO_SERIF_JP, 'rb') as ffile: ga = GlyphAccumulator(w, ffile, font_size=10, obj_stream=obj_stream) # shape the string, just to register the glyphs as used ga.shape('テスト') # ... but we're not going to use the result # hardcoded CIDs cid_hx = '0637062a0639' font_ref = ga.as_resource() stream = generic.StreamObject( stream_data=f'BT /FEmb 18 Tf 0 100 Td <{cid_hx}> Tj ET'.encode( 'ascii')) stream_ref = w.add_object(stream) w.add_stream_to_page(0, stream_ref, resources=generic.DictionaryObject({ pdf_name('/Font'): generic.DictionaryObject( {pdf_name('/FEmb'): font_ref}) })) out = BytesIO() w.write(out) out.seek(0) r = PdfFileReader(out) page_obj = r.root['/Pages']['/Kids'][0].get_object() conts = page_obj['/Contents'] assert len(conts) == 2 assert stream_ref.idnum in (c.idnum for c in conts) xref_sections = r.xrefs._xref_sections last = xref_sections[len(xref_sections) - 1] assert font_ref.idnum in last.xref_data.xrefs_in_objstm out.seek(0) # attempt to grab the font from the object stream font_ref.pdf = r font = font_ref.get_object() assert font['/Type'] == pdf_name('/Font')