File indexing completed on 2024-05-05 04:01:43

0001 /*
0002     SPDX-FileCopyrightText: 2019 Friedrich W. H. Kossebau <kossebau@kde.org>
0003 
0004     SPDX-License-Identifier: MIT
0005 */
0006 
0007 #include "codepdfprinter.h"
0008 
0009 #include <KSyntaxHighlighting/Definition>
0010 #include <KSyntaxHighlighting/SyntaxHighlighter>
0011 #include <KSyntaxHighlighting/Theme>
0012 
0013 #include <QDebug>
0014 #include <QFile>
0015 #include <QFontDatabase>
0016 #include <QFontMetrics>
0017 #include <QPrinter>
0018 
0019 CodePdfPrinter::CodePdfPrinter()
0020     : m_highlighter(new KSyntaxHighlighting::SyntaxHighlighter(&m_document))
0021 {
0022     const auto font = QFontDatabase::systemFont(QFontDatabase::FixedFont);
0023     const QFontMetrics fontMetrics(font);
0024     m_document.setDefaultFont(font);
0025 
0026     QTextOption textOption(Qt::AlignTop | Qt::AlignLeft);
0027     textOption.setTabStopDistance(8 * fontMetrics.horizontalAdvance(QLatin1Char(' ')));
0028     textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
0029     m_document.setDefaultTextOption(textOption);
0030 
0031     // light theme for "printing" on white PDF "paper"
0032     const auto theme = m_repository.defaultTheme(KSyntaxHighlighting::Repository::LightTheme);
0033     m_highlighter->setTheme(theme);
0034 }
0035 
0036 CodePdfPrinter::~CodePdfPrinter() = default;
0037 
0038 bool CodePdfPrinter::openSourceFile(const QString &fileName)
0039 {
0040     QFile f(fileName);
0041     if (!f.open(QFile::ReadOnly)) {
0042         qWarning() << "Failed to open" << fileName << ":" << f.errorString();
0043         return false;
0044     }
0045 
0046     const auto def = m_repository.definitionForFileName(fileName);
0047     m_highlighter->setDefinition(def);
0048 
0049     m_document.setPlainText(QString::fromUtf8(f.readAll()));
0050     return true;
0051 }
0052 
0053 void CodePdfPrinter::printPdfFile(const QString &fileName)
0054 {
0055     QPrinter printer(QPrinter::PrinterResolution);
0056     printer.setOutputFormat(QPrinter::PdfFormat);
0057     printer.setPageSize(QPageSize(QPageSize::A4));
0058     printer.setOutputFileName(fileName);
0059 
0060     m_document.print(&printer);
0061 }