Autore Topic: [Risolto] PdfWriter e funzione Multiriga  (Letto 943 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
[Risolto] PdfWriter e funzione Multiriga
« il: 24 Giugno 2016, 18:12:05 »
La guida di PdfWriter comincia con la seguente frase: "Con questa potente classe è possibile creare dei report professionali ed esteticamente accattivanti in pochissimo tempo".
Lungi da me l'intenzione di avviare una polemica, ma mi sto imbattendo per la terza volta a gestire un output con PdfWriter e dopo il primo difficoltoso cammino, andato in porto, grazie all'aiuto di amici di questo Forum, il secondo tentativo è fallito miseramente, questo, cioè il 3°, mi sta creando non poche difficoltà.
Dovendo riportare in output.pdf il contenuto di una TextArea, ho pensato di sfruttare la funzione Multiriga che sconosco completamente, ma che, seguendo la guida, pensavo di potere mettere in pratica facilmente.  Macchè, ottengo un file dove le righe risultano, è vero,  tutte stampate, ma sovrapposte.
Nel richiamare la mia procedura "ListAnom", sottoclasse di PdfWriter, passo come parametro dati un un'unica stringa contenente le righe da stampare, distinte ciascuna dalla successiva dalla presenza di una sequenza di escape "\n", mentre all'interno di ciascuna riga sono presenti anche sequenze del tipo "\t".
Codice: [Seleziona]
Public Sub PulsPdf_Click()       '   Il file .pdf prodotto viene poi mostrato sul display
'----------------------------------------------------------------------------
  FaiPdf(Foglio.Text)
  Shell("Exec = libreoffice/home/piero/MovvAnomStmp")
End

Public Sub PulStampa_Click()    '   Il file .pdf prodotto viene poi stampato
Dim hStampa As Process
'---------------------------------ù
  FaiPdf(Foglio.Text)
  hStampa = Shell("lpr -o media=A4 " & User.home & "/MovvAnomStmp")
End

Private Sub FaiPdf($Testo As String)
Dim pdf As ListAnom
  '-------------------------------------------
  With pdf = New ListAnom("L", "mm", "A4")         'formato della pagina:  A4  orizzontale
        .Open()
        .AliasNbPages()
        .Data($Testo)
        .Output(User.Home & "/MovvAnomStmp", False)
  End With
End

La classe ListAnom esegue lo split della stringa ricevuta in un array di n righe, tante quante sono quelle che dovrebbero essere riportate nel  file.pdf:
Codice: [Seleziona]
Inherits PdfWriter

Private iNumPag As Integer

Public Sub Header()     'intestazione di pagina (valida per tutte le pagine)
End

Public Function Data($TstMultiRg As String)    'corpo di una o più pagine
Dim bEsito As Boolean
Dim bBlu As Boolean

Dim i As Integer = (-1)
Dim ill As Integer
Dim iLun As Integer
Dim iTotRg As Integer

Dim $DxSx As String
Dim $StriMia As String

Dim $RgStmp As New String[]
'---------------------------------------------------------
  Me.AddPage()
  Me.SetX(0)
  Me.SetY(10)
  Me.Ln()

  $RgStmp = Split($TstMultiRg, "\n")
  Me.SetFont("Times", "", 10)
  For Each $RgStmp
    Inc i
    Me.MultiRiga(0, 0, $RgStmp[i], False, "L", False)
    Me.MultiRect([0, 0])
    Me.Lnm()
  Next
End

Public Function Footer()
Dim $FinePag As String = "- Pag. "
'------------------------------------------------------------------
  iNumPag += 1
  $FinePag &= Str(iNumPag) & " -"
  Me.SetXY(100, -270)
  Me.SetFont("Times", "", 10)
  Me.SetLineWidth(0)
  Me.Cell(0, 0, $FinePag, False, 0, "L", False)
  Me.Ln()
End

Le righe prodotte, dovrebbero essere tutte senza bordo.

Non mi resta che studiarmi passo dopo passo il comportamento di PdfWriter, nella speranza di portarlo a termine prima che mi ricrescano i capelli.
« Ultima modifica: 28 Giugno 2016, 21:35:50 da Picavbg »
:ciao:

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re:PdfWriter e funzione Multiriga
« Risposta #1 il: 24 Giugno 2016, 21:36:37 »
Ciao!
la cosa che mi salta all'occhio è che non è impostato la larghezza e l'altezza della riga, prova così:
    Me.MultiRiga(400, 5, $RgStmp, False, "L", False)
Caso mai se non è quello che volevi provo quando ho un pò di tempo

ciao!! :2birre:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:PdfWriter e funzione Multiriga
« Risposta #2 il: 25 Giugno 2016, 17:14:55 »
Grazie Golia del suggerimento. Ho modificato e rimodificato le istruzione per l'impostazione delle righe  ed il posizionamento sugli assi X e Y. In gran partye ci sono riuscito. Non rieso tuttavia ad impostare il primo carattere della riga ad una distanza inferiore a mm.12 dal bordo sinistro del foglio A4.
Noon ho avuto invece problemi a centrare nel fondo pagina la riga di tipo "piè di pagina".
Riporto qui le istruzioni di produzione dell'output:
Codice: [Seleziona]
Public Sub Header()     'intestazione di pagina (valida per tutte le pagine)
End

Public Function Data($TstMultiRg As String)    'corpo di una o più pagine
Dim bEsito As Boolean
Dim bBlu As Boolean

Dim i As Integer
Dim ill As Integer
Dim iLun As Integer
Dim iTotRg As Integer

Dim $DxSx As String
Dim $RgProva As String = "1...+...10....+...20....+...30....+...40....+...50....+...60....+...70....+...80....+...90....+..100....+..110....+..120....+..130....+..140....+..150....+..160....+..170....+..180....+..190....+..200"
Dim $StriMia As String

Dim $RgStmp As New String[]
'---------------------------------------------------------
  Me.SetX(0)
  Me.SetY(10)
  Me.Ln()
  $RgStmp = Split($TstMultiRg, "\n")
  Me.SetX(5)
  Me.SetY(10)
  Me.SetFont("Times", "", 10)
  i = (-1)
  For Each $RgStmp
    Inc i
    Me.MultiRiga(200, 4, $RgStmp[i], False, "L", False)
    Me.Lnm()
  Next
  Me.MultiRiga(200, 4, $RgProva, False, "L", False)
  Me.Lnm()
End

Public Function Footer()
Dim $FinePag As String = "- Pag. "
'------------------------------------------------------------------
  iNumPag += 1
  $FinePag &= Str(iNumPag) & " -"
  Me.SetXY(100, -10)
  Me.SetFont("Times", "", 10)
  Me.SetLineWidth(0)
  Me.Cell(30, 4, $FinePag, False, 0, "L", False)
  Me.Ln()
End


Allego inoltre il file.pdf prodotto. Come puoi constatare la distanza dal bordo sinistro del foglio è maggiore di quella indicata nell'istruzione Me.SetX(0) nella funzione "Data"
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:PdfWriter e funzione Multiriga
« Risposta #3 il: 26 Giugno 2016, 10:55:57 »
Stamani ho provato a stampare alcune righe di prova con l'istruzione "Cell". Ebbene l'allineamento alla posizione "X" da me impostata nell'istruzione SetX funziona perfettamente.
Allego uno spezzone dell'output prodotto.
Ciao
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:PdfWriter e funzione Multiriga
« Risposta #4 il: 26 Giugno 2016, 11:00:41 »

Stamani ho provato a stampare alcune righe di prova con l'istruzione "Cell". Ebbene l'allineamento alla posizione "X" da me impostata nell'istruzione SetX funziona perfettamente.
Codice: [Seleziona]
  Me.SetX(0)
  Me.Cell(200, 4, $RgProva, False, 1, "L", False)
  Me.Ln()
  Me.SetX(1)
  Me.Cell(200, 4, $RgProva, False, 1, "L", False)
  Me.Ln()
  Me.SetX(2)
  Me.Cell(200, 4, $RgProva, False, 1, "L", False)
  Me.Ln()
  Me.SetX(3)
  Me.Cell(200, 4, $RgProva, False, 1, "L", False)
  Me.Ln()
  Me.SetX(4)
  Me.Cell(200, 4, $RgProva, False, 1, "L", False)
  Me.Ln()
  Me.SetX(5)
  Me.Cell(200, 4, $RgProva, False, 1, "L", False)
  Me.Ln()
  Me.SetX(15)
  Me.Cell(200, 4, $RgProva, False, 1, "L", False)
  Me.Ln()
Allego uno spezzone dell'output prodotto.
Ciao
:ciao:

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re:PdfWriter e funzione Multiriga
« Risposta #5 il: 27 Giugno 2016, 12:37:54 »
Ciao Picavbg, scusami se non ho risposto prima...

Ti dico la verità che sono molto arruginito con pdfwriter, allora ho fatto una prova.
Per prima cosa, da come ho capito, secondo me dovresti usare "Multicell" e non "Multiriga", multiriga lo avevamo fatto per fare stampe tipo griglia.
Poi andando a spulciare nei vecchi codici ho visto che per impostare i margini di Multicell usavo "SetXY" e inoltre con "Ln()" , cambia riga, perdi il valore del set (Almeno credo  :D), quindi mettilo dopo la sub multicell o prima di impostare setxy.
Nell'esempio ho incollato un testo già formattato, quindi non ho messo multicell nel ciclo for, vedrai tu col tuo programma come devi fare.
Spero di esserti stato utile, ciao :2birre:
« Ultima modifica: 27 Giugno 2016, 12:44:44 da Golia »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:PdfWriter e funzione Multiriga
« Risposta #6 il: 28 Giugno 2016, 15:51:45 »
Nell'esempio ho incollato un testo già formattato, quindi non ho messo multicell nel ciclo for, vedrai tu col tuo programma come devi fare.
Spero di esserti stato utile, ciao :2birre:

Grazie Golia, ogni tuo suggerimento è prezioso. Non conoscevo il comando "multicell". Sarebbe opportuno, secondo me, aggiungerlo all'interno della guida di "pdfwriter", perchè  in essa si fa rifrimento solamente a "Cell" e "Multiriga".
Ho modificato il mio programma così:
Codice: [Seleziona]
  $RgStmp = Split($TstMultiRg, "\n")
  Me.SetX(5)
  Me.SetFont("Times", "", 10)
  i = (-1)
  For Each $RgStmp
    Inc i
    Me.Multicell(200, 2, $RgStmp[i], False, "L", False)
    Me.Ln()
    Me.SetX(5)
  Next
e funziona perfettamente, proprio come desideravo io.
Come avrai notato ho scritto "Me.SetX(5)"  prima del ciclo "For ... Next". Ciò è dovuto al fatto che la prima riga mi veniva prodotta con un rientro maggiore di tutte le successive. Con  l'aggiunta del  "Me.SetX(5)"  fuori del ciclo  "For ... Next", tutte le righe stampate cominciano tutte alla stessa posizione.
 :2birre:
:ciao:

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re:PdfWriter e funzione Multiriga
« Risposta #7 il: 28 Giugno 2016, 18:17:31 »
Ottimo!
Ciao  :2birre: