From 7469c920f22551d6a0b49b2224221be8c8991eed Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 17 Jun 2023 09:55:52 +0530 Subject: [PATCH] Append all at once --- src/calibre/ebooks/pdf/html_writer.py | 11 ++++------- src/calibre/utils/podofo/doc.cpp | 6 +++++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/calibre/ebooks/pdf/html_writer.py b/src/calibre/ebooks/pdf/html_writer.py index 08d203cd4b..623e914898 100644 --- a/src/calibre/ebooks/pdf/html_writer.py +++ b/src/calibre/ebooks/pdf/html_writer.py @@ -1134,7 +1134,7 @@ def convert(opf_path, opts, metadata=None, output_path=None, log=default_log, co results = manager.convert_html_files(jobs, settle_time=1, has_maths=has_maths) num_pages = 0 page_margins_map = [] - log(f'Merging {len(margin_files)} PDF render results, this could take a while...') + all_docs = [] for i, margin_file in enumerate(margin_files): name = margin_file.name data = results[name] @@ -1145,13 +1145,10 @@ def convert(opf_path, opts, metadata=None, output_path=None, log=default_log, co doc_pages = doc.page_count() page_margins_map.extend(repeat(resolve_margins(margin_file.margins, page_layout), doc_pages)) num_pages += doc_pages + all_docs.append(doc) - if pdf_doc is None: - pdf_doc = doc - else: - st = monotonic() - pdf_doc.append(doc) - log(f'Merged ({i}/{len(margin_files)-1}) in {monotonic()-st:.1f} seconds') + pdf_doc = all_docs[0] + pdf_doc.append(*all_docs[1:]) page_number_display_map = get_page_number_display_map(manager, opts, num_pages, log) diff --git a/src/calibre/utils/podofo/doc.cpp b/src/calibre/utils/podofo/doc.cpp index 6f1220c9b9..66a6499bde 100644 --- a/src/calibre/utils/podofo/doc.cpp +++ b/src/calibre/utils/podofo/doc.cpp @@ -11,6 +11,7 @@ #include #include #include +#include using namespace pdf; @@ -365,12 +366,15 @@ PDFDoc_append(PDFDoc *self, PyObject *args) { PdfMemDocument *dest = self->doc; try { + std::vector docs(PyTuple_GET_SIZE(args)); for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(args); i++) { PyObject *doc = PyTuple_GET_ITEM(args, i); int typ = PyObject_IsInstance(doc, (PyObject*)&PDFDocType); if (typ == -1) return NULL; if (typ == 0) { PyErr_SetString(PyExc_TypeError, "You must pass a PDFDoc instance to this method"); return NULL; } - const PdfMemDocument *src = ((PDFDoc*)doc)->doc; + docs[i] = ((PDFDoc*)doc)->doc; + } + for (auto src : docs) { std::unordered_map ref_map; std::unordered_map page_parent_map; const unsigned initial_page_count = dest->GetPages().GetCount();