Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
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, message=repr(f)):
Object.parse(str(d))
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}
def test_numbers(self):
self.check(Object.parse('1.0'), 1)
self.check(Object.parse('42'), 42)
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(
<<
/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,
def test_open_pdf(resources):
pdf = Pdf.open(resources / 'graph.pdf')
page = pdf.pages[0]
Object._parse_stream(page, PrintParser())
def test_parser_exception(resources):
pdf = Pdf.open(resources / 'graph.pdf')
stream = pdf.pages[0]['/Contents']
with pytest.raises(ValueError):
Object._parse_stream(stream, ExceptionParser())
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)
dparms.Columns = compdata.w
im_obj.BitsPerComponent = compdata.bps
im_obj.Width = compdata.w
im_obj.Height = compdata.h
log.debug(
f"PNG {im_obj.objgen}: palette={compdata.ncolors} spp={compdata.spp} bps={compdata.bps}"
)
if compdata.ncolors > 0:
# .ncolors is the number of colors in the palette, not the number of
# colors used in a true color image. The palette string is always
# given as RGB tuples even when the image is grayscale; see
# https://github.com/DanBloomberg/leptonica/blob/master/src/colormap.c#L2067
palette_pdf_string = compdata.get_palette_pdf_string()
palette_data = pikepdf.Object.parse(palette_pdf_string)
palette_stream = pikepdf.Stream(pike, bytes(palette_data))
palette = [Name.Indexed, Name.DeviceRGB, compdata.ncolors - 1, palette_stream]
cs = palette
else:
# ncolors == 0 means we are using a colorspace without a palette
if compdata.spp == 1:
cs = Name.DeviceGray
elif compdata.spp == 3:
cs = Name.DeviceRGB
elif compdata.spp == 4:
cs = Name.DeviceCMYK
im_obj.ColorSpace = cs
im_obj.write(compdata.read(), filter=Name.FlateDecode, decode_parms=dparms)
if not isinstance(page_or_stream, Object):
raise TypeError("stream must a PDF object")
if (
page_or_stream._type_code != ObjectType.stream
and page_or_stream.get('/Type') != '/Page'
):
raise TypeError("parse_content_stream called on page or stream object")
try:
if page_or_stream.get('/Type') == '/Page':
page = page_or_stream
instructions = page._parse_page_contents_grouped(operators)
else:
stream = page_or_stream
instructions = Object._parse_stream_grouped(stream, operators)
except PdfError as e:
# This is the error message for qpdf >= 7.0. It was different in 6.x
# but we no longer support 6.x
if 'ignoring non-stream while parsing' in str(e):
raise TypeError("parse_content_stream called on non-stream Object")
raise e from e
return instructions