使用C ++创建处理RTL语言和复杂脚本的PDF

时间:2013-05-01 09:50:30

标签: c++ pdf arabic right-to-left

有没有人知道一个好的API,可以从C ++中使用,用于创建具有RTL语言(如阿拉伯语和希伯来语)的PDF以及泰语和梵文这样的复杂脚本?我们目前正在使用Tracker的PDF API,它非常出色,但它不能处理LTR脚本以外的任何内容,而且似乎RTL支持并不是他们的优先考虑因为这种支持已经承诺了将近2年并且似乎没有即将到来。

1 个答案:

答案 0 :(得分:1)

如果商业Windows专用库是有效选项,则可以尝试使用Amyuni PDF Creator ActiveX。该库提供了用于创建或编辑PDF文件的自定义API。如果您首先将其作为unicode包裹在text object中,则应该能够在variant structure中设置任何类型的文本。

如果您的应用程序已经支持使用Windows GDI进行打印,您可以重新使用此代码并尝试使用Amyuni PDF Converter。这是Microsoft认证的虚拟打印机驱动程序,可生成PDF文件作为输出,并且可以完全控制印刷应用。

对于Amyuni PDF Converter,有两种方法可以使用C ++,您可以使用随库提供的C ++头文件,也可以将其用作提供相同功能的COM类。有关详情,请参阅documentation

为库提供了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:示例代码中的阿拉伯语文本是从谷歌翻译获得的,所以如果事实证明这是废话,我会提前道歉。