def test_create_pdf(outdir): pdf = Pdf.new() font = pdf.make_indirect( Object.parse(b""" << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>""")) width, height = 100, 100 image_data = b"\xff\x7f\x00" * (width * height) image = Stream(pdf, image_data) image.stream_dict = Object.parse(b""" << /Type /XObject /Subtype /Image /ColorSpace /DeviceRGB /BitsPerComponent 8 /Width 100 /Height 100 >>""") rfont = {'/F1': font} xobj = {'/Im1': image} resources = { '/Font': rfont, '/XObject': xobj } mediabox = [0, 0, 612, 792] stream = b""" BT /F1 24 Tf 72 720 Td (Hi there) Tj ET q 144 0 0 144 234 324 cm /Im1 Do Q """ contents = Stream(pdf, stream) page_dict = { '/Type': Name('/Page'), '/MediaBox': mediabox, '/Contents': contents, '/Resources': resources } qpdf_page_dict = page_dict page = pdf.make_indirect(qpdf_page_dict) pdf.pages.append(page) pdf.save(outdir / 'hi.pdf')
def __init__(self, *, image_data, image_object: tuple): """ Args: image_data: data stream for image, extracted from content stream image_object: the metadata for image, also from content stream """ # Convert the sequence of pikepdf.Object from the content stream into # a dictionary object by unparsing it (to bytes), eliminating inline # image abbreviations, and constructing a bytes string equivalent to # what an image XObject would look like. Then retrieve data from there self._data = image_data self._image_object = image_object reparse = b' '.join( self._unparse_obj(obj, remap_names=self.ABBREVS) for obj in image_object) try: reparsed_obj = Object.parse(b'<< ' + reparse + b' >>') except PdfError as e: raise PdfError("parsing inline " + reparse.decode('unicode_escape')) from e self.obj = reparsed_obj self.pil = None
def test_decimal_from_float(f): d = Decimal(f) if isfinite(f) and d.is_finite(): try: # PDF is limited to ~5 sig figs decstr = str(d.quantize(Decimal('1.000000'))) except InvalidOperation: return # PDF doesn't support exponential notation try: py_d = Object.parse(decstr) except RuntimeError as e: if 'overflow' in str(e) or 'underflow' in str(e): py_d = Object.parse(str(f)) assert isclose(py_d, d, abs_tol=1e-5), (d, f.hex()) else: with pytest.raises(PdfError): Object.parse(str(d))
def __init__(self, context): self.context = context self.path_base = context.origin self.pdf_base = Pdf.open(self.path_base) self.font, self.font_key = None, None self.pdfinfo = context.pdfinfo self.output_file = context.get_path('graft_layers.pdf') self.procset = self.pdf_base.make_indirect( Object.parse(b'[ /PDF /Text /ImageB /ImageC /ImageI ]')) self.emplacements = 1 self.interim_count = 0
def test_bool_comparison(self): self.check(Object.parse('0.0'), False) self.check(True, 1)
def test_numbers(self): self.check(Object.parse('1.0'), 1) self.check(Object.parse('42'), 42)
def test_create_form_xobjects(outdir): pdf = Pdf.new() font = pdf.make_indirect( Object.parse(b""" << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> """)) width, height = 100, 100 image_data = b"\xff\x7f\x00" * (width * height) image = Stream(pdf, image_data) image.stream_dict = Object.parse(""" << /Type /XObject /Subtype /Image /ColorSpace /DeviceRGB /BitsPerComponent 8 /Width 100 /Height 100 >> """) xobj_image = Dictionary({'/Im1': image}) form_xobj_res = Dictionary({'/XObject': xobj_image}) form_xobj = Stream( pdf, b""" /Im1 Do """, ) form_xobj['/Type'] = Name('/XObject') form_xobj['/Subtype'] = Name('/Form') form_xobj['/FormType'] = 1 form_xobj['/Matrix'] = [1, 0, 0, 1, 0, 0] form_xobj['/BBox'] = [0, 0, 1, 1] form_xobj['/Resources'] = form_xobj_res rfont = {'/F1': font} resources = {'/Font': rfont, '/XObject': {'/Form1': form_xobj}} mediabox = [0, 0, 612, 792] stream = b""" BT /F1 24 Tf 72 720 Td (Hi there) Tj ET q 144 0 0 144 234 324 cm /Form1 Do Q q 72 0 0 72 378 180 cm /Form1 Do Q """ contents = Stream(pdf, stream) page = pdf.make_indirect({ '/Type': Name('/Page'), '/MediaBox': mediabox, '/Contents': contents, '/Resources': resources, }) pdf.pages.append(page) pdf.save(outdir / 'formxobj.pdf')