У меня есть фрагмент кода ObjC от великолепного VFR PDF Viewer на GIT.
Он использует CGPDFDictionaryGetString
для получения указателя на строку из аннотации PDF. Затем он использует преобразование байтового указателя для получения окончательной строки.
В Monotouch нет CGPDFDictionary.GetString()
, а только .GetName()
- это единственный метод, который возвращает строку, поэтому я предположил, что это должен быть правильный метод, но он не работает.
Я могу получить массивы, словари, числа с плавающей запятой и целые числа просто отлично - кажется, что только строки не работают.
См. Примеры небольших кодов ниже.
CGPDFStringRef uriString = NULL;
// This returns TRUE in the ObjC version and uriString is a valid pointer to a string.
if (CGPDFDictionaryGetString(actionDictionary, "URI", &uriString) == true)
{
// Do some pointer magic - how to do this in MT? Do I have to at all?
const char *uri = (const char *)CGPDFStringGetBytePtr(uriString);
// *uri now contains a URL, I can see it in the debugger.
}
Я перевел это так:
string sUri = null;
// This returns FALSE. Hence my sUri is NULL. Seems like GetName() is not the analogy to CGPDFDictionaryGetString.
if(oActionDic.GetName("URI", out sUri))
{
// I never get here.
}
EDIT:
Глядя на источники Mono, я вижу это в ветке Master:
// TODO: GetString -> возвращает CGPDFString
Переключение на ветку 4.2 показывает, что она, кажется, там есть. Поэтому я скопировал код оттуда, но у меня есть две проблемы:
- Я получаю сообщение об ошибке с ключевым словом unsafe. Он говорит мне, чтобы добавить «небезопасный» параметр командной строки. Что это такое и стоит ли добавлять это? Где?
- Кажется, что все равно работает, но приложение зависает при получении CGPDFString.
[DllImport (Constants.CoreGraphicsLibrary)]
public extern static IntPtr CGPDFStringGetLength (IntPtr pdfStr);
[DllImport (Constants.CoreGraphicsLibrary)]
public extern static IntPtr CGPDFStringGetBytePtr (IntPtr pdfStr);
public static string PdfStringToString (IntPtr pdfString)
{
if (pdfString == IntPtr.Zero)
return null;
int n = (int)CGPDFStringGetLength (pdfString);
unsafe
{
return new String ((char *)CGPDFStringGetBytePtr (pdfString), 0, n);
}
}
[DllImport (Constants.CoreGraphicsLibrary)]
extern static bool CGPDFDictionaryGetString (IntPtr handle, string key, out IntPtr result);
public static bool GetStringFromPdfDictionary (CGPDFDictionary oPdfDic, string key, out string result)
{
if (key == null)
throw new ArgumentNullException ("key");
IntPtr res;
if (CGPDFDictionaryGetString (oPdfDic.Handle, key, out res))
{
result = PdfStringToString (res);
return true;
}
result = null;
return false;
}