Jump to content
nando4

Criar PDF a partir de dados de um form

Recommended Posts

nando4

Boas...

Alguém sabe como se faz para criar um PDF a partir de dados de um form? Estou a fazer um software de gestão e a minha ideia era o utilizador poder criar um PDF de, por exemplo, um recibo.

Cumps

Share this post


Link to post
Share on other sites
obamaself

podes criar com print document.

como se desenha: http://wiki.portugal-a-programar.org/dev_net:vb.net:relatorios

e tens de instalar : http://www.biopdf.com/

no botão onde pretendes imprimir, tens de por :

Dim obj As New bioPDF.PDFPrinterSettings
        Dim ÉPDF As Boolean = Nothing
        Dim PDF_PRINTERNAME As String = "PDF Writer - bioPDF"
        Dim Directorio As String = "C:\"
        Dim Nome_Arquivo As String = "aaaaa" 'CStr(Now)

        'obj.SetValue("Output", Directorio & "\" & Nome_Arquivo & ".pdf")
        'obj.SetValue("Output", "C:\Test.PDF")
        obj.SetValue("ConfirmOverwrite", "no")
        '  obj.SetValue("ShowSaveAS", "never")
        obj.SetValue("ShowSettings", "never")
        obj.SetValue("ShowPDF", "yes")
        obj.SetValue("RememberLastFileName", "no")
        obj.SetValue("RememberLastFolderName", "no")
        obj.WriteSettings(True)

        Dim pdPrinter As New PrintDocument
        Dim ppvwPrinter As New PrintPreviewDialog
        Clipboard.SetImage(My.Resources.logotipo)

        AddHandler pdPrinter.PrintPage, AddressOf PrintDocument1_PrintPage

        ppvwPrinter.Document = pdPrinter
        ppvwPrinter.Width = Screen.PrimaryScreen.Bounds.Width
        ppvwPrinter.Height = Screen.PrimaryScreen.Bounds.Height
        ppvwPrinter.PrintPreviewControl.Zoom = 0.5
        ppvwPrinter.ShowDialog()



        pdPrinter.Dispose()
        ppvwPrinter.Dispose()

Não sei se há mais alguma maneira.

Share this post


Link to post
Share on other sites
Andrepereira9

Já existem outros tópicos com o mesmo assunto

Portugal - a - Programar


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Share this post


Link to post
Share on other sites
filiperainho

Boas, podes usar está biblioteca chamada iTextSharp:

http://www.itextpdf.com/

É muito boa, já usei.


Programador - C# ; C ; PHP ; JavaScript ; CSS ; HTML ; iniciante em Android.

Share this post


Link to post
Share on other sites
nando4

Pois mas isso esta feito em VB e eu não percebo nada de VB. Estou a tentar adaptar o codigo do obamaself mas nao sei o que é o Dim em c#.

Cumps

Share this post


Link to post
Share on other sites
Caça

É a declaração de uma variável


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
nando4

Já consegui adaptar algum código mas ainda continuo com dificuldades.

Aqui está o que eu consegui ate agora:

PrinterSettings obj = new PrinterSettings();
            bool ÉPDF = null;
            string PDF_PRINTERNAME = "PDF Writer - bioPDF";
            string Directorio = @"C:\";
            string Nome_Arquivo = "aaaaa";//'CStr(Now)'

            //obj.SetValue("Output", Directorio & "\" & Nome_Arquivo & ".pdf");
            //'obj.SetValue("Output", "C:\Test.PDF");
            obj.SetValue("ConfirmOverwrite", "no");
            //'  obj.SetValue("ShowSaveAS", "never");
            obj.SetValue("ShowSettings", "never");
            obj.SetValue("ShowPDF", "yes");
            obj.SetValue("RememberLastFileName", "no");
            obj.SetValue("RememberLastFolderName", "no");
            obj.WriteSettings(True);

            PrintDocument pdPrinter = new PrintDocument();
            PrintPreviewDialog ppvwPrinter = new PrintPreviewDialog();
            Clipboard.SetImage(My.Resources.logotipo);

            AddHandler pdPrinter.PrintPage, AddressOf PrintDocument1_PrintPage;

            ppvwPrinter.Document = pdPrinter;
            ppvwPrinter.Width = Screen.PrimaryScreen.Bounds.Width;
            ppvwPrinter.Height = Screen.PrimaryScreen.Bounds.Height;
            ppvwPrinter.PrintPreviewControl.Zoom = 0.5;
            ppvwPrinter.ShowDialog();

            pdPrinter.Dispose();
            ppvwPrinter.Dispose();

Se alguem me puder ajudar agradecia

Cumps

Share this post


Link to post
Share on other sites
nando4

As partes que me dao erro sao estas:

bool ÉPDF = null;

obj.SetValue("ConfirmOverwrite", "no");//nao reconhece o "SetValue"
obj.SetValue("ShowSettings", "never");//nao reconhece o "SetValue"
obj.SetValue("ShowPDF", "yes");//nao reconhece o "SetValue"
obj.SetValue("RememberLastFileName", "no");//nao reconhece o "SetValue"
obj.SetValue("RememberLastFolderName", "no");//nao reconhece o "SetValue"
obj.WriteSettings(true);//nao reconhece o "WriteSettings"

Clipboard.SetImage(My.Resources.logotipo);//nao reconhece o "My"

AddHandler pdPrinter.PrintPage, AddressOf PrintDocument1_PrintPage;

Eu ja experimentei comentar as linhas que dao erro e por o programa a correr e quando carrego no botao para imprimir e cria o pdf mas fica vazio.

Cumps

Share this post


Link to post
Share on other sites
obamaself

Acho que tens de procurar outro exemplo, porque aquele foi o ÚNICOO código para imprimir na net em PDF.

Já estava farta de procurar e só tinha esse. Vai ser difícil modificares para C.

Share this post


Link to post
Share on other sites
nando4

Boas estou a usar o itextsharp e ja consigo criar o pdf mas ele guarda automaticamente na pasta Debug do programa, eu ja "remediei" essa situação usando o comando:

//pap.pdf é o nome do ficheiro e vArq é o caminho que o utilizador escolheu no FolderBrowserDialog
File.Move("pap.pdf",vArq);

Gostava de saber se não há outra maneira de fazer isto pois eu queria fazer isto:

Process.Run("pap.pdf");

Mas ele dá erro pois ele deve ir buscar o pdf a pasta Debug.

Cumps

Share this post


Link to post
Share on other sites
nando4

Boas já consegui adicionar imagens ao pdf com a livraria itextsharp, mas eu queria que a imagem mais os dados da empresa ficassem no cabeçalho mas não o consigo criar. Já encontrei um ou dois tutorias na net mas como a minha versão do itextsharp é 5.0.6.0 ele nao reconhece alguns comandos que usaram no toturial.

Alguem me pode ajudar?

Cumps

Share this post


Link to post
Share on other sites
bar

Para quem tinha tantas dificuldades tens feito um bom trabalho  :)


Nem tocam na xixa.

Share this post


Link to post
Share on other sites
nando4

LOL podera com o tempo que eu tenho passado a pesquisar na net  :wallbash:

Share this post


Link to post
Share on other sites
nando4

Boas...

Já consegui fazer mais alguns progressos, já consegui adicionar a imagem e o cabeçalho, ainda não tentei fazer o rodapé mas não deve ser muito diferente do cabeçalho.

Mas mais uma vez deparei-me com outro problema: a imagem fica cortada, supostamente era para ficar no topo superior esquerdo mas fica cortada pelo inicio da pagina.

Aqui vai o código que fiz num form à parte com apenas o botão de gerar o pdf:

using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //caminho onde o pdf vai ser guardado
            string vArq = "";

            //nome do pdf
            string nome_pdf = "pap";

            //cria a variavel vSalvar que é o directorio onde vai guardar o pdf
            FolderBrowserDialog vSalvar = new FolderBrowserDialog();

            if (vSalvar.ShowDialog() == DialogResult.Cancel)

                return; // Cancela todo processo

            // Insere na variavel o caminho selecionado pelo usuário e concatena com o nome do arquivo
            vArq = vSalvar.SelectedPath + "\\" + nome_pdf.Trim() + ".pdf";

            // instantiate Document
            Document documento = new Document();

            // get PdfWriter instance/Stream object
            PdfWriter pw = PdfWriter.GetInstance(documento, new FileStream("pap.pdf", FileMode.Create));

            // Step 3 - create an instance of our class inheriting
            // from PdfPageEventHelper and attach the listener to the
            // PdfWriter. the OnEndPage() override code we wrote
            // above will write the image header on each page.
            _events oi = new _events();
            // 'pw' is a reference to the PdfWriter.
            pw.PageEvent = oi;

            // Step 4
            // open document
            // add content
            //open the document
            documento.Open();

            //this is just some default text I used. a Paragraph instance is just repeated 100 times
            Paragraph para;
            for (int x = 1; x <= 100; x++)
            {
                para = new Paragraph("This is a paragraph");
                documento.Add(para);
            }

            //close the document
            documento.Close();
            // close document
            // write Stream to Response object

            File.Move("pap.pdf", vArq);

            MessageBox.Show("Documento PDF criado com sucesso.");
        }
    }

    public class _events : PdfPageEventHelper
    {
        private iTextSharp.text.Image _img;
        public _events()
        {
            /*
            * create single instance so image bytes added **ONCE** to the PDF file,
            * instead of every time you start a new page
            */
            _img = iTextSharp.text.Image.GetInstance(@"C:\Users\Armando\Desktop\ff_logo.png");
            /*
            * scale image to fit available space, if needed
            */
            _img.ScalePercent(50);

            _img.SpacingBefore = 5;
        }
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            iTextSharp.text.Rectangle page = document.PageSize;
            // create two column table;
            PdfPTable head = new PdfPTable(2);
            head.TotalWidth = page.Width;
            // add image; PdfPCell() overload sizes image to fit cell
            PdfPCell c = new PdfPCell(_img, false);
            c.HorizontalAlignment = Element.ALIGN_BASELINE;
            c.Border = iTextSharp.text.Rectangle.NO_BORDER;
            head.AddCell(c);

            // header text
            c = new PdfPCell(new Phrase(DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + " GMT", new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.COURIER, 8)));
            c.Border = iTextSharp.text.Rectangle.NO_BORDER;
            c.VerticalAlignment = Element.ALIGN_BOTTOM;
            head.AddCell(c);
            /*
            * write header w/WriteSelectedRows(); requires absolute positions!
            */
            head.WriteSelectedRows(
              0, -1,          // first/last row; -1 flags all write all rows
              0, // left offset
                // ** bottom** yPos of the table
              page.Height - document.TopMargin + head.TotalHeight,
              writer.DirectContent
            );
        }

Vou continuar a "martelar" neste código, se alguém souber como resolver o problema da imagem agradeço.

Cumps

Share this post


Link to post
Share on other sites
nando4

Boas...

Problema da imagem resolvido, alterei o tamanho da imagem, mas agora ao gravar o pdf se ja existir outro com o mesmo nome dá erro, nao sabem como faço para perguntar se quer substituir?

Desde ja agradeço a ajuda.

Cumps

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.