|
| 1 | +# |
| 2 | +# This sample uses the PyPDF2 library for combining pdfs together to get the full pdf for all the views in a |
| 3 | +# workbook. |
| 4 | +# |
| 5 | +# You will need to do `pip install PyPDF2` to use this sample. |
| 6 | +# |
| 7 | + |
| 8 | +import argparse |
| 9 | +import getpass |
| 10 | +import logging |
| 11 | +import tempfile |
| 12 | +import shutil |
| 13 | +import functools |
| 14 | +import os.path |
| 15 | + |
| 16 | +import tableauserverclient as TSC |
| 17 | +try: |
| 18 | + import PyPDF2 |
| 19 | +except ImportError: |
| 20 | + print('Please `pip install PyPDF2` to use this sample') |
| 21 | + import sys |
| 22 | + sys.exit(1) |
| 23 | + |
| 24 | + |
| 25 | +def get_views_for_workbook(server, workbook_id): # -> Iterable of views |
| 26 | + workbook = server.workbooks.get_by_id(workbook_id) |
| 27 | + server.workbooks.populate_views(workbook) |
| 28 | + return workbook.views |
| 29 | + |
| 30 | + |
| 31 | +def download_pdf(server, tempdir, view): # -> Filename to downloaded pdf |
| 32 | + logging.info("Exporting {}".format(view.id)) |
| 33 | + destination_filename = os.path.join(tempdir, view.id) |
| 34 | + server.views.populate_pdf(view) |
| 35 | + with file(destination_filename, 'wb') as f: |
| 36 | + f.write(view.pdf) |
| 37 | + |
| 38 | + return destination_filename |
| 39 | + |
| 40 | + |
| 41 | +def combine_into(dest_pdf, filename): # -> None |
| 42 | + dest_pdf.append(filename) |
| 43 | + return dest_pdf |
| 44 | + |
| 45 | + |
| 46 | +def cleanup(tempdir): |
| 47 | + shutil.rmtree(tempdir) |
| 48 | + |
| 49 | + |
| 50 | +def main(): |
| 51 | + parser = argparse.ArgumentParser(description='Export to PDF all of the views in a workbook') |
| 52 | + parser.add_argument('--server', '-s', required=True, help='server address') |
| 53 | + parser.add_argument('--site', '-S', default=None, help='Site to log into, do not specify for default site') |
| 54 | + parser.add_argument('--username', '-u', required=True, help='username to sign into server') |
| 55 | + parser.add_argument('--password', '-p', default=None, help='password for the user') |
| 56 | + |
| 57 | + parser.add_argument('--logging-level', '-l', choices=['debug', 'info', 'error'], default='error', |
| 58 | + help='desired logging level (set to error by default)') |
| 59 | + parser.add_argument('--file', '-f', default='out.pdf', help='filename to store the exported data') |
| 60 | + parser.add_argument('resource_id', help='LUID for the workbook') |
| 61 | + |
| 62 | + args = parser.parse_args() |
| 63 | + |
| 64 | + if args.password is None: |
| 65 | + password = getpass.getpass("Password: ") |
| 66 | + else: |
| 67 | + password = args.password |
| 68 | + |
| 69 | + # Set logging level based on user input, or error by default |
| 70 | + logging_level = getattr(logging, args.logging_level.upper()) |
| 71 | + logging.basicConfig(level=logging_level) |
| 72 | + |
| 73 | + tempdir = tempfile.mkdtemp('tsc') |
| 74 | + logging.debug("Saving to tempdir: %s", tempdir) |
| 75 | + |
| 76 | + tableau_auth = TSC.TableauAuth(args.username, password, args.site) |
| 77 | + server = TSC.Server(args.server, use_server_version=True) |
| 78 | + try: |
| 79 | + with server.auth.sign_in(tableau_auth): |
| 80 | + get_list = functools.partial(get_views_for_workbook, server) |
| 81 | + download = functools.partial(download_pdf, server, tempdir) |
| 82 | + |
| 83 | + downloaded = (download(x) for x in get_list(args.resource_id)) |
| 84 | + output = reduce(combine_into, downloaded, PyPDF2.PdfFileMerger()) |
| 85 | + with file(args.file, 'wb') as f: |
| 86 | + output.write(f) |
| 87 | + finally: |
| 88 | + cleanup(tempdir) |
| 89 | + |
| 90 | + |
| 91 | +if __name__ == '__main__': |
| 92 | + main() |
0 commit comments