Make output of QPdfWriter more PDF/A-1b compliant
Add the recommended comment line after the header line, which contains 4 bytes with character codes > 128 (see PDF 32000 7.5.2), add the missing EOL markers in front of any 'endstream' and 'endobj' keywords and modify writeString to use '()' for empty strings (no UTF-16 encoding needed in that case). Change-Id: I17aabde0ba06061ba14e37405e02edf47f3ddd81 Reviewed-by: Andy Shaw <andy.shaw@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
f0ee4ed0a2
commit
146f6d261b
@ -1465,6 +1465,7 @@ void QPdfEnginePrivate::writeHeader()
|
|||||||
addXrefEntry(0,false);
|
addXrefEntry(0,false);
|
||||||
|
|
||||||
xprintf("%%PDF-1.4\n");
|
xprintf("%%PDF-1.4\n");
|
||||||
|
xprintf("%%\303\242\303\243\n");
|
||||||
|
|
||||||
writeInfo();
|
writeInfo();
|
||||||
|
|
||||||
@ -1597,7 +1598,7 @@ void QPdfEnginePrivate::embedFont(QFontSubset *font)
|
|||||||
"/CapHeight " << properties.capHeight.toReal()*scale << "\n"
|
"/CapHeight " << properties.capHeight.toReal()*scale << "\n"
|
||||||
"/StemV " << properties.lineWidth.toReal()*scale << "\n"
|
"/StemV " << properties.lineWidth.toReal()*scale << "\n"
|
||||||
"/FontFile2 " << fontstream << "0 R\n"
|
"/FontFile2 " << fontstream << "0 R\n"
|
||||||
">> endobj\n";
|
">>\nendobj\n";
|
||||||
write(descriptor);
|
write(descriptor);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@ -1615,7 +1616,7 @@ void QPdfEnginePrivate::embedFont(QFontSubset *font)
|
|||||||
"stream\n";
|
"stream\n";
|
||||||
write(header);
|
write(header);
|
||||||
int len = writeCompressed(fontData);
|
int len = writeCompressed(fontData);
|
||||||
write("endstream\n"
|
write("\nendstream\n"
|
||||||
"endobj\n");
|
"endobj\n");
|
||||||
addXrefEntry(length_object);
|
addXrefEntry(length_object);
|
||||||
xprintf("%d\n"
|
xprintf("%d\n"
|
||||||
@ -1642,7 +1643,7 @@ void QPdfEnginePrivate::embedFont(QFontSubset *font)
|
|||||||
xprintf("<< /Length %d >>\n"
|
xprintf("<< /Length %d >>\n"
|
||||||
"stream\n", touc.length());
|
"stream\n", touc.length());
|
||||||
write(touc);
|
write(touc);
|
||||||
write("endstream\n"
|
write("\nendstream\n"
|
||||||
"endobj\n");
|
"endobj\n");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@ -1748,7 +1749,7 @@ void QPdfEnginePrivate::writePage()
|
|||||||
xprintf("stream\n");
|
xprintf("stream\n");
|
||||||
QIODevice *content = currentPage->stream();
|
QIODevice *content = currentPage->stream();
|
||||||
int len = writeCompressed(content);
|
int len = writeCompressed(content);
|
||||||
xprintf("endstream\n"
|
xprintf("\nendstream\n"
|
||||||
"endobj\n");
|
"endobj\n");
|
||||||
|
|
||||||
addXrefEntry(pageStreamLength);
|
addXrefEntry(pageStreamLength);
|
||||||
@ -1794,7 +1795,13 @@ int QPdfEnginePrivate::addXrefEntry(int object, bool printostr)
|
|||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QPdfEnginePrivate::printString(const QString &string) {
|
void QPdfEnginePrivate::printString(const QString &string)
|
||||||
|
{
|
||||||
|
if (string.isEmpty()) {
|
||||||
|
write("()");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// The 'text string' type in PDF is encoded either as PDFDocEncoding, or
|
// The 'text string' type in PDF is encoded either as PDFDocEncoding, or
|
||||||
// Unicode UTF-16 with a Unicode byte order mark as the first character
|
// Unicode UTF-16 with a Unicode byte order mark as the first character
|
||||||
// (0xfeff), with the high-order byte first.
|
// (0xfeff), with the high-order byte first.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user