Как заменить байт - PullRequest
       5

Как заменить байт

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

Я сделал приложение, которое позволяет конкретному пользователю выбирать файл PDF со своего устройства и помещать на него номера страниц.После этого файл будет отображаться в определенном каталоге как «PDF.pdf»

Но моя проблема в том, что файлы занимают большой объем памяти, вызывает сбой приложения.

Сообщение об ошибке: Error Alert

Код:

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
    {
        private string theFile = "";
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(theFile) || !File.Exists(theFile))
                return;
            byte[] bytes = File.ReadAllBytes(theFile);
            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(@"C:\Users\user\Pictures\Camera Roll\PDF.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)
                theFile = FD.FileName;
        }
    }
}

Я пытался изменить байт на другой метод, например, int.Но, как вы уже догадались, это не сработает.

1 Ответ

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

Чтобы развернуть более ранний комментарий - в основном, прекратите пытаться хранить целые файлы в памяти как непрерывные массивы - API основан на Stream, и у вас есть FileStream, доступный для вас, поэтому:

iTextSharp.text.Font blackFont = FontFactory.GetFont("Arial", 12,
    iTextSharp.text.Font.NORMAL, BaseColor.BLACK);
using (Stream source = File.OpenRead(theFile))
using (Stream dest = File.Create(@"C:\Users\user\Pictures\Camera Roll\PDF.pdf"))
{
    PdfReader reader = new PdfReader(source);
    using (PdfStamper stamper = new PdfStamper(reader, dest))
    {
        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);
        }
    }
}

Я не могу проверить это отсюда, но он выглядит , как будто он должен работать.

На основании быстрого поиска, он может также работать как:

iTextSharp.text.Font blackFont = FontFactory.GetFont("Arial", 12,
    iTextSharp.text.Font.NORMAL, BaseColor.BLACK);
using (Stream dest = File.Create(@"C:\Users\user\Pictures\Camera Roll\PDF.pdf"))
{
    PdfReader reader = new PdfReader(theFile);
    // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...