PDF Output: Use less memory when writing out the PDF file

This commit is contained in:
Kovid Goyal 2012-09-02 00:44:18 +05:30
parent 4e20f776bc
commit def42a1da3

View File

@ -15,11 +15,12 @@ from PyQt4.Qt import (QEventLoop, QObject, QPrinter, QSizeF, Qt, QPainter,
QPixmap, QTimer, pyqtProperty, QString, QSize) QPixmap, QTimer, pyqtProperty, QString, QSize)
from PyQt4.QtWebKit import QWebView, QWebPage, QWebSettings from PyQt4.QtWebKit import QWebView, QWebPage, QWebSettings
from calibre.constants import filesystem_encoding
from calibre.ptempfile import PersistentTemporaryDirectory from calibre.ptempfile import PersistentTemporaryDirectory
from calibre.ebooks.pdf.pageoptions import (unit, paper_size, orientation) from calibre.ebooks.pdf.pageoptions import (unit, paper_size, orientation)
from calibre.ebooks.pdf.outline_writer import Outline from calibre.ebooks.pdf.outline_writer import Outline
from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata import authors_to_string
from calibre.ptempfile import PersistentTemporaryFile from calibre.ptempfile import PersistentTemporaryFile, TemporaryFile
from calibre import (__appname__, __version__, fit_image, isosx, force_unicode) from calibre import (__appname__, __version__, fit_image, isosx, force_unicode)
from calibre.ebooks.oeb.display.webview import load_html from calibre.ebooks.oeb.display.webview import load_html
@ -350,8 +351,12 @@ class PDFWriter(QObject): # {{{
if self.metadata.tags: if self.metadata.tags:
self.doc.keywords = self.metadata.tags self.doc.keywords = self.metadata.tags
self.outline(self.doc) self.outline(self.doc)
raw = self.doc.write() with TemporaryFile(u'pdf_out.pdf') as tf:
self.out_stream.write(raw) if isinstance(tf, unicode):
tf = tf.encode(filesystem_encoding)
self.doc.save(tf)
with open(tf, 'rb') as src:
shutil.copyfileobj(src, self.out_stream)
self.render_succeeded = True self.render_succeeded = True
finally: finally:
self._delete_tmpdir() self._delete_tmpdir()