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