用c++创建处理RTL语言和复杂脚本的pdf



有没有人知道一个好的API,可以从c++中使用RTL语言(如阿拉伯语和希伯来语)以及复杂的脚本(如泰语和德文语)创建pdf ?我们目前使用的是Tracker的PDF API,它非常出色,但它除了LTR脚本之外什么都不能处理,而且RTL支持似乎并不是他们的优先考虑事项,因为这项支持已经承诺了将近2年,但似乎还没有实现。

如果商业的windows专用库是一个有效的选择,您可以尝试使用Amyuni PDF Creator ActiveX。该库提供了用于创建或编辑PDF文件的自定义API。你应该能够设置文本对象中的任何类型的文本,如果你首先将它包装为unicode在一个变体结构。

如果您的应用程序已经支持使用Windows GDI打印,您可以重用此代码并尝试使用Amyuni PDF转换器。这是一个经过微软认证的虚拟打印机驱动程序,可以生成PDF文件作为输出,并且可以从打印应用程序中完全控制。

对于Amyuni PDF转换器,有两种方法可以从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:示例代码上的阿拉伯语文本来自谷歌翻译,因此如果结果是无意义的,我提前道歉。

最新更新