LibHaru
|
|
symargl | Дата: Пятница, 17.04.2015, 23:20 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Текст печатает прекрасно, шрифты грузит исправно, линии, кружочки, рамки всякие рисует. А вот картинки - ни в какую! В соответствии с единственным существующим на FB примером, а также в соответствии с мануалом к библиотеке, в означенный пример (test.bas в сборке FB 1.00) внес следующие изменения: 72 Dim Shared img As HPDF_Image 'хэндл под картинку ... ... 124 img = HPDF_LoadJpegImageFromFile (page, "/../../fblogo.jpg") 'грузим картинку 125 page = HPDF_AddPage (img) 'добавляем ее к странице 126 HPDF_Page_DrawImage (page, img, 0, 0, HPDF_Image_GetWidth(img), HPDF_Image_GetHeight (img)) 'собственно печатаем на страницу с координатами 0, 0 и исходными размерами
И - ничего. Если вывести на печать в консоль эти самые HPDF_Image_GetWidth(img) и HPDF_Image_GetHeight (img), то будут нули. То есть, можно предположить, что файл вообще не загружается. Если изменить команду загрузки на HPDF_LoadPngImageFromFile и соответственно указать файл fblogo.png, вывалится целый список ошибок. Вот такая ерунда.
Удивляет, что японский автор библиотеки, на словах поддерживая FB, делает это как-то очень по-японски: в последних версиях LibHaru есть скупая инструкция к самостоятельной компиляции статической библиотеки libhpdf.a из... не пойму чего и посредством не имею представления каких средств - в этом абсолютно ничего не смыслю. И что же делать? Возможно, единственный существующий файл libhpdf.a под win32 безнадежно устарел, возможно он вообще с ошибкой. Возможно, разумеется, я делаю что-то не так, что никак не удивительно, ибо не специалист, а официальный мануал даже вскольз не упоминает о FreeBasic'е.
Многоуважаемые гуру, может быть у кого-нибудь из вас появится желание как следует запрячь эту LibHaru? Штука-то полезная!
Сообщение отредактировал symargl - Пятница, 17.04.2015, 23:21 |
|
| |
haav | Дата: Суббота, 18.04.2015, 08:25 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1372
Статус: Offline
| Возможно библиотека просто содержит ошибки, версия все таки старая. Для PNG надо подключить libpng. Но все равно PNG тоже не грузится как и JPG. Я как то хотел скомпилировать более новую версию, но не помню уж почему , но не вышло. Можно попробовать обратиться напрямую к автору с просьбой откомпилировать новую полнофункциональную версию библиотеки под винду. Либо спросить , почему функции для работы с фотками не пашут. Здесь его контакты http://daylessday.org/contacts.html
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Суббота, 18.04.2015, 09:22 | Сообщение # 3 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Хм, уже не японец... Ну да ладно. За контакт спасибо. Поищу кого-нибудь, кто на вражьем языке письмецо поможет сварганить. Тут еще вот что интересно. Мне удалось откопать эту самую libhpdf.a под DOS. Так ее размер чуть ли не вдвое превосходит размер libhpdf.a под win32. Может быть, конечно, так и должно быть...
Сообщение отредактировал symargl - Суббота, 18.04.2015, 09:25 |
|
| |
haav | Дата: Суббота, 18.04.2015, 11:50 | Сообщение # 4 |
Генералиссимус
Группа: Администраторы
Сообщений: 1372
Статус: Offline
| Похоже действительно дело в версии библиотеки. Я сумел скомпилировать новую версию, с JPG без проблем, все работает. Но с PNG пока не получается. Возможно при компиляции надо какие-то параметры задавать для того, чтобы библиотека взаимодействовала с libPNG. В общем вот пока что сумел накомпилить:
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Суббота, 18.04.2015, 12:24 | Сообщение # 5 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Опаньки! Сбывается моя мечта! Вот только... Не работает по-прежнему, видимо dll'ка приложена не напрасно (А до сих-то пор ее и вовсе не было). Глупый, наверное, вопрос спрошу: куда ее, dll'ку, надо пристроить?
|
|
| |
haav | Дата: Суббота, 18.04.2015, 12:34 | Сообщение # 6 |
Генералиссимус
Группа: Администраторы
Сообщений: 1372
Статус: Offline
| Цитата symargl ( ) Опаньки! Сбывается моя мечта! Вот только... Не работает по-прежнему, видимо dll'ка приложена не напрасно (А до сих-то пор ее и вовсе не было). Глупый, наверное, вопрос спрошу: куда ее, dll'ку, надо пристроить?
DLL я просто так положил на случай если будет желание подключать библиотеку динамически. А так можно просто статическую использовать. В папке с компилятором случайно старая версия библиотеки не лежит? Замени ее на новую.
Кстати в самом первом твоем посту было написано неправильно:
Надо: img = HPDF_LoadJpegImageFromFile (pdf, "/../../fblogo.jpg")
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
haav | Дата: Суббота, 18.04.2015, 14:22 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1372
Статус: Offline
| Все теперь скомпилировал с поддержкой PNG. Проверил все нормально работает.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Суббота, 18.04.2015, 14:55 | Сообщение # 8 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Заменил, конечно. «Page» на «pdf» тоже исправил, хотя пробовал так и раньше, но файл тогда вообще не создавался... Теперь создается, однако, что-то я все равно делаю не так. Функции-то определения ширины-высоты все правильно теперь показывают, да и картинка теперь в файл, судя по его, файла, размеру, попадает, но на странице ее нет! Уж было подумал, что просмотровик у меня какой-нибудь кривой, попробовал другой и еще на e-book'е. Картинки не видно! Это - что касается jpg. Png же по-прежнему выдает кучу ошибок. Может быть, libpng.a у меня тоже старье?
|
|
| |
haav | Дата: Суббота, 18.04.2015, 15:04 | Сообщение # 9 |
Генералиссимус
Группа: Администраторы
Сообщений: 1372
Статус: Offline
| Цитата symargl ( ) Заменил, конечно. «Page» на «pdf» тоже исправил, хотя пробовал так и раньше, но файл тогда вообще не создавался... Теперь создается, однако, что-то я все равно делаю не так. Функции-то определения ширины-высоты все правильно теперь показывают, да и картинка теперь в файл, судя по его, файла, размеру, попадает, но на странице ее нет! Уж было подумал, что просмотровик у меня какой-нибудь кривой, попробовал другой и еще на e-book'е. Картинки не видно! Это - что касается jpg.
В библиотеке координата Y считается почему-то снизу... И это даже в сишных примерах так. Попробуй так (надеюсь fblogo.jpeg у тебя существует):
Код image = HPDF_LoadJpegImageFromFile(pdf, "fblogo.jpeg") HPDF_Page_DrawImage (page, image, 100, 300, HPDF_Image_GetWidth(image), HPDF_Image_GetHeight (image))
Цитата Png же по-прежнему выдает кучу ошибок. Может быть, libpng.a у меня тоже старье?
А ты в своем примере библиотеку libPng подключал?
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
haav | Дата: Суббота, 18.04.2015, 15:06 | Сообщение # 10 |
Генералиссимус
Группа: Администраторы
Сообщений: 1372
Статус: Offline
| В принципе вот полностью пример:
Код '****************************************************************************** '* Program name: hpdftest '* Version: 0.1 '* '* Author: Copyright (c) 2008 Klaus Siebke '* Siebke Unternehmensberatung '* URL http://www.siebke.com '* '* Description: '* ----------- '* '* Program to test the creation of a PDF file using the Haru Free PDF Library '* '* License: '* ------- '* '* Permission to use, copy, modify, distribute and sell this software '* and its documentation for any purpose is hereby granted without fee, '* provided that the above copyright notice appear in all copies and '* that both that copyright notice and this permission notice appear '* in supporting documentation. '* It is provided "as is" without express or implied warranty. '* '* '* External libraries used by the program: '* -------------------------------------- '* '* << Haru Free PDF Library 2.0.8 >> '* URL http://libharu.sourceforge.net/ '* Copyright (c) 1999-2006 Takeshi Kanno '* '****************************************************************************** '****************************************************************************** '* Includes for Haru Free PDF Library '****************************************************************************** #include "crt/errno.bi" #include "zlib.bi" #Include "crt.bi" #ifndef __mod_hpdf_bi__ #define __mod_hpdf_bi__ #include once "hpdf_consts.bi" #include once "hpdf_types.bi" #include once "hpdf.bi" #include once "png.bi" #endif
'****************************************************************************** '* Declarations of subroutines and functions '****************************************************************************** declare sub error_handler cdecl (byval error_no as HPDF_STATUS, byval detail_no as HPDF_STATUS, byval user_data as any ptr )
'****************************************************************************** '* Constants '****************************************************************************** '#define NULL 0 const page_title = "PDF test document"
'****************************************************************************** '* Variables '****************************************************************************** dim shared pdf as HPDF_Doc 'ptr dim shared fname as string * 256 dim shared page as HPDF_Page dim shared def_font as HPDF_Font dim shared txt_font as HPDF_Font dim shared tw as HPDF_REAL dim shared doc_height as HPDF_REAL dim shared doc_width as HPDF_REAL dim shared i as HPDF_UINT 'dim shared errno as HPDF_STATUS ptr dim shared detno as HPDF_STATUS ptr dim shared userdat as any ptr dim shared As HPDF_Destination dst
'****************************************************************************** '* Begin of main program '****************************************************************************** 'print "let's go" 'let's go ... (initialize hpdf) pdf = HPDF_New(@error_handler, NULL) 'print "after hpdf_new" 'add a new page object
page = HPDF_AddPage (pdf) 'print "after hpdf_AddPage" doc_height = HPDF_Page_GetHeight (page) 'print "after hpdf_GetHeight" doc_width = HPDF_Page_GetWidth (page) HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL) dst = HPDF_Page_CreateDestination (page) HPDF_Destination_SetXYZ (dst, 0, HPDF_Page_GetHeight (page), 1) HPDF_SetOpenAction(pdf, dst)
Dim As HPDF_Image image
image = HPDF_LoadJpegImageFromFile(pdf, "fblogo.jpeg") HPDF_Page_DrawImage (page, image, 100, 300, HPDF_Image_GetWidth(image), HPDF_Image_GetHeight (image))
'print a frame HPDF_Page_SetLineWidth (page, .5) HPDF_Page_Rectangle (page, 50, 50, doc_width - 100, doc_height - 110) HPDF_Page_Stroke (page)
'print the title of the page (with positioning center) with font Helvetica def_font = HPDF_GetFont (pdf, "Helvetica", NULL) HPDF_Page_SetFontAndSize (page, def_font, 24) tw = HPDF_Page_TextWidth (page, page_title) HPDF_Page_BeginText (page) HPDF_Page_TextOut (page, (doc_width - tw) / 2, doc_height - 50, page_title) HPDF_Page_EndText (page)
'print some text inside the frame HPDF_Page_BeginText (page)
'first line with font Times Roman 14 txt_font = HPDF_GetFont (pdf, "Times-Roman", NULL) HPDF_Page_MoveTextPos (page, 60, doc_height - 105) HPDF_Page_SetFontAndSize (page, txt_font, 14) HPDF_Page_ShowText (page, "This is a first line")
'second line with font Courier 12 txt_font = HPDF_GetFont (pdf, "Courier", NULL) HPDF_Page_MoveTextPos (page, 0, -20) HPDF_Page_SetFontAndSize (page, txt_font, 12) HPDF_Page_ShowText (page, "This is a second line")
'third line with font Symbol 16 txt_font = HPDF_GetFont (pdf, "Symbol", NULL) HPDF_Page_MoveTextPos (page, 0, -20) HPDF_Page_SetFontAndSize (page, txt_font, 16) HPDF_Page_ShowText (page, "Here are some symbols")
HPDF_Page_EndText (page)
'save the document HPDF_SaveToFile (pdf, "mydoc.pdf")
'clean up HPDF_Free (pdf)
'****************************************************************************** '* End of main program '******************************************************************************
sub error_handler cdecl (byval error_no as HPDF_STATUS, byval detail_no as HPDF_STATUS, byval user_data as any ptr) '****************************************************************************** '* Error handler '****************************************************************************** ' do something here ... print "error_no: ", error_no print "detail_no:", detail_no print "data: ", user_data
end Sub
Не стал ничего нового писать, просто взял готовый и дописал 3 строчки. То же самое и с Png, просто поменяй функцию на HPDF_LoadPngImageFromFile
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Суббота, 18.04.2015, 17:24 | Сообщение # 11 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Докладываю: урррааа, заработало!!! Но заработало не после каких-либо изменений а после перезагрузки компа. Причем тут это?! Но факт, что включив сейчас машинку и запустив проклятый пример, я увидел долгожданную картинку. А команда page = HPDF_AddPage (img) оказалась лишней, это я перемудрил. Главное - чудо свершилось! Феномен с перезагрузкой - тоже забавно. Может быть, хитрости ОС? - у меня ХР64. С png тоже заработало, это я ее не тем словом подключал. В общем, счастье полное. Душевно благодарю за помощь, Станислав!Добавлено (18.04.2015, 17:24) --------------------------------------------- Первая радость улеглась, возник маленький вопросец: а как поступить, если вставляемые в документ картинки изначально поместить в ресурсы? Плавая в море winapi весьма неуверенно, я мог бы по привычке воспользоваться средствами чудесной Window9: LoadImageFromResource, потом SAVE_image, готовый файл скармливаем LibHaru, а после печати удаляем. Но наверняка же можно сделать по-человечески! Подскажи, пожалуйста, как?
|
|
| |
haav | Дата: Суббота, 18.04.2015, 20:50 | Сообщение # 12 |
Генералиссимус
Группа: Администраторы
Сообщений: 1372
Статус: Offline
| Цитата symargl ( ) Плавая в море winapi весьма неуверенно, я мог бы по привычке воспользоваться средствами чудесной Window9: LoadImageFromResource, потом SAVE_image, готовый файл скармливаем LibHaru, а после печати удаляем. Но наверняка же можно сделать по-человечески! Подскажи, пожалуйста, как?
Понимаешь в чем дело... Можно вытащить изображение из ресурсов с помощью LoadImageFromResource, а далее с помощью GetObject получить указатель на пиксели. У библиотеки Haru есть функция которая создает изображение из RAW данных. Но вся загвоздка заключается в том, что форматы пикселей у них жутко разные. У RAW данных пиксели идут по порядку ,если верить документации, так:
1 пиксель R G B 1 2 3 <- байты по порядку
А у встроенных битмапов Windows все через одно место. Мало того, что последняя строка является первой (то есть, мы видим верхний левый пиксель, но в массиве бит он находится первым в последней строке). Так еще у битмапов windows расположение пикселей такое:
BGRA , где A всегда равен 255 (по сути не нужен, но в массиве бит для каждого пикселя он присутствует ). В итоге типа так:
1 пиксель в последней строке B G R A 1 2 3 4 <- байты по порядку
То есть в RAW данных в картинке 5х5 будет 5*5*3 пикселей В битмапе windows 5*5*4 пикселей.
Если тебе хочется , то принцип я тебе изложил, подгоняй форматы
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
haav | Дата: Суббота, 18.04.2015, 22:27 | Сообщение # 13 |
Генералиссимус
Группа: Администраторы
Сообщений: 1372
Статус: Offline
| Если совсем уж замудохаешься , пиши, я попробую составить код.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
symargl | Дата: Воскресенье, 19.04.2015, 00:27 | Сообщение # 14 |
Сержант
Группа: Пользователи
Сообщений: 27
Статус: Offline
| Принцип понятен, спасибо. Как написать такой код, я примерно представляю. И обязательно попробую - чуть погодя. Пока же надо досочинить основную часть программы. Главная проблема - вывод в pdf - решена, открыт простор творчеству А картинки положу пока отдельно или действительно сделаю передачу из ресурсов через файл.
|
|
| |
haav | Дата: Воскресенье, 19.04.2015, 16:39 | Сообщение # 15 |
Генералиссимус
Группа: Администраторы
Сообщений: 1372
Статус: Offline
| Я подумал, что мне может быть самому когда-то пригодится создание PDF, поэтому решил данную задачу. Теперь можно рисовать что угодно при помощи библиотеки window9 и данное изображение преобразовывать при помощи библиотеки libharu в PDF. В самом примере я сделал , что ты просил, то есть получение из ресурсов и отправка в haru. Но ничто не мешает просто создавать битмап, рисовать на нем и отправлять так же в haru. И так:
Код #Include "window9.bi" #include "crt/errno.bi" #Ifndef __mod_hpdf_bi__ #define __mod_hpdf_bi__ #include once "hpdf_consts.bi" #include once "hpdf_types.bi" #include once "hpdf.bi" #include once "png.bi" #endif
'****************************************************************************** '* Declarations of subroutines and functions '****************************************************************************** declare sub error_handler cdecl (byval error_no as HPDF_STATUS, byval detail_no as HPDF_STATUS, byval user_data as any ptr )
'****************************************************************************** '* Constants '****************************************************************************** '#define NULL 0 const page_title = "PDF test document"
'****************************************************************************** '* Variables '****************************************************************************** dim shared pdf as HPDF_Doc 'ptr Dim shared page as HPDF_Page Dim shared doc_height as HPDF_REAL dim shared doc_width as HPDF_REAL Dim shared As HPDF_Destination dst
'****************************************************************************** '* Begin of main program '****************************************************************************** 'print "let's go" 'let's go ... (initialize hpdf) pdf = HPDF_New(@error_handler, NULL) 'print "after hpdf_new" 'add a new page object
page = HPDF_AddPage (pdf) 'print "after hpdf_AddPage" doc_height = HPDF_Page_GetHeight (page) 'print "after hpdf_GetHeight" doc_width = HPDF_Page_GetWidth (page) HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL) dst = HPDF_Page_CreateDestination (page) HPDF_Destination_SetXYZ (dst, 0, HPDF_Page_GetHeight (page), 1) HPDF_SetOpenAction(pdf, dst)
Dim As HPDF_Image image Dim As Bitmap bmp Dim As Hbitmap hBitmap = LoadImageFromResource(Cast(LPCTSTR,100))
GetObject(hBitmap,SizeOf(BITMAP),@bmp)
Dim As UByte Ptr pbBytes = Allocate((bmp.bmHeight)*(bmp.bmWidth)*3) Dim As Integer j
For y As Integer = bmp.bmHeight-1 To 0 Step -1 For x As Integer = 0 To bmp.bmWidth-1 Dim as Integer ptr iColor = cast(integer Ptr,(bmp.bmBits+y*bmp.bmWidth*4)+x*4) pbBytes[j] = cast(UByte Ptr,iColor)[2] pbBytes[j+1] = cast(UByte Ptr,iColor)[1] pbBytes[j+2] = cast(UByte Ptr,iColor)[0] j+=3 Next Next
Free_Image(hBitmap)
image = HPDF_LoadRawImageFromMem(pdf,pbBytes,bmp.bmWidth,bmp.bmHeight,HPDF_CS_DEVICE_RGB,8) HPDF_Page_DrawImage (page, image, 100, 300, HPDF_Image_GetWidth(image), HPDF_Image_GetHeight (image))
'print a frame HPDF_Page_SetLineWidth (page, .5) HPDF_Page_Rectangle (page, 50, 50, doc_width - 100, doc_height - 110) HPDF_Page_Stroke (page)
'save the document HPDF_SaveToFile (pdf, "mydoc.pdf")
'clean up HPDF_Free (pdf)
'****************************************************************************** '* End of main program '******************************************************************************
sub error_handler cdecl (byval error_no as HPDF_STATUS, byval detail_no as HPDF_STATUS, byval user_data as any ptr) '****************************************************************************** '* Error handler '****************************************************************************** ' do something here ... print "error_no: ", error_no print "detail_no:", detail_no print "data: ", user_data
end Sub
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
|