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); } } }