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
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)
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 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}
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}
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')
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
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
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
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
# 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)
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
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)
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
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