Ejemplo n.º 1
0
def make_pdf(input_folder, output_path, fname, quiet):
    output = fitz.Document()
    non_svgs = []
    n = 0
    for file_path in os.listdir(input_folder):
        if file_path.lower().endswith('.svg'):
            n += 1
            im = svg2rlg(os.path.join(input_folder, file_path))
            b = renderPDF.drawToString(im)  # convert to pdf
            img_pdf = fitz.open('pdf', b)  # open as pdf
            output.insertPDF(img_pdf)
        else:
            non_svgs.append(file_path)

    if n:
        try:
            output.save(output_path)

            if not quiet:
                print("Successfully rendered " + str(n) + " SVGs to " + fname)
                if non_svgs:
                    print("Ignored " + str(len(non_svgs)) + " non-svg files:")
                    for line in non_svgs:
                        print('\t' + line)
        except:
            print('Error - something went wrong while saving the file',
                  file=sys.stderr)
            return 1
    else:
        print('Error - no SVGs in input folder\n', file=sys.stderr)
        return 1

    return 0
Ejemplo n.º 2
0
def altair_to_pdf(chart, filename, webdriver='firefox'):
    from lxml import etree
    from svglib.svglib import SvgRenderer
    from reportlab.graphics import renderPDF
    import tempfile
    import os

    name = tempfile.mktemp()

    with open(name, 'w') as fp:
        chart.save(fp, format='svg', webdriver=webdriver)

    parser = etree.XMLParser(
        remove_comments=True,
        resolve_entities=True)
    doc = etree.parse(name, parser=parser)
    svg_root = doc.getroot()

    svgRenderer = SvgRenderer(name)
    drawing = svgRenderer.render(svg_root)

    if drawing is not None:
        data = renderPDF.drawToString(drawing)

        with open(filename, 'wb') as output:
            output.write(data)

    os.remove(name)
Ejemplo n.º 3
0
def svg_to_pdf(svg_data):
    svgr = SvgRenderer()
    doc = minidom.parseString(svg_data.encode("utf-8"))
    svgr.render(doc.documentElement)
    drawing = svgr.finish()
    pdf = renderPDF.drawToString(drawing)
    return pdf
def svg_to_pdf(svg_data):
    svgr = SvgRenderer()
    doc = minidom.parseString(svg_data.encode("utf-8"))
    svgr.render(doc.documentElement)
    drawing = svgr.finish()
    pdf = renderPDF.drawToString(drawing)
    return pdf
Ejemplo n.º 5
0
def post():
    # drawing = svg2rlg(StringIO.StringIO(tangelo.request_body()))
    body = tangelo.request_body().read()
    f = tempfile.NamedTemporaryFile(delete=False)
    f.write(body)
    f.close()
    # return open(f.name).read()
    drawing = svg2rlg(f.name)
    # drawing.renderScale = 1
    id = '%030x' % random.randrange(16 ** 30)
    converted[id] = renderPDF.drawToString(drawing)
    return {"result": id, "error": None}
Ejemplo n.º 6
0
def post():
    #drawing = svg2rlg(StringIO.StringIO(tangelo.request_body()))
    body = tangelo.request_body().read()
    f = tempfile.NamedTemporaryFile(delete=False)
    f.write(body)
    f.close()
    #return open(f.name).read()
    drawing = svg2rlg(f.name)
    #drawing.renderScale = 1
    id = '%030x' % random.randrange(16**30)
    converted[id] = renderPDF.drawToString(drawing)
    return {"result": id, "error": None}
Ejemplo n.º 7
0
def converter(url: str, pdf_filename: str, dir: str) -> None:
    mergedObject = PdfFileMerger()
    
    loop = asyncio.get_event_loop()
    svgs = loop.run_until_complete(parse_svgs(url))
    
    for svg in svgs:
        
        svg = io.BytesIO(svg)
        drawing = svg2rlg(svg)
        pdf = io.BytesIO(renderPDF.drawToString(drawing))

        mergedObject.append(PdfFileReader(pdf))       

    mergedObject.write(dir + f'\pdf\{pdf_filename}.pdf')
Ejemplo n.º 8
0
    def post(self, request, *args, **kwargs):
        data = request.POST.get('svgdata', '')

        doc = xml.dom.minidom.parseString(data.encode( "utf-8" ))
        svg = doc.documentElement
        svgRenderer = SvgRenderer()
        svgRenderer.render(svg)
        drawing = svgRenderer.finish()

        pdf = renderPDF.drawToString(drawing)
        response = HttpResponse(content_type='application/pdf')
        response["Content-Disposition"]= "attachment; filename=chart.pdf"
        response.write(pdf) 

        return response
Ejemplo n.º 9
0
def export_svg(request):
    # Получаем данные с клиентской части использую переменные POST
    svg = request.POST.get("svg")
    doc = xml.dom.minidom.parseString(svg.encode( "utf-8" ))
    svg = doc.documentElement
    # Создаём новый экземпляр класса SvgRenderer
    svgRenderer = SvgRenderer()
    svgRenderer.render(svg)
    drawing = svgRenderer.finish()

    # Вместо записы исходного файла на диск мы позволяем пользователю сразу скачать его
    pdf = renderPDF.drawToString(drawing)
    response = HttpResponse(mimetype='application/pdf')
    response.write(pdf)     

    # Реализуем возможность просмотра полученного pda файла прямо в браузерном плагине
    response["Content-Disposition"]= "attachment; filename=converted.pdf"
    return response
Ejemplo n.º 10
0
def export_svg(request):
    # Получаем данные с клиентской части использую переменные POST
    svg = request.POST.get("svg")
    doc = xml.dom.minidom.parseString(svg.encode("utf-8"))
    svg = doc.documentElement
    # Создаём новый экземпляр класса SvgRenderer
    svgRenderer = SvgRenderer()
    svgRenderer.render(svg)
    drawing = svgRenderer.finish()

    # Вместо записы исходного файла на диск мы позволяем пользователю сразу скачать его
    pdf = renderPDF.drawToString(drawing)
    response = HttpResponse(mimetype='application/pdf')
    response.write(pdf)

    # Реализуем возможность просмотра полученного pda файла прямо в браузерном плагине
    response["Content-Disposition"] = "attachment; filename=converted.pdf"
    return response
Ejemplo n.º 11
0
def export_svg(request):
	svg = request.POST.get("svg_xml")
	title = request.POST.get("title")
	format = request.POST.get("format")
	if format == "svg":
		# Set mimetype to octet-stream to assure download from browser
		response = HttpResponse(svg, mimetype="application/octet-stream")
	elif format == "pdf":
		doc = xml.dom.minidom.parseString(svg.encode( "utf-8" ))
		svg = doc.documentElement

		svgRenderer = SvgRenderer()
		svgRenderer.render(svg)
		drawing = svgRenderer.finish()

		pdf = renderPDF.drawToString(drawing)
		response = HttpResponse(mimetype='application/pdf')
		response.write(pdf)		
	
	# Need to change with actual title
	response["Content-Disposition"]= "attachment; filename=%s.%s" % (title, format)
	return response
Ejemplo n.º 12
0
# main

st.title('SVG to PDF')

st.markdown("An experimental [streamlit.io](https://streamlit.io) UI "
            "for [svg2pdf](https://github.com/deeplook/svglib) (based "
            "on [reportlab.com](https://reportlab.com)).")

pdf_content = b""
col1, col2 = st.beta_columns(2)
with col1:
    with st.beta_expander("SVG"):
        svg_code = ""
        if svg_path:
            svg_code = open(svg_path).read()
        svg = st.text_area("Code", value=svg_code, height=400)
        st.markdown("Paste SVG code above or edit it and click below "
                    "to convert it!")
        if st.button("Convert", key=2):
            if svg:
                drawing = svg2rlg(io.StringIO(svg))
                pdf_content = renderPDF.drawToString(drawing)
with col2:
    with st.beta_expander("PDF"):
        if pdf_content:
            base64_pdf = base64.b64encode(pdf_content).decode("utf-8")
            pdf_display = (
                f'<embed src="data:application/pdf;base64,{base64_pdf}" '
                'width="500" height="400" type="application/pdf">')
            st.markdown(pdf_display, unsafe_allow_html=True)
Ejemplo n.º 13
0
def output_svg_planner(output_format="buffer",
                       file_format="svg",
                       filename=None,
                       year=None):
    if year is None:
        year = datetime.date.today().year

    dwg = DrawingToMemory(filename,
                          size=add_mm_to_sizes(A0_size),
                          profile="tiny")

    date_rect_pos = (10, 10)
    date_rect_size = (30, 64)

    date_rect_style = _make_style(200, 200, 200)
    date_rect_style_weekend = _make_style(244, 44, 440)
    style_vacante = _make_style(208, 255, 156)

    special_dates = (((datetime.date(2015, 2, 2), datetime.date(2015, 2, 6)),
                      style_vacante), ((datetime.date(2015, 6, 15),
                                        datetime.date(2015, 8,
                                                      31)), style_vacante))

    events = [
        Event((datetime.date(2015, 8, 15), datetime.date(2015, 8, 24)),
              (255, 255, 89), "CCL2015"),
        Event((datetime.date(2015, 3, 15), datetime.date(2015, 5, 15)),
              (240, 37, 89), "TEST LONG EVENT"),
        Event((datetime.date(2015, 3, 18), datetime.date(2015, 4, 20)),
              (37, 89, 240), "TEST OVERRIDE"),
        Event((datetime.date(2015, 2, 18), datetime.date(2015, 3, 20)),
              (37, 89, 240), "TEST OVERRIDE 2 "),
        Event((datetime.date(2015, 3, 22), datetime.date(2015, 3, 25)),
              (255, 255, 89), "TEST OVERRIDE 3")
    ]

    events.sort(key=lambda x: x.start_date)

    month_names = [
        "Ian", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sept", "Oct",
        "Nov", "Dec"
    ]

    for month in range(1, 13):
        date_start = datetime.date(year, month, 1)
        month_offset = date_start.weekday()
        date_rect_pos = (date_rect_pos[0] + date_rect_size[0] * month_offset,
                         date_rect_pos[1])

        if month == 12:
            date_end = datetime.date(year + 1, 1,
                                     1) - datetime.timedelta(days=1)
        else:
            date_end = datetime.date(year, month + 1,
                                     1) - datetime.timedelta(days=1)

        date_range = [
            date_start + datetime.timedelta(days=i)
            for i in range(0, (date_end - date_start).days + 1)
        ]
        date_events = {
            date: [i for i in range(1, MAX_EVENTS + 1)]
            for date in date_range
        }

        month_text_position = (date_rect_pos[0] -
                               old_div(date_rect_size[0], 2),
                               date_rect_pos[1] + 0.33 * date_rect_size[1])
        dwg.add(
            dwg.text("%s" % month_names[month - 1],
                     insert=add_mm_to_sizes(month_text_position),
                     font_family=FONT_NAME,
                     font_size=add_mm_to_sizes(8),
                     text_anchor="middle"))

        for day in date_range:
            style = date_rect_style
            for special_style in special_dates:
                if date_in_range(day, special_style[0]):
                    style = special_style[1]
            style = style if day.weekday() < 5 else date_rect_style_weekend

            grp = dwg.g()
            grp.add(
                dwg.rect(insert=add_mm_to_sizes(date_rect_pos),
                         size=add_mm_to_sizes(date_rect_size),
                         **style))

            day_text_position = (date_rect_pos[0] + date_rect_size[0] * 0.75,
                                 date_rect_pos[1] + 0.90 * date_rect_size[1])

            grp.add(
                dwg.text("%s" % day.day,
                         insert=add_mm_to_sizes(day_text_position),
                         font_family=FONT_NAME,
                         font_size=add_mm_to_sizes(8),
                         text_anchor="middle"))

            date_rect_pos = (date_rect_pos[0] + date_rect_size[0],
                             date_rect_pos[1])
            dwg.add(grp)

        for event in events:
            if date_in_range(date_range[0], event.dates) \
                    or date_in_range(date_range[-1], event.dates) \
                    or date_range[0] <= event.start_date <= date_range[-1] \
                    or date_range[0] <= event.end_date <= date_range[-1]:

                event_start_date = max(date_range[0], event.start_date)
                event_end_date = min(date_range[-1], event.end_date)

                event_days = [
                    d for d in date_range
                    if event_start_date <= d <= event_end_date
                ]

                if any([
                        len(date_events[date]) > MAX_EVENTS
                        for date in event_days
                ]):
                    raise Exception("Too many events for month %s" %
                                    month_names[month - 1])

                for date in event_days:
                    if event not in date_events[date]:
                        date_events[date].append(event)

                if event.slot is None:
                    start_set = set(date_events[event_days[0]])
                    for day in event_days:
                        start_set = start_set & set(date_events[day])
                    start_set = sorted(list(start_set))
                    if len(start_set) == 0:
                        raise Exception(
                            "Not enough place to place event in month %s" %
                            month_names[month - 1])
                    event.slot = start_set[0]

                for day in event_days:
                    date_events[day].remove(event.slot)

                event_x = (month_offset + event_start_date.day -
                           1) * date_rect_size[0] + 10
                event_width = ((event_end_date - event_start_date).days +
                               1) * date_rect_size[0]
                grp = dwg.g()

                event_position = (event_x, date_rect_pos[1] +
                                  (event.slot - 1) * EVENT_HEIGHT)
                grp.add(
                    dwg.rect(insert=add_mm_to_sizes(event_position),
                             size=add_mm_to_sizes((event_width, EVENT_HEIGHT)),
                             **event.get_rect_style()))

                event_text_position = (event_x + 3, date_rect_pos[1] +
                                       (event.slot - 1) * EVENT_HEIGHT + 7)
                grp.add(
                    dwg.text(event.name,
                             insert=add_mm_to_sizes(event_text_position),
                             **event.get_text_style()))
                dwg.add(grp)

        date_rect_pos = (10, date_rect_pos[1] + date_rect_size[1])

    # can use save_to_buffer() to get buffer.value()
    # can use save_to_fileobject(response) to write directly to response
    if output_format == "buffer":
        if file_format == "svg":
            svg = dwg.save_to_buffer()
            return svg
        elif file_format == "pdf":
            svg = dwg.draw_to_buffer()
            svg.seek(0)
            pdf = svg2rlg(svg)
            return renderPDF.drawToString(pdf)
    if output_format == "file":
        if file_format == "svg":
            dwg.save()
        if file_format == "pdf":
            pdf = svg2rlg(filename)
            renderPDF.drawToFile(pdf, filename + ".pdf")
    return
Ejemplo n.º 14
0
def draw_number(w, h, nr):
    w, h = w*mm, h*mm
    d = shapes.Drawing(w, h)
    d.add(shapes.String(w/2, h/2, f"{nr}", textAnchor="middle",
                        fontSize=15, fillColor=black))
    return renderPDF.drawToString(d)
Ejemplo n.º 15
0
 def test_png_in_svg(self):
     path = join(TEST_ROOT, "samples", "others", "png_in_svg.svg")
     drawing = svglib.svg2rlg(path)
     result = renderPDF.drawToString(drawing)
     # If the PNG image is really included, the size is over 10k.
     assert len(result) > 10000
Ejemplo n.º 16
0
 def test_png_in_svg(self):
     path = join(TEST_ROOT, "samples", "others", "png_in_svg.svg")
     drawing = svglib.svg2rlg(path)
     result = renderPDF.drawToString(drawing)
     # If the PNG image is really included, the size is over 10k.
     assert len(result) > 10000
Ejemplo n.º 17
0
def output_svg_planner(output_format="buffer", file_format="svg", filename=None, year=None):
    if year is None:
        year = datetime.date.today().year

    dwg = DrawingToMemory(filename, size=add_mm_to_sizes(A0_size), profile="tiny")

    date_rect_pos = (10, 10)
    date_rect_size = (30, 64)

    date_rect_style = _make_style(200, 200, 200)
    date_rect_style_weekend = _make_style(244, 44, 440)
    style_vacante = _make_style(208, 255, 156)

    special_dates = (((datetime.date(2015, 2, 2), datetime.date(2015, 2, 6)), style_vacante),
                     ((datetime.date(2015, 6, 15), datetime.date(2015, 8, 31)), style_vacante))

    events = [Event((datetime.date(2015, 8, 15), datetime.date(2015, 8, 24)), (255, 255, 89), "CCL2015"),
              Event((datetime.date(2015, 3, 15), datetime.date(2015, 5, 15)), (240, 37, 89), "TEST LONG EVENT"),
              Event((datetime.date(2015, 3, 18), datetime.date(2015, 4, 20)), (37, 89, 240), "TEST OVERRIDE"),
              Event((datetime.date(2015, 2, 18), datetime.date(2015, 3, 20)), (37, 89, 240), "TEST OVERRIDE 2 "),
              Event((datetime.date(2015, 3, 22), datetime.date(2015, 3, 25)), (255, 255, 89), "TEST OVERRIDE 3")]

    events.sort(key=lambda x: x.start_date)

    month_names = ["Ian", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"]

    for month in range(1, 13):
        date_start = datetime.date(year, month, 1)
        month_offset = date_start.weekday()
        date_rect_pos = (date_rect_pos[0] + date_rect_size[0] * month_offset, date_rect_pos[1])

        if month == 12:
            date_end = datetime.date(year + 1, 1, 1) - datetime.timedelta(days=1)
        else:
            date_end = datetime.date(year, month + 1, 1) - datetime.timedelta(days=1)

        date_range = [date_start + datetime.timedelta(days=i) for i in range(0, (date_end - date_start).days + 1)]
        date_events = {date: [i for i in range(1, MAX_EVENTS + 1)] for date in date_range}

        month_text_position = (date_rect_pos[0] - date_rect_size[0] / 2, date_rect_pos[1] + 0.33 * date_rect_size[1])
        dwg.add(dwg.text("%s" % month_names[month - 1],
                         insert=add_mm_to_sizes(month_text_position),
                         font_family=FONT_NAME,
                         font_size=add_mm_to_sizes(8),
                         text_anchor="middle"))

        for day in date_range:
            style = date_rect_style
            for special_style in special_dates:
                if date_in_range(day, special_style[0]):
                    style = special_style[1]
            style = style if day.weekday() < 5 else date_rect_style_weekend

            grp = dwg.g()
            grp.add(dwg.rect(insert=add_mm_to_sizes(date_rect_pos), size=add_mm_to_sizes(date_rect_size), **style))

            day_text_position = (date_rect_pos[0] + date_rect_size[0] * 0.75,
                                 date_rect_pos[1] + 0.90 * date_rect_size[1])

            grp.add(dwg.text("%s" % day.day,
                             insert=add_mm_to_sizes(day_text_position),
                             font_family=FONT_NAME,
                             font_size=add_mm_to_sizes(8),
                             text_anchor="middle"))

            date_rect_pos = (date_rect_pos[0] + date_rect_size[0], date_rect_pos[1])
            dwg.add(grp)

        for event in events:
            if date_in_range(date_range[0], event.dates) \
                    or date_in_range(date_range[-1], event.dates) \
                    or date_range[0] <= event.start_date <= date_range[-1] \
                    or date_range[0] <= event.end_date <= date_range[-1]:

                event_start_date = max(date_range[0], event.start_date)
                event_end_date = min(date_range[-1], event.end_date)

                event_days = [d for d in date_range if event_start_date <= d <= event_end_date]

                if any([len(date_events[date]) > MAX_EVENTS for date in event_days]):
                    raise Exception("Too many events for month %s" % month_names[month - 1])

                for date in event_days:
                    if event not in date_events[date]:
                        date_events[date].append(event)

                if event.slot is None:
                    start_set = set(date_events[event_days[0]])
                    for day in event_days:
                        start_set = start_set & set(date_events[day])
                    start_set = sorted(list(start_set))
                    if len(start_set) == 0:
                        raise Exception("Not enough place to place event in month %s" % month_names[month - 1])
                    event.slot = start_set[0]

                for day in event_days:
                    date_events[day].remove(event.slot)

                event_x = (month_offset + event_start_date.day - 1) * date_rect_size[0] + 10
                event_width = ((event_end_date-event_start_date).days + 1) * date_rect_size[0]
                grp = dwg.g()

                event_position = (event_x, date_rect_pos[1] + (event.slot - 1) * EVENT_HEIGHT)
                grp.add(dwg.rect(insert=add_mm_to_sizes(event_position),
                                 size=add_mm_to_sizes((event_width, EVENT_HEIGHT)), **event.get_rect_style()))

                event_text_position = (event_x + 3, date_rect_pos[1] + (event.slot - 1) * EVENT_HEIGHT + 7)
                grp.add(dwg.text(event.name, insert=add_mm_to_sizes(event_text_position), **event.get_text_style()))
                dwg.add(grp)

        date_rect_pos = (10, date_rect_pos[1] + date_rect_size[1])

    # can use save_to_buffer() to get buffer.value()
    # can use save_to_fileobject(response) to write directly to response
    if output_format == "buffer":
        if file_format == "svg":
            svg = dwg.save_to_buffer()
            return svg
        elif file_format == "pdf":
            svg = dwg.draw_to_buffer()
            svg.seek(0)
            pdf = svg2rlg(svg)
            return renderPDF.drawToString(pdf)
    if output_format == "file":
        if file_format == "svg":
            dwg.save()
        if file_format == "pdf":
            pdf = svg2rlg(filename)
            renderPDF.drawToFile(pdf, filename + ".pdf")
    return