Создание PDF-файлов на C ++, которые обрабатывают языки RTL и сложные сценарии

Кто-нибудь знает хороший API, используемый из C ++, для создания PDF-файлов с RTL-языками, такими как арабский и иврит, а также со сложными сценариями, такими как тайский и деванагари? В настоящее время мы используем превосходный PDF API Tracker, но он не обрабатывает ничего, кроме сценариев LTR, и кажется, что поддержка RTL не является для них приоритетом, так как эта поддержка была обещана почти 2 года и, похоже, не является предстоящий.

1

Решение

Если коммерческая библиотека только для Windows является допустимым вариантом, вы можете попробовать Amyuni PDF Creator ActiveX. Библиотека предоставляет пользовательский API для создания или редактирования PDF-файлов. Вы должны быть в состоянии установить любой вид текста в текстовый объект если вы оберните его сначала как Unicode в вариантная структура.

Если ваше приложение уже поддерживает печать с использованием Windows GDI, вы можете повторно использовать этот код и попробовать вместо Amyuni PDF Converter.Это сертифицированный Microsoft драйвер виртуального принтера, который генерирует PDF-файлы в качестве вывода и которым можно полностью управлять из приложения печати.

Для Amyuni PDF Converter существует два способа использования его из C ++: вы можете использовать заголовочный файл C ++, который поставляется вместе с библиотекой, или вы можете использовать его как класс COM, который предоставляет те же функции. Более подробную информацию можно найти в документация.

Библиотека снабжена примером кода для C #, VB.Net и C ++. Вот краткая версия одного из примеров:

#include "stdafx.h"#include "CDIntf450.h"#pragma comment (lib, "CDIntf450.lib")

#define AMYUNI_PRINTER          "My PDF Converter"#define AMYUNI_LICENSE          "Amyuni Developer Evaluation"#define AMYUNI_ACTIVATION_CODE  "0ABCCD...567B3"
//Get a handle to Amyuni PDF Converter
HANDLE hPrinter = DriverInit(AMYUNI_PRINTER);
if(hDC == NULL){ /* error handling */ }

//Set the Amyuni PDF Converter as the default printer
CDISetDefaultPrinter ( hPrinter );

//Configure the path for the output file
SetFileNameOptions ( hPrinter, NoPrompt | UseFileName );
SetDefaultFileName (hPrinter,  _T("c:\\temp\\PrintSomeThing.pdf") );

// Activate your license key
EnablePrinter ( hPrinter, AMYUNI_LICENSE, AMYUNI_ACTIVATION_CODE);

HDC hDC = CreateDC( "WINSPOOL" , AMYUNI_PRINTER, NULL, NULL);
if(hDC == NULL){ /* error handling */ }

DOCINFO di;
::ZeroMemory (&di, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = _T("myDocTitle");
StartDoc(hDC, &di);
StartPage(hDC);

//Print something
TextOutW(hDC, 200, 200, L"هذا هو اختبار"), lstrlenW (L"هذا هو اختبار")));
TextOut(hDC, 0, 400, _T("My PDF App"), lstrlen (_T("My PDF App")));
EndPage(hDC);
EndDoc(hDC);

//Clean Up
DeleteDC(hDC);
RestoreDefaultPrinter( hPrinter );
SetFileNameOptions ( hPrinter, 0 );
DriverEnd( hPrinter );

Отказ от ответственности 1: В настоящее время я работаю в Amyuni Technologies.
Отказ от ответственности 2: Часть текста на арабском языке в примере кода была получена из Google Translate, поэтому я заранее извиняюсь, если это окажется чепухой.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]