Oppure

Loading
22/04/12 11:22
Renny
Ciao a tutti.
Sto lavorando a un progetto e per creare dei moduli stampabili ho utilizzato questa libreria, a dir poco splendida:
pdfsharp.net/wiki/…
Per creare il pdf non ci sono problemi, riesco a fare tutto, disegnare, scrivere, salvare ecc
Ora però volevo aggiungere al mio form un oggetto pagepreview, come nel sample a questa pagine:
pdfsharp.net/wiki/…
Nel file di download della libraria sono allegati anche i sorgenti dei sample del sito, ma sono scritti in C#, che conosco molto poco. In più sul mio sistema ho solo il compilatore per VB.NET. Ho provato a cercare di capire come funziona il codice, a convertirlo in vb, ma non potendo eseguirlo in debug, non capisco il meccanismo.
Vi chiedo, qualcuno può aprire il progetto in allegato e salvarmi/convertirmi il sorgente in VB.NET ?
Mi basta questo, poi vedo io di studiarmelo, e capirlo.. grazie mille! :k:

PS: sono necessarie le librerie dll di pdfsharp, reperibili free sul sito
Ultima modifica effettuata da Renny 22/04/12 11:23
aaa
22/04/12 13:14
GrG
ok, premetto di non essermi scaricato le librerie ne di aver testato il codice..

questa è una conversione fatta "ad occhio" ma che dovrebbe andare:

    Dim rect As XRect
    Dim pen As XPen
    Dim x As Double = 50
    Dim y As Double = 100
    Dim fontH1 As XFont = New XFont("Times", 18, XFontStyle.Bold)
    Dim font As XFont = New XFont("Times", 12)
    Dim fontItalic As XFont = New XFont("Times", 12, XFontStyle.BoldItalic)
    Dim ls As Double = font.GetHeight(gfx)
    'Draw some text
    gfx.DrawString("Create PDF on the fly with PDFsharp", fontH1, XBrushes.Black, x, x)
    gfx.DrawString("With PDFsharp you can use the same code to draw graphic, text and images on different targets.", font, XBrushes.Black, x, y)
    y += ls
    gfx.DrawString("The object used for drawing is the XGraphics object.", font, XBrushes.Black, x, y)
    y += 2 * ls
    'Draw an arc
    pen = new XPen(XColors.Red, 4)
    pen.DashStyle = XDashStyle.Dash
    gfx.DrawArc(pen, x + 20, y, 100, 60, 150, 120)
    'Draw a star
    Dim gs As XGraphicsState = gfx.Save()
    gfx.TranslateTransform(x + 140, y + 30)
    Dim idx As Integer = 0
    while (idx<360)
        gfx.RotateTransform(10)
        gfx.DrawLine(XPens.DarkGreen, 0, 0, 30, 0)
        idx+=10
    end while
    gfx.Restore(gs)
    'Draw a rounded rectangle
    rect = new XRect(x + 230, y, 100, 60)
    pen = new XPen(XColors.DarkBlue, 2.5)
    Dim color1 As XColor = XColor.FromKnownColor(KnownColor.DarkBlue)
    Dim color2 As XColor = XColors.Red
    Dim lbrush As XLinearGradientBrush = New XLinearGradientBrush(rect, color1, color2, XLinearGradientMode.Vertical)
    gfx.DrawRoundedRectangle(pen, lbrush, rect, new XSize(10, 10))
    'Draw a pie
    pen = new XPen(XColors.DarkOrange, 1.5)
    pen.DashStyle = XDashStyle.Dot
    gfx.DrawPie(pen, XBrushes.Blue, x + 360, y, 100, 60, -130, 135)
    'Draw some more text
    y += 60 + 2 * ls
    gfx.DrawString("With XGraphics you can draw on a PDF page as well as on any System.Drawing.Graphics object.", font, XBrushes.Black, x, y)
    y += ls * 1.1
    gfx.DrawString("Use the same code to", font, XBrushes.Black, x, y)
    x += 10
    y += ls * 1.1
    gfx.DrawString("• draw on a newly created PDF page", font, XBrushes.Black, x, y)
    y += ls
    gfx.DrawString("• draw above or beneath of the content of an existing PDF page", font, XBrushes.Black, x, y)
    y += ls
    gfx.DrawString("• draw in a window", font, XBrushes.Black, x, y)
    y += ls
    gfx.DrawString("• draw on a printer", font, XBrushes.Black, x, y)
    y += ls
    gfx.DrawString("• draw in a bitmap image", font, XBrushes.Black, x, y)
    x -= 10
    y += ls * 1.1
    gfx.DrawString("You can also import an existing PDF page and use it like an image, e.g. draw it on another PDF page.", font, XBrushes.Black, x, y)
    y += ls * 1.1 * 2
    gfx.DrawString("Imported PDF pages are neither drawn nor printed; create a PDF file to see or print them!", fontItalic, XBrushes.Firebrick, x, y)
    y += ls * 1.1
    gfx.DrawString("Below this text is a PDF form that will be visible when viewed or printed with a PDF viewer.", fontItalic, XBrushes.Firebrick, x, y)
    y += ls * 1.1
    Dim state As XGraphicsState = gfx.Save()
    Dim rcImage As XRect = New XRect(100, y, 100, 100 * Math.Sqrt(2))
    gfx.DrawRectangle(XBrushes.Snow, rcImage)
    gfx.DrawImage(XPdfForm.FromFile("../../../../../PDFs/SomeLayout.pdf"), rcImage)
    gfx.Restore(state)


Questo codice va inserito in qualche sub

Se hai problemi fammi sapere che provvederò a mettere la pigrizia da parte e proverò a testare di persona :asd:
aaa
22/04/12 14:13
Renny
Ok.. ho trovato un sito dove poter convertire il codice da C# a vb.net.
Quello che non riesco è creare un progetto funzionante in tutte le sue parti perché mi da problemi con gli eventi..
C'è tutta una parte che utilizza i delegate che non conosco..
Se mi dite dove posso caricare il progetto, lo uplodo, così ci date un'occhiata..
...
Ultima modifica effettuata da Renny 22/04/12 15:22
aaa
22/04/12 16:27
GrG
lo puoi uppare direttamente qui..
al prossimo post di risposta sotto alla finestra per scrivere il messaggio e ai vari smail c'è il pulsante "Scegli file".

Da lì scegli file e clicchi invia ;) (attento che il formato rar non è valido quindi comprimilo in zip)

p.s. mi sta venendo un dubbio, forse è un'opzione abilitata solo ai membri ma credo di no, comunque prova
aaa
22/04/12 16:38
Renny
Io avevo caricato un rar, infatti.. Però non ha senso zip si e rar no..
Studiando il codice, il nocciolo della questione è questo:
 Public Shared Sub Main()
            Dim renderer As New Foglio()
            Dim form As New PreviewForm()
            form.RenderEvent = New PagePreview.RenderEvent(AddressOf renderer.Disegna)
            Application.Run(form)
        End Sub

Ho impostato il project, in modo che parta su sub main e ok.
Il form di preview è form, render è la classe che contiene l'istruzione sub Disegna, che è quella che hai convertito tu e che contiene del semplice codice per creare il mio pdf. Quello che non mi è chiaro è il passaggio "form.RenderEvent = .." e il fatto che la sub Disegna della classe render ha come parametro di input un oggetto xgraphics, che non so chi glielo passa..
Se riesci a compilare il progetto e a farmi sapere qualcosa.. A me basta utilizzare l'oggetto pagepreview per fargli mostrare il pdf che creo io, di cui ho già tutto il codice fatto..
Grazie :k:
aaa
22/04/12 17:51
GrG
ok, sto provando il sorgente anche se è in C# e non in VB.NET come mi aspettavo (dato che avevi detto che stavi lavorando con vb no?)

comunque sia (a parte un errore di distrazione) vedo che non mi viene riconosciuto PagePreview, è questo l'errore che non ti è chiaro?

Edit: Non so perchè ma è come se mi mancasse una libreria.. mm non gli va bene il framework che ho, ma non capisco come mai con vb 2010 mi referenzia correttamente le librerie..

Edit: Comunque ho trovato questo codice in vb che dovrebbe fare la preview:
medatasolutions.net/CDS/code/Utilities/MELib/MELib.Printing/Printing/…
Ultima modifica effettuata da GrG 22/04/12 18:32
aaa
22/04/12 20:56
Renny
Ciao
Eh, si, il codice che ho trovato fa parte dei sample delle librerie e sono in C#, linguaggio che conosco poco e del quale non ho il compilatore. A me serviva avere lo stesso progetto scritto in vb.net, in modo da potermelo studiare e capire.
Quello che ho fatto è stato convertire i 2 file del sample, program.cs e previewform.cs tramite questo sito developerfusion.com/tools/convert/csharp-to-vb/
Ho creato quindi un nuovo progetto in vb.net, nel codice del form ho aggiunto il codice di previewform e in una classe separata ho messo program, dove c'è la sub main che viene eseguita all'avvio del progetto.
Gli errori che rilevo sono qua:

''' <summary>
''' Create a new PDF document and start the viewer.
''' </summary>
Private Sub MakePdf()
Dim filename As String = Guid.NewGuid().ToString().ToUpper() & ".pdf"
Dim document As New PdfDocument(filename)
document.Info.Creator = "Preview Sample"
Dim page As PdfPage = document.AddPage()
page.Size = PageSize.A4
Dim gfx As XGraphics = XGraphics.FromPdfPage(page)

'RaiseEvent renderEvent(gfx) <- non esiste l'evento renderEvent(gfx)
document.Close()
Process.Start(filename)
End Sub

'e in questa funzione
Private Sub PrintPage(ByVal sender As Object, ByVal ev As PrintPageEventArgs)
Dim graphics As Graphics = ev.Graphics
graphics.PageUnit = GraphicsUnit.Point
Dim gfx As XGraphics = XGraphics.FromGraphics(graphics, PageSizeConverter.ToSize(PageSize.A4))
'RaiseEvent renderEvent(gfx)
ev.HasMorePages = False
End Sub

Quando faccio il debug, commentando le istruzioni, il codice funziona. Quello che non capisco è però perché e come adattarlo. Io ho nel mio progetto una funzione che crea il new document pdf e il gfx conseguente. Vorrei quindi passare il mio gfx per mostrare l'anteprima.
Ora studio io pezzo di codice che hai linkato, anche se ad occhio sembra la conversione in .net di previewform.
Ciao e grazie.

EDIT 1
Allora, ho fatto un po' di prove sono riuscito a far funzionare in parte il controllo pagepreview.
Il nocciolo è questo:
 SetRenderEvent(New PdfSharp.Forms.PagePreview.RenderEvent(AddressOf report.RenderPage))

Che imposta l'esecuzione dell'evento render tramite un delegate (giusto?) puntando alla sub renderpage dell'oggetto report.
Su un altro form ho la classe report e la sub renderpage. Come parametro di input la sub prevede un oggetto Xgraphics e al suo interno ho delle istruzioni per disegnare e scrivere sull'oggetto di tipo Xgraphics. Quello che non capisco è
-da dove salta fuori sto oggetto, cioè, dov'è che viene inizializzato? Io ho già il mio oggetto Xgraphics, che uso per creare i miei report, a partire dal documento pdf.
-Come faccio a far mostrare il MIO oggetto Xgraphics, già creato e scritto? :_doubt:
Ultima modifica effettuata da Renny 23/04/12 10:06
aaa
23/04/12 17:54
GrG
mm... non ho le idee molto chiare, visto che ora l'hai convertito in vb.net (quindi dovrebbe andare anche a me) ti dispiacerebbe allegarlo così lo provo direttamente?

Io ho già il mio oggetto Xgraphics, che uso per creare i miei report, a partire dal documento pdf.
-Come faccio a far mostrare il MIO oggetto Xgraphics, già creato e scritto?


mmm.. sottolinei "mio" cioè vuoi dire che mostri un oggetto Xgraphics differente?
aaa