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





























