Yunus Emre
Software Engineer
Asp.Net Yüklenen Pdf Dosyasını Sayfalara Ayırma
Bir pdf dosyasını sayfalara ayırma işimiz var. Ancak bu bölme işlemi sayfanın içerisindeki verilere göre olacak. Yani 30 kişilik bir sınıfta her bir öğrencinin bir sayfada verilerinin olduğunu ve öğrencilerin kimlik numaraları ile bu sayfaların oluşturulduğunu düşünelim. Her bir sayfayı ayırıp dosya isimlerini de öğrencilerin kimlik numaraları yapabilir miyiz?
Pdf Dosyasını Sayfalara Ayırma
İlk durumda yerel disk içerisindeki bir pdf dosyanı, dosya yolundan alıp sayfalara ayıracağız. Daha sonra yine aynı şekilde yerel diske dosyaları kayıt edeceğiz. Bunun için “iTextSharp” nuget paketini kullanacağız.
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string inputFilePath = "D:\\Yedek\\Class.pdf";
string outputFolderPath = "D:\\Yedek\\";
SplitPdfByPage(inputFilePath, outputFolderPath);
}
}
Sayfa yüklendiğinde dosya yollarını belirleyip ilgili fonksiyonu çalıştırıyoruz. Burada “Class.pdf” dosyası 30 sayfalık bir doküman ve her bir sayfasında öğrencilerin bilgileri mevcut.
public void SplitPdfByPage(string inputFilePath, string outputFolderPath)
{
using (PdfReader reader = new PdfReader(inputFilePath))
{
int pageCount = reader.NumberOfPages;
for (int page = 1; page <= pageCount; page++)
{
string yeniDosyaAdi = "";
Document document = new Document();
_ = reader.GetPageN(page);
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string metin = PdfTextExtractor.GetTextFromPage(reader, page, strategy);
string desen = @"\b\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\b";
MatchCollection eslesmeler = Regex.Matches(metin, desen);
foreach (Match eslesme in eslesmeler)
{
string tcKimlikNo = eslesme.Value.Replace(" ", "");
string ilk10Hane = tcKimlikNo.Substring(0, 10);
int toplam = 0;
foreach(char karakter in ilk10Hane)
{
if(Char.IsDigit(karakter))
{
toplam += Convert.ToInt32(karakter.ToString());
}
}
char toplamSonKarekter = toplam.ToString()[toplam.ToString().Length-1];
char tcSonKarekter = tcKimlikNo[tcKimlikNo.ToString().Length - 1];
if (toplamSonKarekter == tcSonKarekter)
{
yeniDosyaAdi = tcKimlikNo + ".pdf";
string outputFilePath = System.IO.Path.Combine(outputFolderPath, $"{yeniDosyaAdi}");
PdfCopy pdfCopy = new PdfCopy(document, new FileStream(outputFilePath, FileMode.Create));
document.Open();
pdfCopy.AddPage(pdfCopy.GetImportedPage(reader, page));
document.Close();
pdfCopy.Close();
}
}
}
}
}
Fonksiyon içerisinde kodu kısaca anlatayım. Öncelikle kaynak dokümanı alıp bu dokümanın kaç sayfa olduğunu buluyoruz. Daha sonra bir for döngüsü ile sayfalar arasında geçiş yapıyoruz. Sayfaya giriş yaptıktan sonra “Regex” ile metin elemesi yapıyoruz. Burada 11 haneli sayıları çekiyoruz. Ancak burada her çekilen 11 haneli sayının kimlik numarası olmadığını düşünerek ayrı bir eleme daha yapacağız. Kimlik no eleme için birçok yöntem var ancak ben ilk 10 haneyi toplayarak 11.haneye ulaşma yöntemini seçtim. Bu sebeple kimlik numarasının ilk on hanesini topluyorum ve çıkan sonucun birler basamağını alıyorum. Eğer bu sayı kimlik numarasının 11.hanesine eşit ise bu bir kimlik numarasıdır diyorum.
Artık sayfadaki kimlik numarasından emin olduğumuza göre bu sayfayı alıp kayıt etmemiz lazım. Dosya ismine bulunan kimlik numarasını verip sonuna “.pdf” ekliyoruz. Sayfa yüklenirken belirttiğim “D:/Yedek” dizinine de dosyayı kayıt ediyoruz.
Pdf Dosyalarını Ayırarak Firebase’e Yükleme
Şimdi kodumuzu biraz daha değiştirelim. Kullanıcı çok sayfalı bir pdf yüklesin ve biz bu doküman içerisinde kimlik numarası ayırarak sayfaları ayıralım.
Dosya yüklemek için upload alanı ekleyelim.
<asp:FileUpload ID="pdfUpload" runat="server" />
Yüklenen doküman üzerinde ayırma işlemlerini yapalım.
if (pdfUpload.HasFile)
{
foreach (HttpPostedFile file in pdfUpload.PostedFiles)
{
var contentType = file.ContentType;
var fileStream = file.InputStream;
var PdfURL = PdfYukle((DateTime.Now.Year + "-" + DateTime.Now.Month).ToString(), contentType, fileStream);
using (PdfReader reader = new PdfReader(PdfURL))
{
int pageCount = reader.NumberOfPages;
for (int page = 1; page <= pageCount; page++)
{
Document document = new Document();
_ = reader.GetPageN(page);
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string metin = PdfTextExtractor.GetTextFromPage(reader, page, strategy);
string desen = @"\b\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\s?\d\b";
MatchCollection eslesmeler = Regex.Matches(metin, desen);
foreach (Match eslesme in eslesmeler)
{
string tcKimlikNo = eslesme.Value.Replace(" ", "");
string ilk10Hane = tcKimlikNo.Substring(0, 10);
int toplam = 0;
foreach (char karakter in ilk10Hane)
{
if (Char.IsDigit(karakter))
{
toplam += Convert.ToInt32(karakter.ToString());
}
}
char toplamSonKarekter = toplam.ToString()[toplam.ToString().Length - 1];
char tcSonKarekter = tcKimlikNo[tcKimlikNo.ToString().Length - 1];
if (toplamSonKarekter == tcSonKarekter)
{
string yeniDosyaAdi = tcKimlikNo + ".pdf";
using (MemoryStream memoryStream = new MemoryStream())
{
PdfCopy pdfCopy = new PdfCopy(document, memoryStream);
document.Open();
pdfCopy.AddPage(pdfCopy.GetImportedPage(reader, page));
document.Close();
pdfCopy.Close();
byte[] fileBytes = memoryStream.ToArray();
var storageClient = StorageClient.Create();
var bucketName = "firebaseyolu.appspot.com";
var objectName = "class/" + yeniDosyaAdi;
storageClient.UploadObject(bucketName, objectName, "application/pdf", new MemoryStream(fileBytes));
}
}
}
}
}
}
}
}
İlk aşamada kullanıcının yüklemek istediği pdf dokümanını aldık ve PdfYukle fonksiyonu ile firebase’e kayıt ettik. Daha sonraki işlemler ilk örneğe çok yakın. Yine regex ile 11 haneli sayıları aldık ve bunun bir kimlik numarası olduğundan emin olduk. Daha sonrada bu dokümanı firebase storage alanına kayıt ettik.
PdfYukle fonksiyonu;
private string PdfYukle(string fileName, string contentType, Stream fileStream)
{
string newFileName = fileName + ".pdf";
var storage = StorageClient.Create();
var bucketName = "firebaseyolu.appspot.com";
var objectName = "class/" + newFileName;
new Google.Apis.Storage.v1.Data.Object()
{
Bucket = bucketName,
Name = objectName,
ContentType = contentType,
Metadata = new Dictionary<string, string>()
{
{ "firebaseStorageDownloadTokens", Guid.NewGuid().ToString() }
}
};
var newObject = new Google.Apis.Storage.v1.Data.Object()
{
Bucket = bucketName,
Name = objectName,
ContentType = contentType,
Metadata = new Dictionary<string, string>()
{
{ "firebaseStorageDownloadTokens", Guid.NewGuid().ToString() }
}
};
storage.UploadObject(bucketName, objectName, contentType, fileStream);
string url = $"https://firebasestorage.googleapis.com/v0/b/{bucketName}/o/{Uri.EscapeDataString(objectName)}?alt=media&token={newObject.Metadata["firebaseStorageDownloadTokens"]}";
return url;
}
Bir pdf dosyasını sayfalara ayırma işlemi bu kadar. Bir sonraki içerikte görüşmek üzere.
bordro pdf lerini ayırmak için kullandım çok teşekkür ederim
Faydalı bilgilerinizi bizlerle paylaştığınız için teşekkür ederim.