Как взять файл с кнопки - PullRequest
       9

Как взять файл с кнопки

0 голосов
/ 05 февраля 2019

Я подал заявку с помощью iTextSharp, чтобы поместить числа в файл PDF.Как вы увидите в следующем коде, мое приложение может это сделать, только если файл находится в определенном каталоге.

Поэтому я сделал кнопку «Другое», где пользователь может выбрать файл.Теперь я хочу, чтобы выбранный файл загрузил преобразованный PDF.

Код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

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

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] bytes = File.ReadAllBytes(@"L:\Users\user\Documents\PDFnummerieren\PDF.pdf");
            iTextSharp.text.Font blackFont = FontFactory.GetFont("Arial", 12, iTextSharp.text.Font.NORMAL, BaseColor.BLACK);
            using (MemoryStream stream = new MemoryStream())
            {
                PdfReader reader = new PdfReader(bytes);
                using (PdfStamper stamper = new PdfStamper(reader, stream))
                {
                    int pages = reader.NumberOfPages;
                    for (int i = 1; i <= pages; i++)
                    {
                        ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_RIGHT, new Phrase(i.ToString(), blackFont), 568f, 15f, 0);
                    }
                }
                bytes = stream.ToArray();
            }
            File.WriteAllBytes(@"L:\Users\user\Documents\PDFnummerieren\PDF1.pdf", bytes);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            var FD = new System.Windows.Forms.OpenFileDialog();
            if (FD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string fileToOpen = FD.FileName;

                System.IO.FileInfo File = new System.IO.FileInfo(FD.FileName);



                System.IO.StreamReader reader = new System.IO.StreamReader(fileToOpen);

            }
        }
    }
}

Так что File.WriteAllBytes(@"L:\Users\user\Documents\PDFnummerieren\PDF1.pdf", bytes); может остаться, потому что это нене имеет значения, куда файл будет загружен после его конвертации.

Но File.ReadAllBytes(@"L:\Users\user\Documents\PDFnummerieren\PDF.pdf"); не должен быть конкретным каталогом, он должен получить выбранный файл от button3.Как вы, наверное, заметили, я новичок в программировании, поэтому я подумал, что мог бы сделать это: File.ReadAllBytes(fileToOpen);, чтобы получить строку.Хотя это не делает его работу.

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Если вы хотите использовать переменную между методами одного и того же класса, вам нужно объявить личную и нестатическую переменную уровня класса (называемую также Instance Field).Это видно каждому методу класса.

public partial class Form1 : Form
{
    // Here declare a variable visible to all methods inside the class but 
    // not outside the class. Init it with an empty string
    private string theFile = "";

    private void button1_Click(object sender, EventArgs e)
    {
        // When you click the button1 check if the variable 
        // has been set to something in the button3 click event handler
        if(string.IsNullOrEmpty(theFile) || !File.Exists(theFile))
            return;

        // Now you can use it to load the file and continue with the code
        // you have already written
        byte[] bytes = File.ReadAllBytes(theFile);
        ......
        ......
    }

    private void button3_Click(object sender, EventArgs e)
    {
        // The only job of button3 is to select the file to work on
        // as you can see we can use the variable also here
        var FD = new System.Windows.Forms.OpenFileDialog();
        if (FD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            theFile = FD.FileName;
    }
}

Но вам действительно нужна отдельная кнопка для этого?Я имею в виду, что вы можете поместить три строки кода в button3 непосредственно в начале кода в button1 и удалить лишние (на данный момент) button3

Я предлагаю вам прочитать некоторые документы по области видимости переменной иВремя жизни

0 голосов
/ 05 февраля 2019

Попробуйте это

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace NummerierePDF
{
    public partial class Form1 : Form
    {
        string fileToOpen = string.Empty;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if(string.IsNullOrWhiteSpace(fileToOpen)) return;

            byte[] bytes = File.ReadAllBytes(fileToOpen);
            iTextSharp.text.Font blackFont = FontFactory.GetFont("Arial", 12, iTextSharp.text.Font.NORMAL, BaseColor.BLACK);
            using (MemoryStream stream = new MemoryStream())
            {
                PdfReader reader = new PdfReader(bytes);
                using (PdfStamper stamper = new PdfStamper(reader, stream))
                {
                    int pages = reader.NumberOfPages;
                    for (int i = 1; i <= pages; i++)
                    {
                        ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_RIGHT, new Phrase(i.ToString(), blackFont), 568f, 15f, 0);
                    }
                }
                bytes = stream.ToArray();
            }
            File.WriteAllBytes(@"L:\Users\user\Documents\PDFnummerieren\PDF1.pdf", bytes);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            var FD = new System.Windows.Forms.OpenFileDialog();
            if (FD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                fileToOpen = FD.FileName;

                System.IO.FileInfo File = new System.IO.FileInfo(FD.FileName);



                System.IO.StreamReader reader = new System.IO.StreamReader(fileToOpen);

            }
        }
    }
}

Я поместил вашу переменную в область видимости класса, и теперь вы можете получить к ней доступ из любой точки вашего класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...