1

我正在尝试从中生成 PDF 文件QTextDocument,它工作得很好。当我只想为特定<p></p>对象使用自定义字体时,问题就出现了。我尝试使用标准方法QFontDatabase::addApplicationFont()成功地将字体加载到应用程序中,但由于某种原因,它写入了所有QString添加到此字体中的基础变量,messageBody而不是由 指定的QTextFocument.setDefaultFont(),甚至是手动的 via style={font-family:}

我做错了,还是在这里忽略了某些东西,或者这是某种错误?

主文件

#include <QApplication>
#include <QPrinter>
#include <QTextDocument>
#include <QFontDatabase>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc,argv);

        int id =  QFontDatabase::addApplicationFont(":/BarcodeAV.ttf");
        qDebug()<< "font"<< QFontDatabase::applicationFontFamilies(id)[0];
        QString serialNumber = "ABC123";
        QString messageBody;
        messageBody += "<p style='font-size: large;'><b>Serial Number:</b> " + serialNumber + "</p>";
        messageBody += "<p style='font-size: large; font-family=\"Console\"'><b>Serial Number:</b> " + serialNumber + "</p></p>";

        QTextDocument document;
        document.setHtml(messageBody);

        QPrinter printer(QPrinter::PrinterResolution);
        printer.setOutputFormat(QPrinter::PdfFormat);
        printer.setOutputFileName("test.pdf");

        document.print(&printer);

        return 0;
}


输出 PDF 如下所示:

在此处输入图像描述

我无法理解为什么/如何将基本QString(messageBody)与连接到它的那些(serialNumber)区分开来?


编辑::尝试实施下面建议的 style.css 解决方案后输出没有变化

主文件

#include <QApplication>
#include <QPrinter>
#include <QTextDocument>
#include <QFontDatabase>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc,argv);

        int id =  QFontDatabase::addApplicationFont(":/BarcodeAV.ttf");
        qDebug()<< "font"<< QFontDatabase::applicationFontFamilies(id)[0];
        QString serialNumber = "ABC123";
        QString messageBody;
        messageBody += "<p style='font-size: large;'><b>Serial Number:</b> " + serialNumber + "</p>";
        messageBody += "<p style='font-size: large;'><b>Serial Number:</b>  <span id=\"barcode\">" + serialNumber + "</span></p>";

        QTextDocument document;
        QFile file(":/style.css");
        if(file.open(QFile::ReadOnly|QFile::Text)){
            qDebug() << "Opened CSS";
        }
        else{
            qDebug() << "Failed to open CSS:" << file.errorString();
        }
        document.setDefaultStyleSheet(file.readAll());
        document.setHtml(messageBody);

        QPrinter printer(QPrinter::PrinterResolution);
        printer.setOutputFormat(QPrinter::PdfFormat);
        printer.setOutputFileName("test.pdf");

        document.print(&printer);

        return 0;
}

样式.css

@font-face {
font-family: K-O-D-E-39 Hidden;
src: url(':/BarcodeAV.ttf');
}

#barcode{
font-family: 'K-O-D-E-39 Hidden';
font-size: larger;
}
4

1 回答 1

1

为了能够以一种非常简单的方式为每个标签设置属性,建议创建一个.css文件,在这个文件中,我们将使用@font-face通过 url 加载源,在这种情况下我的源是KODE-39 Hidden并且文件是barcode.ttf:

@font-face {
  font-family: K-O-D-E-39 Hidden;
  src: url('qrc:/barcode.ttf');
}
#barcode{
    font-family: 'K-O-D-E-39 Hidden';
    font-size: larger;
}

然后通过添加字体addApplicationFont(),我们通过 id 建立barcode。css也必须通过QTextDocument的setTefaultStyleSheet方法添加:

int main(int argc, char *argv[])
{
    QApplication a(argc,argv);

    int id =  QFontDatabase::addApplicationFont(":/barcode.ttf");
    qDebug()<< "font"<< QFontDatabase::applicationFontFamilies(id)[0];
    QString serialNumber = "ABC123";
    QString messageBody;
    messageBody += "<p style='font-size: large;'><b>Serial Number:</b> " + serialNumber + "</p>";
    messageBody += "<p style='font-size: large;'><b>Serial Number:</b>  <span id=\"barcode\">" + serialNumber + "</span></p>";

    QTextDocument document;
    QFile file(":/style.css");
    file.open(QFile::ReadOnly|QFile::Text);
    document.setDefaultStyleSheet(file.readAll());
    document.setHtml(messageBody);

    QPrinter printer(QPrinter::PrinterResolution);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName("test.pdf");

    document.print(&printer);

    return 0;
}

输出:

在此处输入图像描述

完整的示例可以在以下链接中找到。

于 2018-01-17T18:13:35.163 回答