Ekstraksi Data Python dari PDF Terenkripsi


12

Saya seorang lulusan baru dalam matematika murni yang hanya mengambil beberapa kursus pemrograman dasar. Saya sedang magang dan saya memiliki proyek analisis data internal. Saya harus menganalisis PDF internal beberapa tahun terakhir. PDF-nya "diamankan." Dengan kata lain, mereka dienkripsi. Kami tidak memiliki kata sandi PDF, bahkan lebih lagi, kami tidak yakin apakah kata sandi itu ada. Tetapi, kami memiliki semua dokumen ini dan kami dapat membacanya secara manual. Kami juga bisa mencetaknya. Tujuannya adalah untuk membacanya dengan Python karena merupakan bahasa yang kami punya beberapa ide.

Pertama, saya mencoba membaca PDF dengan beberapa pustaka Python. Namun, pustaka Python yang saya temukan tidak membaca PDF terenkripsi. Pada saat itu, saya tidak dapat mengekspor informasi menggunakan Adobe Reader.

Kedua, saya memutuskan untuk mendekripsi PDF. Saya berhasil menggunakan pustaka Python pykepdf. Pykepdf bekerja dengan sangat baik! Namun, dekripsi PDF tidak dapat dibaca juga dengan pustaka Python dari poin sebelumnya ( PyPDF2 dan Tabula ). Saat ini, kami telah membuat beberapa peningkatan karena menggunakan Adobe Reader saya dapat mengekspor informasi dari PDF yang didekripsi, tetapi tujuannya adalah untuk melakukan segalanya dengan Python.

Kode yang saya perlihatkan berfungsi sempurna dengan PDF yang tidak terenkripsi, tetapi tidak dengan PDF terenkripsi. Itu tidak bekerja dengan PDF yang didekripsi yang didapat dengan pykepdf juga.

Saya tidak menulis kode. Saya menemukannya di dokumentasi Python libraries Pykepdf dan Tabula . Solusi PyPDF2 ditulis oleh Al Sweigart dalam bukunya, " Automate the Boring Stuff with Python ," yang sangat saya rekomendasikan. Saya juga memeriksa bahwa kodenya berfungsi dengan baik, dengan batasan yang saya jelaskan sebelumnya.

Pertanyaan pertama, mengapa saya tidak bisa membaca file yang didekripsi, jika program bekerja dengan file yang tidak pernah dienkripsi?

Pertanyaan kedua, bisakah kita membaca file yang didekripsi dengan Python? Perpustakaan mana yang bisa melakukannya atau tidak mungkin? Apakah semua dekripsi PDF dapat diekstraksi?

Terima kasih atas waktu dan bantuannya !!!

Saya menemukan hasil ini menggunakan Python 3.7, Windows 10, Jupiter Notebooks, dan Anaconda 2019.07.

Python

import pikepdf
with pikepdf.open("encrypted.pdf") as pdf:
  num_pages = len(pdf.pages)
  del pdf.pages[-1]
  pdf.save("decrypted.pdf")

import tabula
tabula.read_pdf("decrypted.pdf", stream=True)

import PyPDF2
pdfFileObj=open("decrypted.pdf", "rb")
pdfReader=PyPDF2.PdfFileReader(pdfFileObj)
pdfReader.numPages
pageObj=pdfReader.getPage(0)
pageObj.extractText()

Dengan Tabula, saya mendapatkan pesan "file output kosong."

Dengan PyPDF2, saya hanya mendapatkan '/ n'

UPDATE 10/3/2019 Pdfminer.six (Versi November 2018)

Saya mendapat hasil yang lebih baik menggunakan solusi yang diposting oleh DuckPuncher . Untuk file yang didekripsi, saya mendapatkan labelnya, tetapi bukan datanya. Hal yang sama terjadi dengan file yang dienkripsi. Untuk file yang belum pernah dienkripsi berfungsi dengan sempurna. Karena saya memerlukan data dan label file yang dienkripsi atau didekripsi, kode ini tidak berfungsi untuk saya. Untuk analisis itu, saya menggunakan pdfminer.six yaitu pustaka Python yang dirilis pada November 2018. Pdfminer.six menyertakan pycryptodome perpustakaan. Menurut dokumentasi mereka " PyCryptodome adalah paket Python mandiri dari primitif kriptografi tingkat rendah .."

Kode ada di tumpukan pertanyaan pertukaran: Mengekstrak teks dari file PDF menggunakan PDFMiner di python?

Saya akan senang jika Anda ingin mengulang percobaan saya. Berikut uraiannya:

1) Jalankan kode yang disebutkan dalam pertanyaan ini dengan PDF apa pun yang belum pernah dienkripsi.

2) Lakukan hal yang sama dengan PDF "Secure" (ini adalah istilah yang digunakan Adobe), saya menyebutnya PDF terenkripsi. Gunakan formulir umum yang dapat Anda temukan menggunakan Google. Setelah mengunduhnya, Anda harus mengisi kolom. Kalau tidak, Anda akan memeriksa label, tetapi bukan bidang. Data ada di kolom.

3) Dekripsi PDF terenkripsi menggunakan Pykepdf. Ini akan menjadi dekripsi PDF.

4) Jalankan kode lagi menggunakan PDF yang didekripsi.

UPDATE 10/4/2019 Camelot (Versi Juli 2019)

Saya menemukan perpustakaan Python Camelot. Hati-hati karena Anda membutuhkan camelot-py 0.7.3.

Ini sangat kuat, dan bekerja dengan Python 3.7. Juga, sangat mudah digunakan. Pertama, Anda juga harus menginstal Ghostscript . Kalau tidak, itu tidak akan berhasil. Anda juga perlu menginstal Panda . Jangan gunakan pip install camelot-py . Sebagai gantinya gunakan pip install camelot-py [cv]

Penulis program ini adalah Vinayak Mehta. Frank Du membagikan kode ini dalam video YouTube "Ekstrak data tabular dari PDF dengan Camelot Menggunakan Python."

Saya memeriksa kode dan berfungsi dengan file yang tidak terenkripsi. Namun, itu tidak berfungsi dengan file yang dienkripsi dan didekripsi, dan itulah tujuan saya .

Camelot berorientasi untuk mendapatkan tabel dari PDF.

Ini kodenya:

Python

import camelot
import pandas
name_table = camelot.read_pdf("uncrypted.pdf")
type(name_table)

#This is a Pandas dataframe
name_table[0]

first_table = name_table[0]   

#Translate camelot table object to a pandas dataframe
first_table.df

first_table.to_excel("unencrypted.xlsx")
#This creates an excel file.
#Same can be done with csv, json, html, or sqlite.

#To get all the tables of the pdf you need to use this code.
for table in name_table:
   print(table.df)

PEMBARUAN 10/7/2019 Saya menemukan satu trik. Jika saya membuka pdf yang diamankan dengan Adobe Reader, dan saya mencetaknya menggunakan Microsoft ke PDF, dan saya menyimpannya sebagai PDF, saya bisa mengekstrak data menggunakan salinan itu. Saya juga dapat mengonversi file PDF ke JSON, Excel, SQLite, CSV, HTML, dan format lain. Ini adalah solusi yang mungkin untuk pertanyaan saya. Namun, saya masih mencari opsi untuk melakukannya tanpa trik itu karena tujuannya adalah untuk melakukannya 100% dengan Python. Saya juga khawatir bahwa jika metode enkripsi yang lebih baik digunakan triknya mungkin tidak akan berfungsi. Terkadang Anda perlu menggunakan Adobe Reader beberapa kali untuk mendapatkan salinan yang bisa diekstraksi.

PEMBARUAN 10/8/2019. Pertanyaan ketiga. Sekarang saya punya pertanyaan ketiga. Apakah semua pdf yang diamankan / terenkripsi dilindungi kata sandi? Mengapa pikepdf tidak berfungsi? Dugaan saya adalah bahwa versi saat ini dari pikepdf dapat memecah beberapa jenis enkripsi tetapi tidak semuanya. @constt menyebutkan bahwa PyPDF2 dapat merusak beberapa jenis perlindungan. Namun, saya menjawab kepadanya bahwa saya menemukan sebuah artikel yang PyPDF2 dapat memecah enkripsi yang dibuat dengan Adobe Acrobat Pro 6.0, tetapi tidak dengan versi posterior.


2
Saya tidak dapat mereproduksi masalah ini dengan PyPDF2, semuanya berfungsi dengan baik. Saya menggunakan pdftkserta layanan online untuk mengenkripsi file. Bisakah Anda memposting tautan ke file pdf "bermasalah"?
constt

1
Ok terima kasih! Sudahkah Anda mencoba menggunakan qpdfuntuk mendekripsi file Anda? Dalam hal ini akan melakukan trik, Anda dapat memanggilnya dari skrip Anda menggunakan subprocessmodul untuk mendekripsi file sebelum menguraikannya.
constt

1
Pertama, PyPDF2 tidak dapat mendekripsi file Acrobat PDF => 6.0. Kedua, pikepdf saat ini tidak memiliki implementasi ekstraksi teks.
Hidup itu kompleks

1
@ Pemula Saya akan berspekulasi bahwa ini ada hubungannya dengan pemformatan mendasar yang digunakan oleh pykepdf untuk menulis PDF yang tidak terenkripsi.
Hidup itu rumit

2
"Apakah semua pdf yang diamankan / terenkripsi dilindungi kata sandi?" - tidak. Ada juga pdf yang dienkripsi menggunakan kriptografi kunci privat / publik berdasarkan sertifikat X509.
mkl

Jawaban:


8

DIPERBARUI 10-11-2019 TERAKHIR

Saya tidak yakin apakah saya mengerti pertanyaan Anda sepenuhnya. Kode di bawah ini dapat disempurnakan, tetapi membaca dalam PDF terenkripsi atau tidak terenkripsi dan mengekstrak teks. Tolong beri tahu saya jika saya salah mengerti kebutuhan Anda.

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def extract_encrypted_pdf_text(path, encryption_true, decryption_password):

  output = StringIO()

  resource_manager = PDFResourceManager()
  laparams = LAParams()

  device = TextConverter(resource_manager, output, codec='utf-8', laparams=laparams)

  pdf_infile = open(path, 'rb')
  interpreter = PDFPageInterpreter(resource_manager, device)

  page_numbers = set()

  if encryption_true == False:
    for page in PDFPage.get_pages(pdf_infile, page_numbers, maxpages=0, caching=True, check_extractable=True):
      interpreter.process_page(page)

  elif encryption_true == True:
    for page in PDFPage.get_pages(pdf_infile, page_numbers, maxpages=0, password=decryption_password, caching=True, check_extractable=True):
      interpreter.process_page(page)

 text = output.getvalue()
 pdf_infile.close()
 device.close()
 output.close()
return text

results = extract_encrypted_pdf_text('encrypted.pdf', True, 'password')
print (results)

Saya mencatat bahwa kode pikepdf Anda yang digunakan untuk membuka PDF terenkripsi tidak memiliki kata sandi, yang seharusnya melemparkan pesan kesalahan ini:

pikepdf._qpdf.PasswordError: encrypted.pdf: kata sandi tidak valid

import pikepdf

with pikepdf.open("encrypted.pdf", password='password') as pdf:
num_pages = len(pdf.pages)
del pdf.pages[-1]
pdf.save("decrypted.pdf")

Anda dapat menggunakan tika untuk mengekstrak teks dari decrypted.pdf yang dibuat oleh pikepdf .

from tika import parser

parsedPDF = parser.from_file("decrypted.pdf")
pdf = parsedPDF["content"]
pdf = pdf.replace('\n\n', '\n')

Selain itu, pikepdf saat ini tidak menerapkan ekstraksi teks ini termasuk rilis terbaru v1.6.4.


Saya memutuskan untuk menjalankan beberapa tes menggunakan berbagai file PDF terenkripsi.

Saya menamai semua file terenkripsi 'encrypted.pdf' dan mereka semua menggunakan kata sandi enkripsi dan dekripsi yang sama.

  1. Adobe Acrobat 9.0 dan yang lebih baru - tingkat enkripsi 256-bit AES

    • pikepdf dapat mendekripsi file ini
    • PyPDF2 tidak dapat mengekstraksi teks dengan benar
    • tika dapat mengekstraksi teks dengan benar
  2. Adobe Acrobat 6.0 dan yang lebih baru - tingkat enkripsi 128-bit RC4

    • pikepdf dapat mendekripsi file ini
    • PyPDF2 tidak dapat mengekstraksi teks dengan benar
    • tika dapat mengekstraksi teks dengan benar
  3. Adobe Acrobat 3.0 dan yang lebih baru - level enkripsi RC4 40-bit

    • pikepdf dapat mendekripsi file ini
    • PyPDF2 tidak dapat mengekstraksi teks dengan benar
    • tika dapat mengekstraksi teks dengan benar
  4. Adobe Acrobat 5.0 dan yang lebih baru - tingkat enkripsi 128-bit RC4

    • dibuat dengan Microsoft Word
    • pikepdf dapat mendekripsi file ini
    • PyPDF2 dapat mengekstraksi teks dengan benar
    • tika dapat mengekstraksi teks dengan benar
  5. Adobe Acrobat 9.0 dan yang lebih baru - tingkat enkripsi 256-bit AES

    • dibuat menggunakan pdfprotectfree
    • pikepdf dapat mendekripsi file ini
    • PyPDF2 dapat mengekstraksi teks dengan benar
    • tika dapat mengekstraksi teks dengan benar

PyPDF2 dapat mengekstraksi teks dari file PDF terenkripsi yang tidak dibuat dengan Adobe Acrobat.

Saya akan berasumsi bahwa kegagalan itu ada hubungannya dengan format tertanam dalam PDF yang dibuat oleh Adobe Acrobat. Diperlukan lebih banyak pengujian untuk mengonfirmasi dugaan ini tentang pemformatan.

tika dapat mengekstraksi teks dari semua dokumen yang didekripsi dengan pikepdf.


 import pikepdf
 with pikepdf.open("encrypted.pdf", password='password') as pdf:
    num_pages = len(pdf.pages)
    del pdf.pages[-1]
    pdf.save("decrypted.pdf")


 from PyPDF2 import PdfFileReader

 def text_extractor(path):
   with open(path, 'rb') as f:
     pdf = PdfFileReader(f)
     page = pdf.getPage(1)
     print('Page type: {}'.format(str(type(page))))
     text = page.extractText()
     print(text)

    text_extractor('decrypted.pdf')

PyPDF2 tidak dapat mendekripsi file Acrobat PDF => 6.0

Masalah ini telah terbuka dengan pemilik modul, sejak 15 September 2015 . Tidak jelas dalam komentar terkait dengan masalah ini saat masalah ini akan diperbaiki oleh pemilik proyek. Komit terakhir adalah 25 Juni 2018.

Masalah dekripsi PyPDF4

PyPDF4 adalah pengganti PyPDF2. Modul ini juga memiliki masalah dekripsi dengan algoritma tertentu yang digunakan untuk mengenkripsi file PDF.

file uji: Adobe Acrobat 9.0 dan yang lebih baru - tingkat enkripsi AES 256-bit

Pesan kesalahan PyPDF2: hanya kode algoritma 1 dan 2 yang didukung

Pesan kesalahan PyPDF4: hanya kode algoritma 1 dan 2 yang didukung. PDF ini menggunakan kode 5


BAGIAN PEMBARUAN 10-11-2019

Bagian ini sebagai tanggapan atas pembaruan Anda pada 10-07-2019 dan 10-08-2019.

Dalam pembaruan Anda, Anda menyatakan bahwa Anda dapat membuka 'pdf aman dengan Adobe Reader' dan mencetak dokumen ke PDF lain, yang menghilangkan bendera 'SECURED'. Setelah melakukan beberapa pengujian, saya yakin telah mengetahui apa yang terjadi dalam skenario ini.

Tingkat keamanan Adobe PDF

Adobe PDF memiliki beberapa jenis kontrol keamanan yang dapat diaktifkan oleh pemilik dokumen. Kontrol dapat diberlakukan dengan kata sandi atau sertifikat.

  1. Enkripsi dokumen (diberlakukan dengan kata sandi dokumen terbuka)

    • Enkripsi semua konten dokumen (paling umum)
    • Enkripsi semua konten dokumen kecuali metadata => Acrobat 6.0
    • Enkripsi hanya lampiran file => Acrobat 7.0
  2. Pengeditan dan pencetakan terbatas (diberlakukan dengan kata sandi izin)

    • Pencetakan Diizinkan
    • Perubahan Diizinkan

Gambar di bawah ini menunjukkan Adobe PDF dienkripsi dengan enkripsi AES 256-Bit. Untuk membuka atau mencetak PDF ini diperlukan kata sandi. Ketika Anda membuka dokumen ini dalam Adobe Reader dengan kata sandi, judulnya akan menyatakan SECURED

password_level_encryption

Dokumen ini memerlukan kata sandi untuk dibuka dengan modul Python yang disebutkan dalam jawaban ini. Jika Anda mencoba membuka PDF terenkripsi dengan Adobe Reader. Anda harus melihat ini:

password_prompt

Jika Anda tidak mendapatkan peringatan ini maka dokumen tersebut tidak memiliki kontrol keamanan yang diaktifkan atau hanya yang mengedit dan mencetak yang diaktifkan diaktifkan.

Gambar di bawah ini menunjukkan pengeditan terbatas diaktifkan dengan kata sandi dalam dokumen PDF. Pencetakan catatan diaktifkan . Untuk membuka atau mencetak PDF ini, kata sandi tidak diperlukan . Saat Anda membuka dokumen ini di Adobe Reader tanpa kata sandi, judulnya akan menyatakan SECURED Ini peringatan yang sama dengan PDF terenkripsi yang dibuka dengan kata sandi.

Ketika Anda mencetak dokumen ini ke PDF baru, peringatan SECURED dihapus, karena pengeditan terbatas telah dihapus.

password_level_restrictive_editing

Semua produk Adobe memberlakukan batasan yang ditetapkan oleh kata sandi izin. Namun, jika produk pihak ketiga tidak mendukung pengaturan ini, penerima dokumen dapat melewati beberapa atau semua batasan yang ditetapkan.

Jadi saya berasumsi bahwa dokumen yang Anda cetak ke PDF memiliki pengeditan terbatas diaktifkan dan tidak memiliki kata sandi yang diperlukan untuk membuka diaktifkan.

Tentang pemecahan enkripsi PDF

Baik PyPDF2 atau PyPDF4 dirancang untuk memecah fungsi kata sandi dokumen terbuka dari dokumen PDF. Kedua modul akan melempar kesalahan berikut jika mereka mencoba untuk membuka file PDF yang dilindungi kata sandi terenkripsi.

PyPDF2.utils.PdfReadError: file belum didekripsi

Fungsi pembukaan kata sandi dari file PDF terenkripsi dapat dilewati menggunakan berbagai metode, tetapi teknik tunggal mungkin tidak berfungsi dan beberapa tidak akan diterima karena beberapa faktor, termasuk kompleksitas kata sandi.

Enkripsi PDF secara internal bekerja dengan kunci enkripsi 40, 128, atau 256 bit tergantung pada versi PDF. Kunci enkripsi biner berasal dari kata sandi yang disediakan oleh pengguna. Kata sandi tergantung pada panjang dan batasan penyandian.

Misalnya, PDF 1.7 Adobe Extension Level 3 (Acrobat 9 - AES-256) memperkenalkan karakter Unicode (65.536 karakter yang mungkin) dan menabrak panjang maksimum hingga 127 byte dalam representasi kata sandi UTF-8.


Kode di bawah ini akan membuka PDF dengan pengeditan terbatas diaktifkan. Ini akan menyimpan file ini ke PDF baru tanpa peringatan SECURED ditambahkan. The tika kode akan mengurai isi dari file baru.

from tika import parser
import pikepdf

# opens a PDF with restrictive editing enabled, but that still 
# allows printing.
with pikepdf.open("restrictive_editing_enabled.pdf") as pdf:
  pdf.save("restrictive_editing_removed.pdf")

  # plain text output
  parsedPDF = parser.from_file("restrictive_editing_removed.pdf")

  # XHTML output
  # parsedPDF = parser.from_file("restrictive_editing_removed.pdf", xmlContent=True)

  pdf = parsedPDF["content"]
  pdf = pdf.replace('\n\n', '\n')
  print (pdf)

Kode ini memeriksa apakah diperlukan kata sandi untuk membuka file. Kode ini disempurnakan dan fungsi lainnya dapat ditambahkan. Ada beberapa fitur lain yang dapat ditambahkan, tetapi dokumentasi untuk pikepdf tidak cocok dengan komentar dalam basis kode, sehingga diperlukan lebih banyak penelitian untuk meningkatkan ini.

# this would be removed once logging is used
############################################
import sys
sys.tracebacklimit = 0
############################################

import pikepdf
from tika import parser

def create_pdf_copy(pdf_file_name):
  with pikepdf.open(pdf_file_name) as pdf:
    new_filename = f'copy_{pdf_file_name}'
    pdf.save(new_filename)
    return  new_filename

def extract_pdf_content(pdf_file_name):
  # plain text output
  # parsedPDF = parser.from_file("restrictive_editing_removed.pdf")

  # XHTML output
  parsedPDF = parser.from_file(pdf_file_name, xmlContent=True)

  pdf = parsedPDF["content"]
  pdf = pdf.replace('\n\n', '\n')
  return pdf

def password_required(pdf_file_name):
  try:
    pikepdf.open(pdf_file_name)

  except pikepdf.PasswordError as error:
    return ('password required')

  except pikepdf.PdfError as results:
    return ('cannot open file')


filename = 'decrypted.pdf'
password = password_required(filename)
if password != None:
  print (password)
elif password == None:
  pdf_file = create_pdf_copy(filename)
  results = extract_pdf_content(pdf_file)
  print (results)

2
Bagaimana Anda membuka file PDF aman tanpa memberikan kata sandi?
Hidup itu rumit

1
Apakah Anda mengacu hanya pada perlindungan pengeditan terbatas?
Hidup itu kompleks

1
Jawaban diperbarui dengan kode yang berfungsi dengan PDF yang mengaktifkan perlindungan pengeditan terbatas, tetapi diizinkan mencetak.
Hidup itu kompleks

1
Bisakah Anda menggunakan XHTML?
Hidup itu kompleks

1
Saya memodifikasi jawaban untuk menghasilkan XHTML. JSON mungkin, tetapi itu membutuhkan penggalian ke dalam kode proyek github terkait parser tika.
Hidup itu kompleks

1

Anda dapat mencoba menangani kesalahan yang dihasilkan file-file ini ketika Anda membuka file-file ini tanpa kata sandi.

import pikepdf

def open_pdf(pdf_file_path, pdf_password=''):
    try:
        pdf_obj = pikepdf.Pdf.open(pdf_file_path)

    except pikepdf._qpdf.PasswordError:
        pdf_obj = pikepdf.Pdf.open(pdf_file_path, password=pdf_password)

    finally:
        return pdf_obj

Anda dapat menggunakan pdf_obj yang dikembalikan untuk pekerjaan parsing Anda. Anda juga dapat memberikan kata sandi jika Anda memiliki PDF terenkripsi.


1
Terima kasih atas jawaban Anda! Kami mencoba membacanya tanpa kata sandi. Pada saat ini, kami dapat melakukannya dengan metode yang dijelaskan dalam UPDATE 10/7/2019
Pemula

Ini jauh dari menjawab pertanyaan. Sepertinya Anda belum membaca pertanyaan lengkap.
shoonya ek

1
Ini menangani PDF yang diamankan itu di mana pikepdf biasanya gagal ketika nilai default kata sandi adalah Tidak Ada. Dengan melewatkan string kosong, ia dapat membuka dan mengurai dokumen PDF yang diamankan dengan benar (dalam kasus uji yang saya jalankan).
Mahendra Singh

1
@ Pemula kamu tidak perlu mengonversi PDF di sini dalam hal ini. Ini hanya dari pengalaman saya sebelumnya bahwa PDF aman bekerja dengan memberikan kata sandi kosong.
Mahendra Singh

1
@ Pemula ini adalah seluruh kode saya. Ini hanya mengembalikan pdf_object dari pikepdf. Jika Anda ingin menyimpan pdf ini, cukup simpan objek yang dikembalikan dengan menggunakan pdf_obj.save ('your_file_path'). Setelah ini, Anda dapat menggunakan PDF ini untuk mem-parsing teks dan objek lainnya. Saya menggunakan perpustakaan yang disebut PdfPlumber untuk ekstraksi teks.
Mahendra Singh

1

Untuk tabula-py, Anda dapat mencoba opsi kata sandi dengan read_pdf. Itu tergantung pada fungsi tabula-java jadi saya tidak yakin enkripsi mana yang didukung.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.