FreeBasic
Главная
Вход
Регистрация
Четверг, 18.04.2024, 21:31Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » Библиотеки для FreeBasic » Другие библиотеки » LibHaru (создание pdf-документа)
LibHaru
symarglДата: Пятница, 17.04.2015, 23:20 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Возможно библиотека просто содержит ошибки, версия все таки старая. Для PNG надо подключить libpng. Но все равно PNG тоже не грузится как и JPG.
Я как то хотел скомпилировать более новую версию, но не помню уж почему , но не вышло. Можно попробовать обратиться напрямую к автору с просьбой откомпилировать новую полнофункциональную версию библиотеки под винду. Либо спросить , почему функции для работы с фотками не пашут. Здесь его контакты http://daylessday.org/contacts.html


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
symarglДата: Суббота, 18.04.2015, 09:22 | Сообщение # 3
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: Offline
Хм, уже не японец... Ну да ладно. За контакт спасибо. Поищу кого-нибудь, кто на вражьем языке письмецо поможет сварганить.
Тут еще вот что интересно. Мне удалось откопать эту самую libhpdf.a под DOS. Так ее размер чуть ли не вдвое превосходит размер libhpdf.a под win32. Может быть, конечно, так и должно быть...


Сообщение отредактировал symargl - Суббота, 18.04.2015, 09:25
 
haavДата: Суббота, 18.04.2015, 11:50 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Похоже действительно дело в версии библиотеки. Я сумел скомпилировать новую версию, с JPG без проблем, все работает. Но с PNG пока не получается. Возможно при компиляции надо какие-то параметры задавать для того, чтобы библиотека взаимодействовала с libPNG. В общем вот пока что сумел накомпилить:
Прикрепления: libharu_static_.zip (983.4 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
symarglДата: Суббота, 18.04.2015, 12:24 | Сообщение # 5
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: Offline
Опаньки! Сбывается моя мечта! Вот только... Не работает по-прежнему, видимо dll'ка приложена не напрасно (А до сих-то пор ее и вовсе не было). Глупый, наверное, вопрос спрошу: куда ее, dll'ку, надо пристроить?
 
haavДата: Суббота, 18.04.2015, 12:34 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата symargl ()
Опаньки! Сбывается моя мечта! Вот только... Не работает по-прежнему, видимо dll'ка приложена не напрасно (А до сих-то пор ее и вовсе не было). Глупый, наверное, вопрос спрошу: куда ее, dll'ку, надо пристроить?


DLL я просто так положил на случай если будет желание подключать библиотеку динамически. А так можно просто статическую использовать. В папке с компилятором случайно старая версия библиотеки не лежит? Замени ее на новую.

Кстати в самом первом твоем посту было написано неправильно:

Надо: img = HPDF_LoadJpegImageFromFile (pdf, "/../../fblogo.jpg")


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Суббота, 18.04.2015, 14:22 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Все теперь скомпилировал с поддержкой PNG. Проверил все нормально работает.
Прикрепления: 6992166.zip (1.16 Mb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
symarglДата: Суббота, 18.04.2015, 14:55 | Сообщение # 8
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: Offline
Заменил, конечно. «Page» на «pdf» тоже исправил, хотя пробовал так и раньше, но файл тогда вообще не создавался... Теперь создается, однако, что-то я все равно делаю не так. Функции-то определения ширины-высоты все правильно теперь показывают, да и картинка теперь в файл, судя по его, файла, размеру, попадает, но на странице ее нет! Уж было подумал, что просмотровик у меня какой-нибудь кривой, попробовал другой и еще на e-book'е. Картинки не видно! Это - что касается jpg. Png же по-прежнему выдает кучу ошибок. Может быть, libpng.a у меня тоже старье?
 
haavДата: Суббота, 18.04.2015, 15:04 | Сообщение # 9
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Репутация: 0
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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 пикселей.

Если тебе хочется , то принцип я тебе изложил, подгоняй форматы smile


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Суббота, 18.04.2015, 22:27 | Сообщение # 13
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Если совсем уж замудохаешься , пиши, я попробую составить код.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
symarglДата: Воскресенье, 19.04.2015, 00:27 | Сообщение # 14
Сержант
Группа: Пользователи
Сообщений: 27
Репутация: 0
Статус: Offline
Принцип понятен, спасибо. Как написать такой код, я примерно представляю. И обязательно попробую - чуть погодя. Пока же надо досочинить основную часть программы. Главная проблема - вывод в pdf - решена, открыт простор творчеству wink А картинки положу пока отдельно или действительно сделаю передачу из ресурсов через файл.
 
haavДата: Воскресенье, 19.04.2015, 16:39 | Сообщение # 15
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Форум » Библиотеки для FreeBasic » Другие библиотеки » LibHaru (создание pdf-документа)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: