#pragma once #include #include // 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 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 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; }