CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [BCB C++] generowanie pdf

[BCB C++] generowanie pdf

dział ogólny

[BCB C++] generowanie pdf

Nowy postprzez shepard » niedziela, 9 września 2012, 03:13

Cześć;
Jestem tu nowy i dopiero zaczynam swoją przygodę z c++ i programem Borland Builder 6.0.
Chciałem na początku napisać notatnik, typowy, prosty. Wymyśliłem sobie, że będzie on zapisywał również pliki w pdf, jednak problem jak to zrobić? Jak to napisać?
Ściągnąłem bibliotekę: libhpdf.lib i dodałem ją do projektu: Project->Add To Project i nic się nie dzieje, a może inaczej nie wiem co dalej... Mam komponent Memo1 Czy dało by się by tekst z niego kompilował w pdf? A może musi być co najmniej RichEdit? Jakich należy użyć kodów by mój notatnik zapisywał tekst z Memo1 w pdf.
Z góry dziękuje za wszelką pomoc
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] generowanie pdf

Nowy postprzez Cyfrowy Baron » niedziela, 9 września 2012, 09:08

shepard napisał(a):Ściągnąłem bibliotekę: libhpdf.lib


To trochę za mało. Musisz mieć cały komplet bibliotek libharu 2.0.8. Gdy już je pobierzesz, musisz je skompilować poleceniem:

KOD text:     UKRYJ  
make -f script\Makefile.bcc32


Nie wiadomo oczywiście czy te biblioteki są kompatybilne z twoją wersją środowiska, bo w profilu nie podajesz z jakiego kompilatora korzystasz.

Gdy już będziesz miał skompilowane biblioteki powinna w nich pojawić się biblioteka libhpdf.lib.
Do projektu nie wystarczy włączyć samej biblioteki *.LIB, trzeba również włączać odpowiednie pliku nagłówkowe np. hpdf.h, dodając je do sekcji #include projektu w pliku nagłówkowym lub źródłowym zależnie od potrzeb. Potem z koleii wywołujesz odpowiednie funkcje z załączonych bibliotek.
Sprawa nie jest jednak taka prosta i nie da się wygenerować pliku pdf wywołaniem jednej funkcji.
Ściągnij sobie biblioteki z podanej lokalizacji i zajrzyj do katalogu Demo z przykładami użycia bibliotek.

Dla przykładu wygenerowanie prostego tekstu w pliku pdf wymaga np. takiego kodu:

KOD c:     UKRYJ  
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <setjmp.h>
#include "hpdf.h"
#include "grid_sheet.h"

jmp_buf env;

#ifdef HPDF_DLL
void  __stdcall
#else
void
#endif
error_handler (HPDF_STATUS   error_no,
               HPDF_STATUS   detail_no,
               void         *user_data)
{
    printf ("ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no,
                (HPDF_UINT)detail_no);
    longjmp(env, 1);
}

void
show_stripe_pattern  (HPDF_Page   page,
                      HPDF_REAL   x,
                      HPDF_REAL   y)
{
    HPDF_UINT iy = 0;

    while (iy < 50) {
        HPDF_Page_SetRGBStroke (page, 0.0, 0.0, 0.5);
        HPDF_Page_SetLineWidth (page, 1);
        HPDF_Page_MoveTo (page, x, y + iy);
        HPDF_Page_LineTo (page, x + HPDF_Page_TextWidth (page, "ABCabc123"),
                    y + iy);
        HPDF_Page_Stroke (page);
        iy += 3;
    }

    HPDF_Page_SetLineWidth (page, 2.5);
}


void
show_description  (HPDF_Page          page,
                   HPDF_REAL          x,
                   HPDF_REAL          y,
                   const char   *text)
{
    float fsize = HPDF_Page_GetCurrentFontSize (page);
    HPDF_Font font = HPDF_Page_GetCurrentFont (page);
    HPDF_RGBColor c = HPDF_Page_GetRGBFill (page);

    HPDF_Page_BeginText (page);
    HPDF_Page_SetRGBFill (page, 0, 0, 0);
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL);
    HPDF_Page_SetFontAndSize (page, font, 10);
    HPDF_Page_TextOut (page, x, y - 12, text);
    HPDF_Page_EndText (page);

    HPDF_Page_SetFontAndSize (page, font, fsize);
    HPDF_Page_SetRGBFill (page, c.r, c.g, c.b);
}


int main (int argc, char **argv)
{
    const char *page_title = "Text Demo";

    HPDF_Doc  pdf;
    HPDF_Font font;
    HPDF_Page page;
    char fname[256];

    const char* samp_text = "abcdefgABCDEFG123!#$%&+-@?";
    const char* samp_text2 = "The quick brown fox jumps over the lazy dog.";
    float tw;
    float fsize;
    int i;
    int len;

    float angle1;
    float angle2;
    float rad1;
    float rad2;

    float ypos;

    strcpy (fname, argv[0]);
    strcat (fname, ".pdf");

    pdf = HPDF_New (error_handler, NULL);
    if (!pdf) {
        printf ("error: cannot create PdfDoc object\n");
        return 1;
    }

    if (setjmp(env)) {
        HPDF_Free (pdf);
        return 1;
    }

    /* set compression mode */
    HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL);

    /* create default-font */
    font = HPDF_GetFont (pdf, "Helvetica", NULL);

    /* add a new page object. */
    page = HPDF_AddPage (pdf);

    /* draw grid to the page */
    print_grid  (pdf, page);

    /* print the lines of the page.
    HPDF_Page_SetLineWidth (page, 1);
    HPDF_Page_Rectangle (page, 50, 50, HPDF_Page_GetWidth(page) - 100,
                HPDF_Page_GetHeight (page) - 110);
    HPDF_Page_Stroke (page);
    */


    /* print the title of the page (with positioning center). */
    HPDF_Page_SetFontAndSize (page, font, 24);
    tw = HPDF_Page_TextWidth (page, page_title);
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, (HPDF_Page_GetWidth(page) - tw) / 2,
                HPDF_Page_GetHeight (page) - 50, page_title);
    HPDF_Page_EndText (page);

    HPDF_Page_BeginText (page);
    HPDF_Page_MoveTextPos (page, 60, HPDF_Page_GetHeight(page) - 60);

    /*
     * font size
     */

    fsize = 8;
    while (fsize < 60) {
        char buf[50];
        int len;

        /* set style and size of font. */
        HPDF_Page_SetFontAndSize(page, font, fsize);

        /* set the position of the text. */
        HPDF_Page_MoveTextPos (page, 0, -5 - fsize);

        /* measure the number of characters which included in the page. */
        strcpy(buf, samp_text);
        len = HPDF_Page_MeasureText (page, samp_text,
                        HPDF_Page_GetWidth(page) - 120, HPDF_FALSE, NULL);

        /* truncate the text. */
        buf[len] = 0x00;

        HPDF_Page_ShowText (page, buf);

        /* print the description. */
        HPDF_Page_MoveTextPos (page, 0, -10);
        HPDF_Page_SetFontAndSize(page, font, 8);
        #ifdef __WIN32__
        _snprintf(buf, 50, "Fontsize=%.0f", fsize);
        #else
        snprintf(buf, 50, "Fontsize=%.0f", fsize);
        #endif
        HPDF_Page_ShowText (page, buf);

        fsize *= 1.5;
    }

    /*
     * font color
     */

    HPDF_Page_SetFontAndSize(page, font, 8);
    HPDF_Page_MoveTextPos (page, 0, -30);
    HPDF_Page_ShowText (page, "Font color");

    HPDF_Page_SetFontAndSize (page, font, 18);
    HPDF_Page_MoveTextPos (page, 0, -20);
    len = strlen (samp_text);
    for (i = 0; i < len; i++) {
        char buf[2];
        float r = (float)i / (float)len;
        float g = 1 - ((float)i / (float)len);
        buf[0] = samp_text[i];
        buf[1] = 0x00;

        HPDF_Page_SetRGBFill (page, r, g, 0.0);
        HPDF_Page_ShowText (page, buf);
    }
    HPDF_Page_MoveTextPos (page, 0, -25);

    for (i = 0; i < len; i++) {
        char buf[2];
        float r = (float)i / (float)len;
        float b = 1 - ((float)i / (float)len);
        buf[0] = samp_text[i];
        buf[1] = 0x00;

        HPDF_Page_SetRGBFill (page, r, 0.0, b);
        HPDF_Page_ShowText (page, buf);
    }
    HPDF_Page_MoveTextPos (page, 0, -25);

    for (i = 0; i < len; i++) {
        char buf[2];
        float b = (float)i / (float)len;
        float g = 1 - ((float)i / (float)len);
        buf[0] = samp_text[i];
        buf[1] = 0x00;

        HPDF_Page_SetRGBFill (page, 0.0, g, b);
        HPDF_Page_ShowText (page, buf);
    }

    HPDF_Page_EndText (page);

    ypos = 450;

    /*
     * Font rendering mode
     */

    HPDF_Page_SetFontAndSize(page, font, 32);
    HPDF_Page_SetRGBFill (page, 0.5, 0.5, 0.0);
    HPDF_Page_SetLineWidth (page, 1.5);

     /* PDF_FILL */
    show_description (page,  60, ypos,
                "RenderingMode=PDF_FILL");
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL);
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, 60, ypos, "ABCabc123");
    HPDF_Page_EndText (page);

    /* PDF_STROKE */
    show_description (page, 60, ypos - 50,
                "RenderingMode=PDF_STROKE");
    HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE);
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, 60, ypos - 50, "ABCabc123");
    HPDF_Page_EndText (page);

    /* PDF_FILL_THEN_STROKE */
    show_description (page, 60, ypos - 100,
                "RenderingMode=PDF_FILL_THEN_STROKE");
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_THEN_STROKE);
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, 60, ypos - 100, "ABCabc123");
    HPDF_Page_EndText (page);

    /* PDF_FILL_CLIPPING */
    show_description (page, 60, ypos - 150,
                "RenderingMode=PDF_FILL_CLIPPING");
    HPDF_Page_GSave (page);
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_CLIPPING);
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, 60, ypos - 150, "ABCabc123");
    HPDF_Page_EndText (page);
    show_stripe_pattern (page, 60, ypos - 150);
    HPDF_Page_GRestore (page);

    /* PDF_STROKE_CLIPPING */
    show_description (page, 60, ypos - 200,
                "RenderingMode=PDF_STROKE_CLIPPING");
    HPDF_Page_GSave (page);
    HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE_CLIPPING);
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, 60, ypos - 200, "ABCabc123");
    HPDF_Page_EndText (page);
    show_stripe_pattern (page, 60, ypos - 200);
    HPDF_Page_GRestore (page);

    /* PDF_FILL_STROKE_CLIPPING */
    show_description (page, 60, ypos - 250,
                "RenderingMode=PDF_FILL_STROKE_CLIPPING");
    HPDF_Page_GSave (page);
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_STROKE_CLIPPING);
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, 60, ypos - 250, "ABCabc123");
    HPDF_Page_EndText (page);
    show_stripe_pattern (page, 60, ypos - 250);
    HPDF_Page_GRestore (page);

    /* Reset text attributes */
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL);
    HPDF_Page_SetRGBFill (page, 0, 0, 0);
    HPDF_Page_SetFontAndSize(page, font, 30);


    /*
     * Rotating text
     */

    angle1 = 30;                   /* A rotation of 30 degrees. */
    rad1 = angle1 / 180 * 3.141592; /* Calcurate the radian value. */

    show_description (page, 320, ypos - 60, "Rotating text");
    HPDF_Page_BeginText (page);
    HPDF_Page_SetTextMatrix (page, cos(rad1), sin(rad1), -sin(rad1), cos(rad1),
                330, ypos - 60);
    HPDF_Page_ShowText (page, "ABCabc123");
    HPDF_Page_EndText (page);


    /*
     * Skewing text.
     */

    show_description (page, 320, ypos - 120, "Skewing text");
    HPDF_Page_BeginText (page);

    angle1 = 10;
    angle2 = 20;
    rad1 = angle1 / 180 * 3.141592;
    rad2 = angle2 / 180 * 3.141592;

    HPDF_Page_SetTextMatrix (page, 1, tan(rad1), tan(rad2), 1, 320, ypos - 120);
    HPDF_Page_ShowText (page, "ABCabc123");
    HPDF_Page_EndText (page);


    /*
     * scaling text (X direction)
     */

    show_description (page, 320, ypos - 175, "Scaling text (X direction)");
    HPDF_Page_BeginText (page);
    HPDF_Page_SetTextMatrix (page, 1.5, 0, 0, 1, 320, ypos - 175);
    HPDF_Page_ShowText (page, "ABCabc12");
    HPDF_Page_EndText (page);


    /*
     * scaling text (Y direction)
     */

    show_description (page, 320, ypos - 250, "Scaling text (Y direction)");
    HPDF_Page_BeginText (page);
    HPDF_Page_SetTextMatrix (page, 1, 0, 0, 2, 320, ypos - 250);
    HPDF_Page_ShowText (page, "ABCabc123");
    HPDF_Page_EndText (page);


    /*
     * char spacing, word spacing
     */


    show_description (page, 60, 140, "char-spacing 0");
    show_description (page, 60, 100, "char-spacing 1.5");
    show_description (page, 60, 60, "char-spacing 1.5, word-spacing 2.5");

    HPDF_Page_SetFontAndSize (page, font, 20);
    HPDF_Page_SetRGBFill (page, 0.1, 0.3, 0.1);

    /* char-spacing 0 */
    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, 60, 140, samp_text2);
    HPDF_Page_EndText (page);

    /* char-spacing 1.5 */
    HPDF_Page_SetCharSpace (page, 1.5);

    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, 60, 100, samp_text2);
    HPDF_Page_EndText (page);

    /* char-spacing 1.5, word-spacing 3.5 */
    HPDF_Page_SetWordSpace (page, 2.5);

    HPDF_Page_BeginText (page);
    HPDF_Page_TextOut (page, 60, 60, samp_text2);
    HPDF_Page_EndText (page);

    /* save the document to a file */
    HPDF_SaveToFile (pdf, fname);

    /* clean up */
    HPDF_Free (pdf);

    return 0;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] generowanie pdf

Nowy postprzez shepard » niedziela, 9 września 2012, 15:08

No tak trochę może nie jasno się wyraziłem a właściwie napisałem. Ściągnąłem paczkę z posta http://programowanie.cal.pl/forum/viewtopic.php?f=5&t=1689, która była już skompilowana tym, że poleceniem:
Kod: Zaznacz cały
make -f script\Makefile.bcc32

Sprawa wygląda tak:

Używam C++Builder 6, mój system operacyjny to Windows 7 i mam przykładowo tak:

na formularzu obiekt Memo1 i jakiś button.
Chciałem teraz aby mój program działał tak: wpisuje się w pole tekstowe (czyli to Memo1) jakiś tekst a po naciśnięciu przez użytkownika przycisku generował ten tekst do jakiegoś tam pliku pdf (np. 'nowy.pdf').
I wszystko.

Nie mogę sobie dać rady z przerzuceniem Twojego kodu do Borlanda, najpierw wywalało mi błąd, że brakuje bibliotek: #include "hpdf.h"
#include "grid_sheet.h", itd, jak skopiowałem je do folderu z projektem to wywalało mi błąd w:
Kod: Zaznacz cały
  float angle1;
    float angle2;
    float rad1;
    float rad2;
twierdząc, że angle2 nie było nigdzie wcześniej użyte o-0, przecież jest zadeklarowane jako float , nie kumam, może w złym miejscu dałem, bo na przycisku.

Przepraszam za zamęt, mam nadzieje, że dosyć czytelnie i zrozumiale opisałem mój problem. Cyfrowy Baron dzięki wielkie.
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] generowanie pdf

Nowy postprzez Cyfrowy Baron » niedziela, 9 września 2012, 15:54

shepard napisał(a):która była już skompilowana tym


Została skompilowana w środowisku C++Builder XE2, więc niekoniecznie będzie kompatybilna z C++Builder 6.

shepard napisał(a):Chciałem teraz aby mój program działał tak: wpisuje się w pole tekstowe (czyli to Memo1) jakiś tekst a po naciśnięciu przez użytkownika przycisku generował ten tekst do jakiegoś tam pliku pdf (np. 'nowy.pdf').


Tak po prostu to się nie da, gdyż teks musi zostać poddany konwersji zgodnej z PDF, czyli tekst można oczywiście pobrać z Memo i podłożyć pod kod który podałem jako przykład, czyli np. zamiast

KOD cpp:     UKRYJ  
HPDF_Page_LineTo (page, x + HPDF_Page_TextWidth (page, "ABCabc123"),
                    y + iy);


dajesz:

KOD cpp:     UKRYJ  
HPDF_Page_LineTo (page, x + HPDF_Page_TextWidth (page, Memo1->Text),
                    y + iy);


ale oczywiście sprawa nie jest taka prosta. Ta biblioteka wymaga zdefiniowania czcionek, określenia liczby stron, podania liczby linii i wiele, wiele innych rzeczy.

To nie jest komponent, który automatycznie przekonwertuje zawartość Memo i zapisze w pliku PDF. W przypadku tych bibliotek trzeba zaprogramować każdy szczegół konwersji, a tekst z Memo należy pobrać i podstawić pod odpowiednie funkcje biblioteki. To jednak wymaga zapoznania się z dokumentacją tejże biblioteki oraz dobrej znajomości formatu PDF.
Poza tym biblioteki nie zostały stworzone dla środowiska C++Builder, a jedynie są zgodne ze specyfikacją języka C++.

Ja nie korzystałem nigdy z tych bibliotek, więc nie mam jakiegoś gotowego kodu, który mógłbym tutaj zaprezentować.

shepard napisał(a):Nie mogę sobie dać rady z przerzuceniem Twojego kodu do Borlanda, najpierw wywalało mi błąd, że brakuje bibliotek: #include "hpdf.h"


W żadnym razie nie należy tego kodu przerzucać do programu, lecz trzeba się z tym kodem zapoznać i zrozumieć. Kod pochodzi z pliku text_demo.c znajdującego się w podkatalogu demo, który to katalog znajdziesz w katalogu biblioteki.
Plik hpdf.h znajduje się w podkatalogu include katalogu biblioteki i ten plik należy włączyć do projektu.

Pliku grid_sheet.h znajduje się w podkatalogu demo, ale to tylko element przykładowego projektu i tobie w żaden sposób na nic się nie zda.

Odnoszę wrażenie, iż liczysz, że da się to zadanie zrealizować w prosty sposób, a tymczasem to bardzo trudny i niezwykle złożony projekt nad którym trzeba spędzić dziesiątki godzin.
Sugerowałbym poszukania jakiejś gotowej biblioteki DLL, którą mógłbyś włączyć do projektu i skorzystać z gotowych już funkcji konwertujących, gdyż - nie ubliżając ci - przy twojej znajomości środowiska i języka obawiam się, że nie będziesz w stanie zrealizować zamierzonego zadania. Sam miałbym duże problemy z wykorzystaniem tej biblioteki, a ponieważ taka funkcja w żadnym programie nie jest mi potrzebna to się tym nie interesowałem.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
shepard
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] generowanie pdf

Nowy postprzez shepard » niedziela, 9 września 2012, 17:45

Dzięki wielkie za wyjaśnienie. Tak masz racje dopiero zaczynam zabawę z tym językiem a chciałem zająć się pdf'em bo w przyszłości chciałem pisać programy, które będą zapisywały w postaci pdf'a np. faktury i inne tego typu dokumenty. Myślałem, że da się to zorganizować w prosty i szybki sposób jeśli chodzi o sam suchy tekst z pola tekstowego. Jeszcze raz dzięki wielkie.
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] generowanie pdf

Nowy postprzez Cyfrowy Baron » niedziela, 9 września 2012, 18:08

Zawsze możesz zainstalować w systemie taką wirtualną drukarkę, która drukuje do pliku pdf. Kiedyś tego używałem i świetnie to się sprawdzało, ale teraz mam Microsoft Office 2010 oraz Adobe Bridge CS5 które w zupełności mi wystarczają jeśli chodzi o tworzenie plików pdf.

Poza tym do nowszych wersji środowiska, chyba od 2009 dołączany jest moduł Rave Reports który pozwala tworzyć raporty i zapisywać je do formatu pdf, więc nie są potrzebne żadne inne komponenty.

PDFCreator-0_9_0_GPLGhostscript.exe
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] generowanie pdf

Nowy postprzez shepard » niedziela, 9 września 2012, 18:25

Tak, znam PDFCreator bo używałem, teraz również używam office i mam doistalowaną łatkę pdf - xps, bo sam word nie ma zapisu do pdf.
Poprostu chciałem pisać programy, które zapisują w pdf, zaczynając naukę wydawałoby mi się, że od najprostszych rzeczy czyli poprostu zapis tekstu do pliku pdf - bo przecież od czegoś trzeba zacząć. Także nie chodziło mi o kompilacje pdf dla własnych potrzeb tylko o napisanie programu, który by w tym formacie potrafił zapisać zwykły tekst.
PDFCreatora można by było wykorzystać w ten sposób, że jest mój notatnik i w nim jakiś tam tekst i użytkownik wybiera opcje zapisu w pdf i wtedy notatnik wysyła dane z Memo1 do PDFCreatora, który kompiluje pdf'a.
Plusy:
- osiągne to co chciałem bo będziemy mieli plik pdf z mojego progrmu

Minusy:
- Przy instalacji mojego programu a wówczas musiałaby być instalacja PDFCreator musiałby instalować się wraz z moim programem, chyba, że ktoś już by miał PDFCreatora zainstalowanego - a na to nie liczę, dużo osób kożysta jak my z offica lub openoffice (tu zapisuje pdf bez konieczności ściągania dodatkowych biblitek do programu)
- Mój program musiałby być kompatybilny z PDFCreator, co oznacza, że byłby od niego uzależniony a nie o to mi chodziło :(
- Nie nauczyłbym się nic o pdf'ach

Pisząc o PDFCreator miałem namyśli również inne programy, które działaja jak on na zasadzie wirtualnej drukarki - z tymże PDFCreator jest najbardziej popularnym programem
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] generowanie pdf

Nowy postprzez Cyfrowy Baron » niedziela, 9 września 2012, 20:01

shepard napisał(a):bo sam word nie ma zapisu do pdf.


Word 2010 ma wbudowaną funkcję zapisu do PDF i nie potrzebuje żadnej dodatkowej wtyczki.

shepard napisał(a):Także nie chodziło mi o kompilacje pdf dla własnych potrzeb tylko o napisanie programu, który by w tym formacie potrafił zapisać zwykły tekst.


Bez Rave Report, który to moduł oferuje wizualne projektowanie funkcji drukowania i zapisu do różnych formatów, będzie to trudne gdyż bibliotek obsługujących ten format jest jak na lekarstwo.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] generowanie pdf

Nowy postprzez shepard » wtorek, 11 września 2012, 07:15

Cyfrowy Baron napisał(a):
Word 2010 ma wbudowaną funkcję zapisu do PDF i nie potrzebuje żadnej dodatkowej wtyczki.

Być może, pamiętam, że do wcześniejszych wersji trzeba było takową pobrać.


Cyfrowy Baron napisał(a):Bez Rave Report, który to moduł oferuje wizualne projektowanie funkcji drukowania i zapisu do różnych formatów, będzie to trudne gdyż bibliotek obsługujących ten format jest jak na lekarstwo.


Ok, więc zrobiłem jak powiedziałeś. Tylko, że jako jestem newbie to się zakrzaczyłem a tego co w necie mało co kumam.
Mam, więc tak:
Obiekt Memo1 i Button1 i pod zdarzeniem Button1 jeden dałem takowy kod:
Kod: Zaznacz cały
RvSystem1->DefaultDest = rdFile;
   RvSystem1->DoNativeOutput = false;
   RvSystem1->RenderObject = RvRenderPDF1;
   RvSystem1->OutputFileName = "test.pdf";
   RvSystem1->SystemSetups = RvSystem1->SystemSetups >> ssAllowSetup;
   RvSystem1->Execute();


Elegancko tworzy mi plik o nazwie 'test.pdf' w folderze projektu, jednak jest to pusty plik pdf, i moje pytanko: Co muszę dopisać, aby pobierał mi tekst z Memo1 i zapisywał w tym pliku (test.pdf)??
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] generowanie pdf

Nowy postprzez shepard » wtorek, 11 września 2012, 16:22

:cry:
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] generowanie pdf

Nowy postprzez Cyfrowy Baron » wtorek, 11 września 2012, 16:23

To nie jest tylko kwestia dopisania, musisz utworzyć w Rave odpowiedni projekt, a w projekcie aplikacji w Builderze musisz umieścić na formularzu komponent RvProject i w jego właściwości ProjectFile dodać projekt stworzony w Rave.
Do tworzenia PDF masz komponent RvRenderPdf.

Ja jednak nie wiem jak się tego używa, gdyż jeszcze z tego nie korzystałem. Ktoś tu na forum używa Rave więc może będzie mógł powiedzieć więcej.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] generowanie pdf

Nowy postprzez Cyfrowy Baron » wtorek, 11 września 2012, 16:26

Zaraz spróbuję cos zrobić, może mi wyjdzie, ale nie obiecuję.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] generowanie pdf

Nowy postprzez shepard » wtorek, 11 września 2012, 17:02

W sieci też tego pełno dziadostwa ale wszystko wymaga użycia projektu *.rav... Dziwi mnie fakt, że można wygenerować pusty pdf bez możliwości wpisania w niego tekstu np z Memo... Musi być jakiś sposób nadpisania tego pliku zwykłym tekstem bez konieczności tworzenia rav project file, albo tylko tak mi sie wydaje..
Avatar użytkownika
shepard
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): sobota, 8 września 2012, 14:20
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Win Xp, Win 7
Kompilator: C++Builder 6, C++Builder 2010, Dev-C++
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB C++] generowanie pdf

Nowy postprzez Cyfrowy Baron » wtorek, 11 września 2012, 19:14

Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] generowanie pdf

Nowy postprzez Cyfrowy Baron » wtorek, 11 września 2012, 20:50

Już wiem jak to zrobić. Umieść na formularzu komponenty: RvProject1; RvSystem1 i RvRenderPDF1.

Komponent RvProject1:
We właściwości Engine wybierz RvSystem1
We właściwości ProjectFile wybierz plik *.rav, który będzie reprezentował raport. By utworzyć ten plik musisz po utworzeniu projektu aplikacji i rozmieszczeniu komponentów otworzyć Rave Report i umieścić na stronie komponent Memo (w Rave). We właściwościach projektu Rave dla Page1 ustaw właściwość PaperSize na A4. Jeżeli nie masz projektu to pobierz z załącznika.

Teraz kod. Utwórz zdarzenie OnPrint dla komponentu RvSystem1 i umieść w nim taki kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::RvSystem1Print(TObject *Sender)
{
 TBaseReport *bRep = dynamic_cast<TBaseReport *>(Sender);
 bRep->SetFont( L"Arial", 10);
 bRep->GotoXY(1, 1);

 TMemoBuf *bMemo = new TMemoBuf();
 bMemo->PrintStart = 1;
 bMemo->Memo = Memo1;
 int count = Memo1->Lines->Count;
 bMemo->PrintEnd = bRep->PageWidth - 1;


 bRep->PrintMemo( bMemo, count, false);
}


Tworzenie PDF-a w zdarzeniu OnClick dla przycisku Button1:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 RvSystem1->DefaultDest = rdFile;
 RvSystem1->DoNativeOutput = false;
 RvSystem1->RenderObject = RvRenderPDF1;
 RvSystem1->OutputFileName = "c:\\test.pdf";
 RvSystem1->SystemSetups = RvSystem1->SystemSetups >> ssAllowSetup;

 RvSystem1->Execute();
}


Jeśli skompilujesz projekt razem z bibliotekami to plik *.rav zostanie umieszczony w pliku aplikacji (*.exe) i nie trzeba go będzie dołączać do niej przy dystrybucji.

Zła wiadomość RvRenderPDF1 nie obsługuje polskich znaków diakrytycznych.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
shepard
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości