diff --git a/src/calibre/ebooks/metadata/pdf.py b/src/calibre/ebooks/metadata/pdf.py index b4bc6f962f..2d1935539e 100644 --- a/src/calibre/ebooks/metadata/pdf.py +++ b/src/calibre/ebooks/metadata/pdf.py @@ -8,7 +8,7 @@ from functools import partial from calibre import prints from calibre.constants import plugins -from calibre.ebooks.metadata import MetaInformation, string_to_authors, authors_to_string +from calibre.ebooks.metadata import MetaInformation, string_to_authors pdfreflow, pdfreflow_error = plugins['pdfreflow'] @@ -56,66 +56,10 @@ def get_metadata(stream, cover=True): get_quick_metadata = partial(get_metadata, cover=False) -import cStringIO -from threading import Thread - -from calibre.utils.pdftk import set_metadata as pdftk_set_metadata -from calibre.utils.podofo import set_metadata as podofo_set_metadata, Unavailable +from calibre.utils.podofo import set_metadata as podofo_set_metadata def set_metadata(stream, mi): stream.seek(0) - try: - return podofo_set_metadata(stream, mi) - except Unavailable: - pass - try: - return pdftk_set_metadata(stream, mi) - except: - pass - set_metadata_pypdf(stream, mi) - - -class MetadataWriter(Thread): - - def __init__(self, out_pdf, buf): - self.out_pdf = out_pdf - self.buf = buf - Thread.__init__(self) - self.daemon = True - - def run(self): - try: - self.out_pdf.write(self.buf) - except RuntimeError: - pass - -def set_metadata_pypdf(stream, mi): - # Use a StringIO object for the pdf because we will want to over - # write it later and if we are working on the stream directly it - # could cause some issues. - - from pyPdf import PdfFileReader, PdfFileWriter - raw = cStringIO.StringIO(stream.read()) - orig_pdf = PdfFileReader(raw) - title = mi.title if mi.title else orig_pdf.documentInfo.title - author = authors_to_string(mi.authors) if mi.authors else orig_pdf.documentInfo.author - out_pdf = PdfFileWriter(title=title, author=author) - out_str = cStringIO.StringIO() - writer = MetadataWriter(out_pdf, out_str) - for page in orig_pdf.pages: - out_pdf.addPage(page) - writer.start() - writer.join(10) # Wait 10 secs for writing to complete - out_pdf.killed = True - writer.join() - if out_pdf.killed: - print 'Failed to set metadata: took too long' - return - - stream.seek(0) - stream.truncate() - out_str.seek(0) - stream.write(out_str.read()) - stream.seek(0) + return podofo_set_metadata(stream, mi)