winziprint: delete temp files in finally block

This commit is contained in:
2023-10-19 21:21:21 +02:00
parent 43c1c27382
commit 5c924c944c

View File

@ -19,29 +19,34 @@ def convert(input_file_names: list[str], output_file_name: str, encoding: str =
page_nums = [] page_nums = []
tmp_file_names = [] tmp_file_names = []
for i in range(0, len(input_file_names), BATCH_SIZE): try:
batch = input_file_names[i:i + BATCH_SIZE] for i in range(0, len(input_file_names), BATCH_SIZE):
documents = [] batch = input_file_names[i:i + BATCH_SIZE]
for file_name in batch: documents = []
html = weasyprint.HTML(file_name, encoding=encoding) for file_name in batch:
doc = html.render() html = weasyprint.HTML(file_name, encoding=encoding)
documents.append(doc) doc = html.render()
del html documents.append(doc)
all_pages = [p for doc in documents for p in doc.pages] del html
tmp_file_name = f'{output_file_name}.part.{i:0000}' all_pages = [p for doc in documents for p in doc.pages]
documents[0].copy(all_pages).write_pdf(tmp_file_name) tmp_file_name = f'{output_file_name}.part.{i:0000}'
tmp_file_names.append(tmp_file_name) documents[0].copy(all_pages).write_pdf(tmp_file_name)
page_nums += [len(doc.pages) for doc in documents] tmp_file_names.append(tmp_file_name)
del documents page_nums += [len(doc.pages) for doc in documents]
del all_pages del documents
gc.collect() del all_pages
gc.collect()
merger = pypdf.PdfWriter() merger = pypdf.PdfWriter()
for pdf in tmp_file_names: for pdf in tmp_file_names:
merger.append(pdf) merger.append(pdf)
os.remove(pdf) merger.write(output_file_name)
merger.write(output_file_name) merger.close()
merger.close() del merger
finally:
for pdf in tmp_file_names:
if os.path.isfile(pdf):
os.remove(pdf)
return page_nums return page_nums
@ -59,6 +64,8 @@ def _wrapper_convert(args: list[str], encoding: str = None) -> None:
msg = str(e).replace('\n', ' ') msg = str(e).replace('\n', ' ')
print(f'error: {msg}', flush=True) print(f'error: {msg}', flush=True)
traceback.print_exception(e) traceback.print_exception(e)
finally:
gc.collect()
def usage() -> None: def usage() -> None: