Italian PDFDocument aggiunta Campo Memo

Gianni Sassanelli

Active Member
Licensed User
Longtime User
Buongiorno a tutti,
sto utilizzando la libreria PDFDocument per creare un PDF

Ho un problema sul render dei campi memo che ottengo con il codice seguente.

Ho chiesto aiuto per cambiare il TYPEFACE sui campi memo ed Erel mi ha risposto che devo usare il canvas vedendo un esempio nel seguente link
https://www.b4x.com/android/forum/threads/wordwrap-to-a-canvas.71712/#post-456049

Purtroppo non riesco a capire come fare.
qualcuno può aiutarmi per favore?


B4X:
Sub MakePDF
    Dim PDF1                     As PDFDocument
    Dim PDF_PAGEINFO      As PageInfo   
    Dim PDF_RECT            As Rect
    Dim ptLeft, ptwidth     As Int
    Dim ptTop, ptHeight    As Int
    Dim Fsize                 As Int
    ptLeft     = 5
    ptTop     = 5
    ptwidth  = 200
    ptHeight  = 50
    Fsize     = 10 / GetDeviceLayoutValues.Scale
    
    PDF_RECT.Initialize(10,10,595-20,842-20) 'bordo di 10
    PDF_PAGEINFO.Initialize(595,842,1,PDF_RECT)
    Dim PDF_Page As Page = PDF1.startPage(PDF_PAGEINFO)
    Dim Txtmemo As String
    Txtmemo = $"
        Questo è un esempio di stringa multi riga
            ${DateTime.Date(DateTime.Now)} ${DateTime.Time(DateTime.Now)}
        ----------------------------------------------
        Riga 1
        Riga 2
        Riga 3
        ==============================================
        Fine"$   
    Dim PDF_TextRec     As TextRec
    PDF_TextRec.Initialize(Txtmemo,ptwidth,822,ptHeight,Colors.DarkGray)
    'I NEED HERE to USE a MY Typeface for TextRec Object
    ' IS this possible??
    
    PDF_TextRec.draw(PDF_Page,0,0)
    PDF1.finishPage(PDF_Page)
    PDF1.writeTo(File.DirRootExternal,"TestPdfDocument.pdf")
End Sub
 

IlCasti

Active Member
Licensed User
Longtime User
Ciao
Spero di darti una mano...
Sicuramente poi gente più brava verrà in nostro soccorso, vero Mario? :D


B4X:
'Questa sub ti serve per disegnare la canvas e la piazzi al di fuori della creazione del Pdf
Sub DrawView (cvs As Canvas, v As View)
   Dim cjo As JavaObject = cvs
   Dim jv As JavaObject = v
   jv.RunMethod("draw", Array(cjo.GetFieldJO("canvas")))
End Sub



'Questo lo metti dove commenti il tuo codice per il typeface
Dim MioFont As Typeface
MioFont = Typeface.LoadFromAssets("MioFont.ttf") 'Ci metti il font che carichi dall'asset
EditTesto.Typeface = MioFont

'Edit (Mancava la dim dell'edittext)
Dim EditTesto As EditText
EditTesto.Initialize("")
EditTesto.SingleLine=False
EditTesto.Text="Testo"&CRLF&"PDF"&CRLF&"Multilinea per Canvas View"

'Disegni il canvas
Dim c As Canvas
c.Initialize(Activity)
DrawView(c, EditTesto)

Ciao
 
Last edited:

IlCasti

Active Member
Licensed User
Longtime User
Falsissimo; sia perchè non sono affatto più bravo in generale, sia perché nello specifico ho creato mezzo pdf in tutta la mia (brevissima :p) vita.

Hai "ragionissima"! Ho menzionato il vocabolo sbagliato... "Esperto" :p
Quindi tieniti pronto ad aiutarci ;)
 

Gianni Sassanelli

Active Member
Licensed User
Longtime User
Ciao IlCasti, e Lucas
anzitutto buon Ferragosto.

Purtroppo il codice non funziona essenzialmente io credo per questi motivi.

1) mi sembra che la editText deve essere aggiunta alla View( activity, panel ecc) prima di essere inserita nel canvas
2) non so come posizionare la canvas, dove voglio io non trovo metodi move top ecc
3) ammesso che riesca a gestire la canvas, non capisco come usare questo codice nella creazione del pdf.
 

LucaMs

Expert
Licensed User
Longtime User
Ciao e buona festa anche a te.

Come detto, ne so ben... niente (in passato, anni fa feci qualcosa ma la mia memoria arriva al massimo a... 10 minuti fa :D:().

Mi indichi con precisione (link) la libreria per il pdf che hai usato? Magari faccio qualche provola.
 

LucaMs

Expert
Licensed User
Longtime User
Cmq, per me adesso non è il momento di ragionare troppo.

Dal primo link che hai postato:

pdf.Canvas.DrawText("Hello", 100, 100, Typeface.DEFAULT_BOLD, 30 / GetDeviceLayoutValues.Scale , Colors.Yellow, "CENTER")

Qui nessuno ti obbliga ad usare Typeface.DEFAULT_BOLD.
In generale (quindi non mi riferisco ai pdf) puoi cambiare font in questo modo:

B4X:
' Process_Globals
Private default_font, default_font_bold, default_font_italic As Typeface 'ignore

SetFont(FontFileName) ' <--- qui chiaramente devi mettere il nome del file del tuo font

Private Sub SetFont(FontFileName As String)
   default_font = Typeface.LoadFromAssets(FontFileName) 'ignore
   default_font_bold =   Typeface.CreateNew(default_font, default_font.STYLE_BOLD)
   default_font_italic = Typeface.CreateNew(default_font, default_font.STYLE_ITALIC)
End Sub


Volendo impostare il font per una Label o EditText:
B4X:
Public Sub SetViewTextFont(Vw As View, FontFileName As String)
   If Vw Is Label Then
       SetFont(FontFileName)
       Dim lbl As Label = Vw
       lbl.Typeface = default_font
   Else if Vw Is EditText Then
       SetFont(FontFileName)
       Dim et As EditText = Vw
       et.Typeface = default_font
   Else
       Log("SetViewTextFont - not a valid view. Pass labels or edittexts")
   End If
End Sub
 

Gianni Sassanelli

Active Member
Licensed User
Longtime User
Si Lucas,
tutto quello che hai detto è assolutamente vero.
il link sbagliato è questo:
https://www.b4x.com/android/forum/t...g-android-jar-built-in-methods.74830/#content

Il mio problema sta nelle stringhe multi riga per esempio un campo memo di un database oppure come quella riportata sotto
in questo caso ho usato il TextRect preso dall'esempio di DonManfred ma purtroppo su quest'ultimo non riesco a settare la typeface

B4X:
Dim mlStr as String =$"
Riga 1
                                                       Riga 2
      Riga 3
=============================================
"$

La mia idea sarebbe quella di visualizzare tutti gli oggetti nella page, prendere l'oggetto ed in java impostargli la typeface ma non ho le conoscenze per fare questo
oppure mi hanno suggerito di usare un canvas, ma non riesco a capire come
 

Gianni Sassanelli

Active Member
Licensed User
Longtime User
Prova questo e se non funzionasse... peggio per te :p
Ciao Luca
il tuo esempio funziona, il problema è il posizionamento.
La canvas viene visualizzata in alto a destra come faccio a posizionarla in un punto da me voluto???
questo è il problema

Quanto alla libreria, sia Erel che Don Manfred usano la libreria PDF.Jar
Erel non ha previsto il render di stringhe multi-linea (campi memo e/o varchar(max))
DonManfred usa un oggetto TxtRect, attualmente presente nella libreria, ma non ha previsto la gestione del typeface per questo oggetto, altrimenti sarebbe tutto ok.

Ad ogni modo con il workAround di Erel si riesce ad aggirare l'ostacolo creando un edtTextUI che viene renderizzato in BMP e dopo inserisco l'immagine risultante nel pdf. Non è il massimo ma non ho altra soluzione.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Beh, nel mio esempio in realtà è la label in alto a destra, il canvas è inizializzato su tutta l'activity, se ricordo bene.
Vediamo se si possa utilizzare un rect - ammetto di non aver smanettato molto con questa roba...
 
Top