#include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); QPrinter p; p.setOutputFormat(QPrinter::PdfFormat); p.setOutputFileName("Test.pdf"); p.setPdfVersion(QPagedPaintDevice::PdfVersion_1_6); p.setPaperSize(QPrinter::A4); p.setFullPage(true); QPainter painter; painter.begin(&p); QFont font("Meiryo", 14); painter.setFont(font); painter.translate(100, 100); painter.drawText(0, 0, 600, 300, Qt::TextWordWrap, u8"1.\n'Meiryo', standard font in Windows Japanese edition.\n\n" u8"Kangxi Radical Sun(U+2F47): '\u2F47'\n\n" u8"CJK Unified Ideograph Sun(U+65E5): '\u65E5'" u8" <- Copy and Paste this char from PDF, it should be U+65E5, but you get U+2F47.\n\n" u8"(PDF.js on Chrome or Firefox does not reproduce this probrem. Please try with Acrobat Reader.)"); QFont font2("Calibri", 14); painter.setFont(font2); painter.drawText(0, 300, 600, 300, Qt::TextWordWrap, u8"2.\nThe ToUnicode generation algorithm also has problems with European languages.\n\n" u8"'Calibri', standard font in Windows has ligatures,\n" u8"'ff' 'fi' 'fl' 'ffi' 'ffl' 'fb' 'ffb' 'fh' 'ffh' 'fj' 'ffj' 'fk' 'ft' 'fft' 'tf' 'ti' 'tt' 'ttf' 'tti'\n\n" u8"Copy and Paste these chars from PDF, you get correct text for first five, " u8"but fail for the last fourteen. Because there is no single unicode char for them.\n\n\n" u8"3.\nChanging the algorithm can affect various scripts. For example, Arabic.\n"); QFont font3("Arial", 44); painter.setFont(font3); painter.drawText(0, 600, 600, 200, Qt::TextWordWrap | Qt::RightToLeft | Qt::AlignRight, u8"\u0628\u0650\u0633\u0652\u0640\u0640\u0640\u0640\u0645\u0650 \u0627\u0644\u0644\u0651\u0647\u0650 \u0627\u0644\u0631\u064e\u0651\u062d\u0652\u0645\u0640\u064e\u0646\u0650 \u0627\u0644\u0631\u064e\u0651\u062d\u0650\u064a\u0645\n"); painter.setFont(font2); painter.drawText(0, 700, 600, 200, Qt::TextWordWrap, // u8"U+0E01 + U+0E31 + U+0E4A: '\u0E01\u0E31\u0E4A'\n" u8"There are several options on how to handle these complex chars. " u8"(ActualText or traditional ToUnicode using reverseMap(), see sample patch.) " u8"In above specific case, ActualText seems to work well, but should be checked for various scripts."); painter.end(); return 0; //a.exec(); }