ما الذي يسبب Ghostscript لإرجاع خطأ -100؟
-
30-09-2019 - |
سؤال
لذلك ، أنا أستخدم ماثيو إفرايم Ghostscriptsharp, ، وهو عبارة عن غلاف C# بسيط لـ Win32 Ghostscript DLL غير المدير في مشروع ASP.NET MVC الخاص بي. بعض الخلفية:
ما أحاول القيام به هو أن يكون لديك مستخدم يقوم بتحميل ملف PDF ، ثم تحويل هذا المستند إلى صورة يمكنني بعد ذلك حفظها في أي دليل أختاره (وكذلك القيام ببعض OOP لربط هذه الصورة الجديدة إلى موقعي) .
قررت استخدام فئة غلاف السيد إفرايم (GhostscriptSharp) لأنه كان بسيطًا بما يكفي للاستخدام ، ويمنحني الوصول النظيف نسبيًا إلى واجهة برمجة تطبيقات DLL.
لاختبار ذلك ، قمت بإنشاء تطبيق وحدة C# Dummy C# للتأكد من أنه يمكنني تحميل DLL ، والوصول إليه ، وتسليمه ملف PDF على القرص المحلي ، ثم جعلها تكتب JPG إلى نفس القرص المحلي. بعد بضع تجارب تعليمية ، حققت نجاحًا. أود تسليمها c: input.pdf ، سوف يسلمني c: output.jpg.
ومع ذلك ، بعد دمج رمز GhostscriptSharp الذي كان لدي في تطبيق وحدة التحكم في مشروع ASP.NET MVC الخاص بي إلى درجة كنت أتصل بـ DLL مع P/Invoke ، يعود Ghostscript مع رمز INT/ERRO -100
, ، وهو خطأ فادح (يسمى E_Fatal
في رمز مصدر Ghostscript). أحصل على نفس النتيجة مع كل من الملف الذي تم تحميله من خلال نموذج HTML ، وإذا قمت بتسليمه نفس المسارات المرمزة التي استخدمتها في تطبيق وحدة التحكم الخاصة بي.
للرجوع إليها ، فإن الخطوط التي يتم إلقاؤها هي 93-97 في Ghostscriptsharp.cs (وهو في CallApi
وظيفة):
int result = InitAPI(gsInstancePtr, args.Length, args);
if (result < 0) {
throw new ExternalException("Ghostscript conversion error", result);
}
من الواضح أن الاستثناء قد تم إلقاؤه بسبب result
هو -100
.
عندما يتم استدعاء initapi ، فإن المثيل PTR صالح int
(على الرغم من أنني لا أعرف ما إذا كان مثيل GS صحيحًا أم لا) ، فإن Args يبلغ طوله 20 ( string[]
) من خيارات Ghostscript صالحة (بما في ذلك المسارات ذات الإثارة والملفات الخاصة بي بشكل صحيح).
قصة قصيرة طويلة ، ماذا أفعل خطأ؟ رمز الخطأ -100
يبدو وكأنه جذب للجميع لأنه لا يوجد وثائق تنص على ما يمكن أن يحدث خطأ هنا.
أي مساعدة موضع تقدير كبير ، شكرًا لك مقدمًا.
المحلول 3
لذلك ، انتهى الأمر بكونه خطأ ID10T الذي كان يخرجني هنا في هذه الحالة المحددة.
في رمز Matthew Ephraim's GhostscriptSharp ، يستخدم اثنين من التعدادات لتحديد الخيارات المنصوص عليها في Ghostscript ، واثنان على وجه الخصوص كانا GhostscriptDevices
و GhostscriptPageSizes
التعداد. المشكلة هي أن الطريقة التي يتم بها كتابتها Resharper (المكون الإضافي لـ JetBrains Visual Studio) لديها قواعد افتراضية لتسمية أعضاء التعداد. لا أفكر ، لقد أصلحت كل هذه التعريفات لإرضاء عدم إدراك أن هذه قد انتقلت مباشرة إلى Ghostscript ، لذا بدلاً من الحصول عليها a7
إلى عن على -sPAPERSIZE
كانت GS تحصل A7
, ، ولل -sDEVICE
كان يحصل Jpeg
بدلاً من jpeg
.
في الوقت الحالي ، لم تكن الأذونات مشكلة في نهايتي ، ولكن فقط لأنني أقوم بتشغيل خادم اختبار Dev Cassini في Visual Studio.
بفضل MarkRedman و TvanFosson على اقتراحاتهم المفيدة!
نصائح أخرى
الخطأ -100 هو "خطأ فادح" عام في Ghostscript.
بعض الأشياء للتحقق:
1) أذونات (تتطلب عمليات AL الوصول إلى الملف)
2) النطاق ، تريد إضافة مجلد بن GS إلى متغيرات المسار
3) فكر في عدم استدعاء Ghostscript مباشرة من ASP.NET ، يمكن أن تكون GS مكثفة للغاية في وحدة المعالجة المركزية ، وبدلاً من ذلك الملفات في خدمة منفصلة
لقد قمت أيضًا بإنشاء غلاف ، أرسل لي بريدًا إلكترونيًا (عنوانًا في الملف الشخصي) وسأرسله لك. يسمح للمرء بالمرور في مجلد GS Bin الذي يساعد.
على الأرجح ، لا تملك العملية تشغيل تطبيق الويب إذنًا للكتابة إلى الدلائل التي تستخدمها. أقترح إنشاء دليل محدد لتطبيق التطبيق ومعرف محلي لاستخدامه لتشغيل تجمع التطبيقات ، ثم أعط هذا المعرف امتيازات كافية لقراءة/كتابة الدليل الذي أنشأته.