|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
Уже давно использую Ghostscript для напр. конвертации PDF->TIFF. Один раз 5 лет назад скомпилировал GS 9.01, еще пару лет назад переписал Ghostscript API под .Net Ну собственно кода там не шибко много Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80.
Вызывается примерно так (по сути передача командной строки GS через произвольное к-во аргументов): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Все бы хорошо, но изредка жалобы, типа какой-то гадский (оч. редко) PDF не конвертируется, более того ф-ция CallGS (gsapi_init_with_args) мертво виснет + еще 100% CPU. Прогу естественно это выводит из строя, пока юзер не догадается убить процесс. Гадских PDF наколлекционировал штук несколько (от юзеров). Стал наконец разбираться. 1. Для начала скомпилировал GS 9.21 Last Version в VC++2005 (5 лет все же прошло). Ну удалось тьфу-тьфу, слава богу его консерваторы пишут, хотя SDK в msvc.mak пришлось таки комментировать/подправлять. Проблему с несколькими (не со всеми) файлами это решило, с другими все равно через API hanging (хотя gswin32c.exe -штатная - с ними справляется, хотя и информирует о каких-то ошибках). 2. Нашел причину 100% CPU: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
В общем когда эта тварь выводит любое сообщение об ошибке (обычно просто предупреждение что в pdf файле что-то не по спецификации), оно стучится в InOutErrCallBack. Слово Debug.Print("Callback") == ВИСЯК. И вот почему, что там не так может быть? Полечил достаточно просто: Код: vbnet 1. 2.
(теперь во всяком случае при запуске из студии весь output - мусор сыпется в "Вывод", конвертация работает) А с другой стороны весь этот output - бред про какой-то не тот тег в pdf нафиг не нужен, файл конвертирует, не виснет при этом и ладно. Нормальное решение? 3. Ну и проблема с русско-китайским. Декларация gsapi_init_with_args Код: vbnet 1. 2. 3. 4.
(я вот не знаю насколько она в принципе "юникодная") Но если я пытаюсь сделать хотя бы так (это при том что у меня на компе установлен "русский для НЕ-Юникод программ") Код: vbnet 1. 2.
монстро вываливает в Debug буквально следующее. Код: vbnet 1.
(файл Привет естесвенно по этому пути имеется) Я уж не говорю про более тяжелый случай (где в коде ? -там Z чешское с хвостом наверху) Код: vbnet 1. 2. 3. 4.
т.е. чешское Z почему-то стало английским. Код: vbnet 1.
Реально ли с этим побороться? М.б. маршалинг как-то по другому прописать? Коды GS как -бы открыты, компилировал сам , да и проект GS скорее всего юникодный. Ихнее gswin32c.exe (по крайней мере в крайней v.9.21) этого Davorka Zimbrek с иероглифом над Z сжирает, с "Привет" тоже проблем нет. Куда бы покопать? В идеале конечно хотелось бы аналог "W" Код: vbnet 1.
- это ничего не меняет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 05:30 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
Странно, в коде GS есть такая фигня, при этом то что между ifdef __WIN32__ и #endif типа серенькое (т.е. почему-то не было задействовано при компиляции). W и A при вызове "No entry points". А как включить, вроде итак на Win32 компилировал? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 05:53 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
Дмитрий77, НЕ думал смотреть в сторону .NET библиотек для работы с PDF? А то чёт складывается ощущение, что ты просто охринеть как тащишься от всякого P/Invoke, маршаллинга и ковыряния по самые локти в WINAPI. Это что, такая адская форма садомазохизма? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 09:12 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
hVosttНЕ думал смотреть в сторону .NET библиотек для работы с PDF? А ты не в курсе, что 90% этих ".NET библиотек" и прочего софта используют Ghostscript? Либо являются чем-то жалким и глючным. (ну естественно еще Adobe софт) Просто чтобы сделать PDF -> Картинка (а не наоборот), надо как бы полностью раскурочить его согласно спецификации PDF, а это не только текст и картинки. hVosttпо самые локти в WINAPI. Это что, такая адская форма садомазохизма? )) Ну, садомазохизма в этом простеньком коде, что уместился под спойлером в первом посте не особо много. И в данном случае это не "WIN" API, а API предоставляемые недетской такой библиотекой. https://www.ghostscript.com/doc/current/API.htm Вот вроде нарыл пока по теме Using GhostScript 9.10 in Windows with Unicode characters in parameters но пока особо не врубался. Попробовал на дурака вот так присобачить Unicode-маршалинг Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
но не прокатило, перестал понимать англицкий. Видимо придется таки впихивать строки в массив указателей как там, с последующим освобождением Marshal.AllocHGlobal/Marshal.FreeHGlobal, (хотя лучше б без этого) ну а utf-8/utf-16==Unicode видимо дело вкуса. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 13:19 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
В общем с UTF8 прокатило: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
Заодно убрал про Callback-и, и переделал Function в Sub - нафиг эти тупые проверки, файл появился, значит True. Всему виной - хапнул чужой код когда-то не глядя, вот он: Simple VB.Net Wrapper for Ghostscript Dll Работать то он работал, но изредка плодил проблемы с висяками. Съедает теперь и "Приветы", и чешские Z, и "PDF слегка не по specification" Смущает заочно, т.к. у меня все работает - не нарвался на это(в комментарии здесь ). авторThe original problem was solved, but now I get on some machines an AccessViolationException. Do you have any idea? Ну и почему-то не работает по аналогии Unicode==UTF16, хотя по документации типа должен. Собственно неработоспособность кода ниже объясняет, почему не получилось со стандартным Unicode-маршалингом (как с Win "W"-API) в конце предыдущего поста (для UTF-8 подобного механизма вроде нет). А обидно, UTF16LE это по идее Little Endian == Unicode, но почему-то не фурычит. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 15:40 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
жесть )) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 18:53 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
Дмитрий77А ты не в курсе, что 90% этих ".NET библиотек" и прочего софта используют Ghostscript? Либо являются чем-то жалким и глючным. Я уж не знаю чего ты там куришь... Кому нахрен упало это говно мамонта? Сегодня PDF рендерится даже на страницах в браузере средствами JavaScript, на .NET уже давным давно есть чистые дотнетовские либы, которые работают изумительно. Ну дело твоё конечно, я лишь выразил полное непонимание подобной упоротости. Видимо нравится, тут уже у кого какие так сказать нетрадиционные пристрастия. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 21:51 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
Дмитрий77Просто чтобы сделать PDF -> Картинка (а не наоборот), надо как бы полностью раскурочить его согласно спецификации PDF, а это не только текст и картинки. Серьёзно? https://mozilla.github.io/pdf.js/ ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 21:53 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
Дмитрий77И в данном случае это не "WIN" API, а API предоставляемые недетской такой библиотекой. Да уж, главное всё максимально усложнить, надеюсь за простейшие вещи, которые ты решаешь путём анального ректалиуса, тебе хотя бы нормально платят :) https://ru.wikipedia.org/wiki/Машина_Голдберга ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 21:56 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
hVostt, Ты зачем лезешь в тему если нечего сказать по сути или не рубишь то о чем спрашивают? Иди в курилку и трепись там про "говно мамонта" сколько влезет (не со мной). Ghostscript делает конкретно то что мне надо (даже не буду объяснять что именно, это в общем ясно из первого поста, да и вряд ли тебе это интересно, лиж бы запостить про какую-нибудь "какашку"), вряд ли твои библиотеки, работающие в браузере именно это умеют. М.б. и умеют, но вопрос про них не ставился в принципе. Вопрос был чисто технический. Задача описана, исходные данные и коды предоставлены. Задача в целом решена, и заметь не тобой. И в общем-то за разумное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 22:21 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
Дмитрий77, Да ладно тебе бомбить. Пишешь на форум .NET про проблемы, не имеющие практически никакого отношения к .NET, предлагаешь молчать и спокойно наблюдать, как ты страдаешь фигнёй? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 23:21 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
hVostt, прекращай. Я пишу на VB.Net (это не .Net Framework?), более того в WinForms. А вопросы, они могут быть любые. И ответы если они даются должны быть адекватны вопросам, а не бла-бла гавно мамонта. Delegate , из-за которого висяк + 100% CPU (первая проблема) -это не .Net? System.Text.Encoding.UTF8, Marshal.AllocHGlobal <MarshalAs(UnmanagedType.LPArray, ArraySubType:=UnmanagedType.LPWStr)> от которых напрямую зависит, прочтется ли Юникод или нет (вторая проблема), это все не чисто .Net-овские штучки? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2017, 23:36 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
Дмитрий77...100% CPU: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
В общем когда эта тварь выводит любое сообщение об ошибке (обычно просто предупреждение что в pdf файле что-то не по спецификации), оно стучится в InOutErrCallBack. Слово Debug.Print("Callback") == ВИСЯК. И вот почему, что там не так может быть? В принципе мне эти CallBack нафиг не нужны, но хотелось разобраться. Полезно иногда заглянуть во внутрь. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Не уверен про stdin, но stdout и stderr должны возвращать не 0, а "the number of characters written", т.е. строго 3-й параметр. Вот хотя бы так все OK: Код: vbnet 1. 2. 3. 4. 5.
А ошибка зараза пришла из упомянутого места Simple VB.Net Wrapper for Ghostscript Dll (статья 2013г, воспользовался в 2015), причем мой аналогичный код VB6 (писал/слизывал в 2012г.) счас проверил, содержит такую же точно фигню: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Это называется, тырим баги друг у друга. "Авторы" очевидно не нарывались. Спрашивается, зачем их вообще рисовать (для красоты кодинга?) если "We don't have a console, so just return..." Этот безобидный "just return" и вызывает "just hangs with 100% CPU". Всё. hVosttНЕ думал смотреть в сторону .NET библиотек ... такая адская форма садомазохизма? )) Угу-угу. Ghostscript.NET (written in C#) Типичная адская форма .Net-овского садомазохизма. Я из подобного проджекта pop3/imap выковыривал, кстати успешно. Но к слову я думаю этот как раз грамотно написан и без багов типа возврат нуля абы шо-бы. Только в таких проектах обычно 98% -лишний мне нафиг не нужный мусор. И, не было этого проекта в 2012г. когда я VB6 писал, а когда мигрировал на .Net, не до тонкостей было (оч. много всего). А взять просто чью-то .Net dll, чо сказать. Такой баг (типа описанного здесь) если аффтор бальшой абертки его су*а случайно заложил в свою dll, фиг отловишь. Я воспользовался Windows Ribbon for WinForms , года два назад, утянул его целиком, в кишках не копался - отличная кстати вещь. Но: я до сих пор не отловил, почему у меня прога (оч. редко - можно забить) иногда да и может тупо скрашить, то что из-за риббон это точно, а отдебажить и понять не удалось, потому что это "коробка хренова", какая бы красивая она не была. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2017, 03:08 |
|
Ghostscript API 1) 100% CPU если вызывается Callback 2) Не понимает не-аглийские имена
|
|||
---|---|---|---|
#18+
Дмитрий77 причем мой аналогичный код VB6 (писал/слизывал в 2012г.) счас проверил, содержит такую же точно фигню: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Это называется, тырим баги друг у друга. "Авторы" очевидно не нарывались. Спрашивается, зачем их вообще рисовать (для красоты кодинга?) если "We don't have a console, so just return..." Этот безобидный "just return" и вызывает "just hangs with 100% CPU". А не, это я погорячился на VB6 шары катить. Там как раз все корректно. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Там как раз 3-й параметр возвращается как положено. На VB6 ИМХО куда более грамотные люди писали, чем нынешние "оберточники". ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2017, 04:00 |
|
|
start [/forum/topic.php?fid=20&msg=39524324&tid=1399704]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 316ms |
total: | 447ms |
0 / 0 |