30 lines
1.7 KiB
C
30 lines
1.7 KiB
C
#pragma once
|
|
#include <QByteArray>
|
|
#include <QList>
|
|
|
|
// The only text/font is beyond the worker's initial 256-page metadata batch.
|
|
// This permits a real late font RPC, after a complete initial viewport exists.
|
|
inline QByteArray deferredFontPdf() {
|
|
QList<QByteArray> objects{"<< /Type /Catalog /Pages 2 0 R >>", QByteArray{},
|
|
"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>"};
|
|
QByteArray kids;
|
|
for (int page = 0; page < 257; ++page) {
|
|
const int pageId = objects.size() + 1, streamId = pageId + 1;
|
|
kids += QByteArray::number(pageId) + " 0 R ";
|
|
objects << "<< /Type /Page /Parent 2 0 R /MediaBox [0 0 595 842] /Resources << /Font << /F1 3 0 R >> >> /Contents "
|
|
+ QByteArray::number(streamId) + " 0 R >>";
|
|
const QByteArray content = page == 256 ? "BT /F1 24 Tf 40 700 Td (Late font) Tj ET\n" : "0.1 0.3 0.7 rg 40 40 500 740 re f\n";
|
|
objects << "<< /Length " + QByteArray::number(content.size()) + " >>\nstream\n" + content + "endstream";
|
|
}
|
|
objects[1] = "<< /Type /Pages /Count 257 /Kids [" + kids + "] >>";
|
|
QByteArray result = "%PDF-1.7\n"; QList<qsizetype> offsets{0};
|
|
for (qsizetype i = 0; i < objects.size(); ++i) {
|
|
offsets.append(result.size()); result += QByteArray::number(i + 1) + " 0 obj\n" + objects[i] + "\nendobj\n";
|
|
}
|
|
const auto xref = result.size();
|
|
result += "xref\n0 " + QByteArray::number(offsets.size()) + "\n0000000000 65535 f \n";
|
|
for (qsizetype i = 1; i < offsets.size(); ++i) result += QByteArray::number(offsets[i]).rightJustified(10, '0') + " 00000 n \n";
|
|
result += "trailer\n<< /Size " + QByteArray::number(offsets.size()) + " /Root 1 0 R >>\nstartxref\n" + QByteArray::number(xref) + "\n%%EOF\n";
|
|
return result;
|
|
}
|