Fix PDF formatting (#2104)
This commit is contained in:
@@ -176,6 +176,7 @@ class NWBuildDocument:
|
|||||||
|
|
||||||
elif bFormat == nwBuildFmt.PDF:
|
elif bFormat == nwBuildFmt.PDF:
|
||||||
makeObj = ToQTextDocument(self._project)
|
makeObj = ToQTextDocument(self._project)
|
||||||
|
makeObj.disableAnchors()
|
||||||
filtered = self._setupBuild(makeObj)
|
filtered = self._setupBuild(makeObj)
|
||||||
makeObj.initDocument()
|
makeObj.initDocument()
|
||||||
yield from self._iterBuild(makeObj, filtered)
|
yield from self._iterBuild(makeObj, filtered)
|
||||||
|
|||||||
@@ -29,11 +29,12 @@ from pathlib import Path
|
|||||||
|
|
||||||
from PyQt5.QtCore import QMarginsF, QSizeF
|
from PyQt5.QtCore import QMarginsF, QSizeF
|
||||||
from PyQt5.QtGui import (
|
from PyQt5.QtGui import (
|
||||||
QColor, QFont, QFontMetricsF, QPageSize, QTextBlockFormat, QTextCharFormat,
|
QColor, QFont, QPageSize, QTextBlockFormat, QTextCharFormat, QTextCursor,
|
||||||
QTextCursor, QTextDocument
|
QTextDocument
|
||||||
)
|
)
|
||||||
from PyQt5.QtPrintSupport import QPrinter
|
from PyQt5.QtPrintSupport import QPrinter
|
||||||
|
|
||||||
|
from novelwriter import __version__
|
||||||
from novelwriter.constants import nwStyles, nwUnicode
|
from novelwriter.constants import nwStyles, nwUnicode
|
||||||
from novelwriter.core.project import NWProject
|
from novelwriter.core.project import NWProject
|
||||||
from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt
|
from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt
|
||||||
@@ -67,7 +68,7 @@ class ToQTextDocument(Tokenizer):
|
|||||||
super().__init__(project)
|
super().__init__(project)
|
||||||
self._document = QTextDocument()
|
self._document = QTextDocument()
|
||||||
self._document.setUndoRedoEnabled(False)
|
self._document.setUndoRedoEnabled(False)
|
||||||
self._document.setDocumentMargin(0)
|
self._document.setDocumentMargin(0.0)
|
||||||
|
|
||||||
self._usedNotes: dict[str, int] = {}
|
self._usedNotes: dict[str, int] = {}
|
||||||
self._usedFields: list[tuple[int, str]] = []
|
self._usedFields: list[tuple[int, str]] = []
|
||||||
@@ -76,6 +77,7 @@ class ToQTextDocument(Tokenizer):
|
|||||||
self._bold = QFont.Weight.Bold
|
self._bold = QFont.Weight.Bold
|
||||||
self._normal = QFont.Weight.Normal
|
self._normal = QFont.Weight.Normal
|
||||||
self._newPage = False
|
self._newPage = False
|
||||||
|
self._anchors = True
|
||||||
|
|
||||||
self._pageSize = QPageSize(QPageSize.PageSizeId.A4)
|
self._pageSize = QPageSize(QPageSize.PageSizeId.A4)
|
||||||
self._pageMargins = QMarginsF(20.0, 20.0, 20.0, 20.0)
|
self._pageMargins = QMarginsF(20.0, 20.0, 20.0, 20.0)
|
||||||
@@ -108,6 +110,11 @@ class ToQTextDocument(Tokenizer):
|
|||||||
self._newPage = state
|
self._newPage = state
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def disableAnchors(self) -> None:
|
||||||
|
"""Disable anchors for when writing to file."""
|
||||||
|
self._anchors = False
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Class Methods
|
# Class Methods
|
||||||
##
|
##
|
||||||
@@ -121,19 +128,18 @@ class ToQTextDocument(Tokenizer):
|
|||||||
self._document.clear()
|
self._document.clear()
|
||||||
self._document.setDefaultFont(self._textFont)
|
self._document.setDefaultFont(self._textFont)
|
||||||
|
|
||||||
qMetric = QFontMetricsF(self._textFont)
|
|
||||||
mPx = qMetric.ascent() # 1 em in pixels
|
|
||||||
fPt = self._textFont.pointSizeF()
|
fPt = self._textFont.pointSizeF()
|
||||||
|
fPx = fPt*96.0/72.0 # 1 em in pixels
|
||||||
|
|
||||||
# Scaled Sizes
|
# Scaled Sizes
|
||||||
# ============
|
# ============
|
||||||
|
|
||||||
self._mHead = {
|
self._mHead = {
|
||||||
BlockTyp.TITLE: (mPx * self._marginTitle[0], mPx * self._marginTitle[1]),
|
BlockTyp.TITLE: (fPx * self._marginTitle[0], fPx * self._marginTitle[1]),
|
||||||
BlockTyp.HEAD1: (mPx * self._marginHead1[0], mPx * self._marginHead1[1]),
|
BlockTyp.HEAD1: (fPx * self._marginHead1[0], fPx * self._marginHead1[1]),
|
||||||
BlockTyp.HEAD2: (mPx * self._marginHead2[0], mPx * self._marginHead2[1]),
|
BlockTyp.HEAD2: (fPx * self._marginHead2[0], fPx * self._marginHead2[1]),
|
||||||
BlockTyp.HEAD3: (mPx * self._marginHead3[0], mPx * self._marginHead3[1]),
|
BlockTyp.HEAD3: (fPx * self._marginHead3[0], fPx * self._marginHead3[1]),
|
||||||
BlockTyp.HEAD4: (mPx * self._marginHead4[0], mPx * self._marginHead4[1]),
|
BlockTyp.HEAD4: (fPx * self._marginHead4[0], fPx * self._marginHead4[1]),
|
||||||
}
|
}
|
||||||
|
|
||||||
hScale = self._scaleHeads
|
hScale = self._scaleHeads
|
||||||
@@ -145,12 +151,12 @@ class ToQTextDocument(Tokenizer):
|
|||||||
BlockTyp.HEAD4: (nwStyles.H_SIZES.get(4, 1.0) * fPt) if hScale else fPt,
|
BlockTyp.HEAD4: (nwStyles.H_SIZES.get(4, 1.0) * fPt) if hScale else fPt,
|
||||||
}
|
}
|
||||||
|
|
||||||
self._mText = (mPx * self._marginText[0], mPx * self._marginText[1])
|
self._mText = (fPx * self._marginText[0], fPx * self._marginText[1])
|
||||||
self._mMeta = (mPx * self._marginMeta[0], mPx * self._marginMeta[1])
|
self._mMeta = (fPx * self._marginMeta[0], fPx * self._marginMeta[1])
|
||||||
self._mSep = (mPx * self._marginSep[0], mPx * self._marginSep[1])
|
self._mSep = (fPx * self._marginSep[0], fPx * self._marginSep[1])
|
||||||
|
|
||||||
self._mIndent = mPx * 2.0
|
self._mIndent = fPx * 2.0
|
||||||
self._tIndent = mPx * self._firstWidth
|
self._tIndent = fPx * self._firstWidth
|
||||||
|
|
||||||
# Text Formats
|
# Text Formats
|
||||||
# ============
|
# ============
|
||||||
@@ -243,13 +249,16 @@ class ToQTextDocument(Tokenizer):
|
|||||||
"""Save the document as a PDF file."""
|
"""Save the document as a PDF file."""
|
||||||
m = self._pageMargins
|
m = self._pageMargins
|
||||||
|
|
||||||
printer = QPrinter(QPrinter.PrinterMode.PrinterResolution)
|
printer = QPrinter(QPrinter.PrinterMode.HighResolution)
|
||||||
|
printer.setDocName(self._project.data.name)
|
||||||
|
printer.setCreator(f"novelWriter/{__version__}")
|
||||||
printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat)
|
printer.setOutputFormat(QPrinter.OutputFormat.PdfFormat)
|
||||||
printer.setPageSize(self._pageSize)
|
printer.setPageSize(self._pageSize)
|
||||||
printer.setPageMargins(m.left(), m.top(), m.right(), m.bottom(), QPrinter.Unit.Millimeter)
|
printer.setPageMargins(m.left(), m.top(), m.right(), m.bottom(), QPrinter.Unit.Millimeter)
|
||||||
printer.setOutputFileName(str(path))
|
printer.setOutputFileName(str(path))
|
||||||
|
|
||||||
self._document.setPageSize(self._pageSize.size(QPageSize.Unit.Point))
|
self._document.documentLayout().setPaintDevice(printer)
|
||||||
|
self._document.setPageSize(QSizeF(printer.pageRect().size()))
|
||||||
self._document.print(printer)
|
self._document.print(printer)
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -344,18 +353,22 @@ class ToQTextDocument(Tokenizer):
|
|||||||
cFmt.setForeground(self._theme.text)
|
cFmt.setForeground(self._theme.text)
|
||||||
primary = None
|
primary = None
|
||||||
elif fmt == TextFmt.ANM_B:
|
elif fmt == TextFmt.ANM_B:
|
||||||
cFmt.setAnchor(True)
|
if self._anchors:
|
||||||
cFmt.setAnchorNames([data])
|
cFmt.setAnchor(True)
|
||||||
|
cFmt.setAnchorNames([data])
|
||||||
elif fmt == TextFmt.ANM_E:
|
elif fmt == TextFmt.ANM_E:
|
||||||
cFmt.setAnchor(False)
|
if self._anchors:
|
||||||
|
cFmt.setAnchor(False)
|
||||||
elif fmt == TextFmt.ARF_B:
|
elif fmt == TextFmt.ARF_B:
|
||||||
cFmt.setFontUnderline(True)
|
if self._anchors:
|
||||||
cFmt.setAnchor(True)
|
cFmt.setFontUnderline(True)
|
||||||
cFmt.setAnchorHref(data)
|
cFmt.setAnchor(True)
|
||||||
|
cFmt.setAnchorHref(data)
|
||||||
elif fmt == TextFmt.ARF_E:
|
elif fmt == TextFmt.ARF_E:
|
||||||
cFmt.setFontUnderline(False)
|
if self._anchors:
|
||||||
cFmt.setAnchor(False)
|
cFmt.setFontUnderline(False)
|
||||||
cFmt.setAnchorHref("")
|
cFmt.setAnchor(False)
|
||||||
|
cFmt.setAnchorHref("")
|
||||||
elif fmt == TextFmt.HRF_B:
|
elif fmt == TextFmt.HRF_B:
|
||||||
cFmt.setForeground(self._theme.link)
|
cFmt.setForeground(self._theme.link)
|
||||||
cFmt.setFontUnderline(True)
|
cFmt.setFontUnderline(True)
|
||||||
@@ -429,7 +442,7 @@ class ToQTextDocument(Tokenizer):
|
|||||||
cFmt.setForeground(self._theme.head if hCol else self._theme.text)
|
cFmt.setForeground(self._theme.head if hCol else self._theme.text)
|
||||||
cFmt.setFontWeight(self._bold if self._boldHeads else self._normal)
|
cFmt.setFontWeight(self._bold if self._boldHeads else self._normal)
|
||||||
cFmt.setFontPointSize(self._sHead.get(hType, 1.0))
|
cFmt.setFontPointSize(self._sHead.get(hType, 1.0))
|
||||||
if hKey:
|
if hKey and self._anchors:
|
||||||
cFmt.setAnchorNames([hKey])
|
cFmt.setAnchorNames([hKey])
|
||||||
cFmt.setAnchor(True)
|
cFmt.setAnchor(True)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user