Biblioteka do tworzenia i edytowania plików PDF z c#

20-gru-2010

Telefon od starego znajomego programisty: „Jak się nazywa biblioteka pozwalająca na pracę z PDF z C#?”. Dziwne pytanie, biorąc pod uwagę o czym zwykle się rozmawia ze starymi znajomymi, ale my jesteśmy programistami i dzięki temu pytanie wcale nie budzi oburzenia.

To fantastycznie, że ktoś pamięta jakie cuda się za dawnych czasów robiło z PDFami 🙂

Ta biblioteka to PDF Sharp. Strona tego darmowego projektu to http://www.pdfsharp.net/. Kilka fantastycznych przykładów ze strony pokazuje jak prosto pracować z plikami PDF z poziomu C#.

Najważniejsze cechy biblioteki z jakich zdarzyło mi się skorzystać to łączenie, dzielenie istniejących plików PDF na strony oraz tworzenie nowych plików PDF poprzez typowe metody jezyka C#.

Fantastycznie, że takie narzędzie powstało!

Poniżej klasa wykorzystujaca bibliotekę PDF Sharp i z jej pomocą scalajaca pliki PDF.

Najpierw utwórz dokument PDF (Obiekt klasy PdfFile),a potem wskaż z jakiego innego dokumentu dodać do niego strony. Na koniec zapisz nowy dokument pod nową nazwą wykorzysujac metodę Save.

using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
namespace Mobilo.Common
{
    /// <summary>
    /// Klasa pozwala łączyć dokumenty PDF
    /// </summary>
    public class PdfFile
    {
        PdfDocument _pdfDoc = null;
        /// <summary>
        /// Obiekt PDFDocument, zawierający strony dokumentu
        /// </summary>
        public PdfDocument PdfDoc
        {
            get
            {
                return _pdfDoc;
            }
        }
        /// <summary>
        /// Zwraca strumien z zapisaną zawartością PDF-a
        /// </summary>
        public System.IO.MemoryStream PdfStream
        {
            get
            {
                System.IO.MemoryStream memStream = new System.IO.MemoryStream();
                _pdfDoc.Save(memStream);
                return memStream;
            }
        }
        /// <summary>
        /// Zwraca strumien z zapisaną zawartością PDF-a
        /// </summary>
        public void LoadPdfFile(string file)
        {
            _pdfDoc = new PdfDocument(file);
        }
        /// <summary>
        /// Metoda dodająca do bieżącego PDF-a strony dokumentu przekazywanego jako parametr
        /// </summary>
        /// <param name="path">ścieżka do dokumentu,który należy dopisać</param>
        /// <returns>true, jeżeli wszystko ok, false w przeciwnym razie</returns>
        public bool Append(string path)
        {
            //Sprawdzenie czy plik istnieje
            if (System.IO.File.Exists(path))
            {
                //Jeżeli plik jest poprawnym Pdfem
                PdfDocument appendedDoc = null;
                try
                {
                    appendedDoc = PdfReader.Open(path, PdfDocumentOpenMode.Import);           
                }
                catch
                {
                    return false;
                }
                //Przepisać strony z nowego dokumentu
                AppendPagesFromDoc(appendedDoc);
            }
            
            return true;
        }
        /// <summary>
        /// Metoda dodająca do bieżącego PDF-a strony dokumentu przekazywanego jako parametr
        /// </summary>
        /// <param name="path">ścieżka do dokumentu,który należy dopisać</param>
        /// <returns>true, jeżeli wszystko ok, false w przeciwnym razie</returns>
        public bool Append(System.IO.Stream stream)
        {
            //Sprawdzenie czy plik istnieje
            if (stream!=null)
            {
                //Jeżeli strumien jest poprawnym Pdfem
                PdfDocument appendedDoc = null;
                try
                {
                    appendedDoc = PdfReader.Open(stream,PdfDocumentOpenMode.Import);
                }
                catch
                {
                    return false;
                }
                //Przepisać strony z nowego dokumentu
                AppendPagesFromDoc(appendedDoc);
            }
            return true;
        }
        /// <summary>
        /// Dopisuje do bieżącego dokumentu przekazany dokument
        /// </summary>
        /// <param name="appendedDoc">Dokument ze stronami do dopisania do biezacego</param>
        private void AppendPagesFromDoc(PdfDocument appendedDoc)
        {
            if (_pdfDoc == null)
            {
                //Jeżeli to jest pierwszy dodawany dokument
                _pdfDoc = appendedDoc;
            }
            else
            {
                //Iteracja przez strony appendowanego dokumentu
                for (int i = 0; i < appendedDoc.PageCount; i++)
                {
                    PdfPage page = appendedDoc.Pages[i];
                    _pdfDoc.AddPage(page);
                }
            }
        }
        /// <summary>
        /// Zapisuje wszyskie strony dokumentu we wskazanej lokalizacji na dysku
        /// </summary>
        /// <param name="path">ścieżka do pliku</param>
        public void Save(string path)
        {
            _pdfDoc.Save(path);
        }
        /// <summary>
        /// Zapisuje wszyskie strony dokumentu we wskazanej lokalizacji na dysku
        /// </summary>
        /// <param name="path">ścieżka do pliku</param>
        public void Save(System.IO.Stream stream)
        {
            _pdfDoc.Save(stream);
        }
    }
}

Komentarze są wyłączone

Autor: Rafał Kraik