selamun aleykum,
pdf dosyasından veritabanına veri kayıt etmem gerekiyor. bunun için önerebileceğiniz bir component var mı? veya böyle bir işlem için delphi xe5 in standart bileşenleri ile yapılabilecek bir şey var mı?
yardımcı olursanız çok sevinirim.
(04-09-2024, Saat: 15:44)anemos Adlı Kullanıcıdan Alıntı: Pdf dosya içeriği text mi? Yoksa resim mi? İsabetli bir öneri buna göre gelecektir.
PDF içeriği tamamen text hocam ,
ben bu işlemi pyhton ile yapıyorum. ama projem genel olarak delphide. delphide bu işlemi yapıp tamamen delphi kullanmak istiyorum. pyhton daki kodları paylaşıyorum çözüm önerisi yapan olursa sevinirim.
import os
import sys
import configparser
import PyPDF2
import pyodbc
import re # Düzenli ifadeler modülü
from tkinter import Tk, Button, Label, filedialog, messagebox, Frame, StringVar, Entry, DISABLED, NORMAL
class App:
def __init__(self, root):
self.root = root
self.root.title("Midyat Sosyal Yardımlaşma ve Dayanışma Vakfı - Hane Özeti Veri Alma Projesi")
self.root.geometry("900x550")
self.root.configure(bg='#E1E8ED')
# Config ve ini dosyaları
self.config_path_var = StringVar()
self.db_ini_path_var = StringVar()
# Config dosyasını kontrol et
self.config_file_path = self.get_absolute_path('config.ini')
self.db_ini_file_path = self.get_absolute_path('db.ini')
self.config_entry = None
self.db_entry = None
self.check_config_files()
# Ana başlık
Label(root, text="MİDYAT", font=("Helvetica", 24, "bold"), bg='#E1E8ED').pack(pady=10)
Label(root, text="Sosyal Yardımlaşma ve Dayanışma Vakfı", font=("Helvetica", 18), bg='#E1E8ED').pack()
Label(root, text="Hane Özeti Veri Alma Projesi", font=("Helvetica", 18), bg='#E1E8ED').pack()
# Config ve ini dosyaları bölümü
frame1 = Frame(root, bg='#E1E8ED', relief="solid", bd=2)
frame1.pack(pady=10, padx=10, fill='x')
Label(frame1, text="Config ve İni Dosyalar", font=("Helvetica", 14), bg='#E1E8ED').pack(pady=10)
self.config_entry = self.create_file_selection_section(frame1, "Config.ini Dosyasını Seçiniz:", self.config_path_var, self.select_config_file)
self.db_entry = self.create_file_selection_section(frame1, "DB.ini Dosyasını Seçiniz:", self.db_ini_path_var, self.select_db_file)
if not config_path or not db_ini_path or not pdf_path:
messagebox.showerror("Hata", "Lütfen tüm dosya yollarını seçin.")
return
if not os.path.exists(config_path) or not os.path.exists(db_ini_path) or not os.path.exists(pdf_path):
messagebox.showerror("Hata", "Dosya yolları geçerli değil.")
return
# Config dosyasını kaydet
config = configparser.ConfigParser()
config['Paths'] = {'config_ini': config_path, 'db_ini': db_ini_path}
with open(self.config_file_path, 'w') as configfile:
config.write(configfile)
# PDF dosyasını işle
self.process_pdf(pdf_path, db_ini_path)
# PDF dosyasını işleyen fonksiyon
def process_pdf(self, pdf_path, db_ini_path):
data = self.extract_data_from_pdf(pdf_path) # PDF verilerini çıkar
if data:
self.insert_data_to_mdb(db_ini_path, data) # Veritabanına ekle
messagebox.showinfo("Bilgi", "PDF verileri başarıyla aktarıldı.")
# PDF'den veri çıkaran fonksiyon
def extract_data_from_pdf(self, pdf_path):
try:
with open(pdf_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
num_pages = len(reader.pages)
text = ""
for page_num in range(num_pages):
page = reader.pages[page_num]
text += page.extract_text()
# Verileri ayrıştırma
data = {}
data['TCKN'] = self.extract_value(text, 'Başvuran T.C. Kimlik No :', 'Hane Ref. No :')
data['AD'] = self.extract_value(text, 'Başvuran Adı Soyadı :', 'Telefon :')
data['HANENO'] = self.extract_value(text, 'Hane No :', 'Başvuru Tarihi :')
data['REFNO'] = self.extract_value(text, 'Hane Ref. No :', 'Durumu :')
data['MAHALLE'] = self.extract_mahalle(text) # MAH. ile biten kısmı alıyoruz
data['MERKEZIYARDIM'] = self.extract_value(text, 'AKTİF MERKEZİ YARDIMLAR', 'DURUM').replace('\n', ' - ')
data['SONALDIGIYARDIMTURU'] = self.extract_sonalidigiyardim(text)
data['HANEZIYARETI'] = self.extract_haneziyareti(text)
data['SON_HANE_ZIYARETI_TARIHI'] = self.extract_son_hane_ziyareti_tarihi(text)
data['HANEKISISAYISI'] = self.extract_hanekisisayisi(text) # Kişi sayısını ekliyoruz
return data
except Exception as e:
messagebox.showerror("Hata", f"PDF verilerini okurken bir hata oluştu: {e}")
return None
# PDF'den belirli bir değeri çıkarmak için kullanılan yardımcı fonksiyon
def extract_value(self, text, start_marker, end_marker):
start = text.find(start_marker) + len(start_marker)
end = text.find(end_marker, start)
return text[start:end].strip()
# Son hane ziyareti tarihini çıkaran fonksiyon
def extract_son_hane_ziyareti_tarihi(self, text):
match = re.search(r'Hane Ziyareti Çalışan Görüşü:.*\((.*?)\)', text)
if match:
return match.group(1)
return None
- Ayda 500 tane pdf taraması ile sınırlı olarak Adobe'nin kendi api'si ücretsiz ve herhangi bir ödeme aracı istemeden yapıyormuş. İnceledim json olarak tasnif edip veriyormuş.
Sayı yeterliyse denemek istenebilir. Üzeri için ücretliymiş.
- Bir de binary dosya içinden bakılabilir ama güvence verilemez, format değişirse devre dışı kalır.
Hazır ücretsiz başka bir çözüm yukarıda verdiğim delphican linki ve bu mesajda yazdığım dışında benim aklıma gelmiyor.
(06-09-2024, Saat: 10:30)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba.
- Ayda 500 tane pdf taraması ile sınırlı olarak Adobe'nin kendi api'si ücretsiz ve herhangi bir ödeme aracı istemeden yapıyormuş. İnceledim json olarak tasnif edip veriyormuş.
Sayı yeterliyse denemek istenebilir. Üzeri için ücretliymiş.
- Bir de binary dosya içinden bakılabilir ama güvence verilemez, format değişirse devre dışı kalır.
Hazır ücretsiz başka bir çözüm yukarıda verdiğim delphican linki ve bu mesajda yazdığım dışında benim aklıma gelmiyor.
Merakla çözümünüzü takip ediyor olucam.
Hocam Aylık olarak 500 Adet yeterli gelir şimdilik formatta bir değişiklik olmayacak diye düşünüyorum. çünkü yaklaşık 15 senedir aynı format değişmedi. adobe apisini deneyelim bakalım ne olacak . Allah razı olsun desteğiniz için
Python kullandığınızı okuyunca aklıma alternatif bir öneri geldi.
X2 den sonraki sürümlerde ücretsiz Python4Delphi component seti var.
Delphideki uygulamanız içerisinden python da kod çalıştırabilir sonuçları geri uygulama içerisine alabilirsiniz.
(06-09-2024, Saat: 17:20)anemos Adlı Kullanıcıdan Alıntı: C# tarafında ücretsiz pek çok proje var. Hem sizin, hem de forum için bir ActiveX dll yazacağım. Takipte kalın...
İlgili DLL ektedir. Sistem kaydını DLL yanındaki .vbs dosyası yapmalısınız. (HKCU düğümüne yazacağı için yönetsel haklar gerektirmez)
Excel / VBA ile test kodları:
Sub Test1()
'Erken bağlama referans ile,
Dim doc As New DelphiCan.PdfDocument, i As Integer
doc.Open "SomeFile.pdf"
For i = 0 To doc.PageCount - 1
Debug.Print doc(i) ' veya Debug.Print doc.GetText(i)
Next
doc.Close
End Sub
Sub Test2()
'Geç bağlama ile,
Dim doc As Object, i As Integer
Set doc = CreateObject("DelphiCan.PdfDocument")
doc.Open "SomeFile.pdf"
For i = 0 To doc.PageCount - 1
Debug.Print doc(i) ' veya Debug.Print doc.GetText(i)
Next
doc.Close
End Sub