암호화 된 PDF에서 Python 데이터 추출


12

저는 기본 프로그래밍 과정을 거의 밟지 않은 순수한 수학을 최근에 졸업했습니다. 인턴십을하고 있으며 내부 데이터 분석 프로젝트가 있습니다. 지난 몇 년 동안 내부 PDF를 분석해야합니다. PDF는 "보안"됩니다. 즉, 암호화됩니다. 우리는 PDF 암호를 가지고 있지 않으며, 더 많은 암호가 있는지 확실하지 않습니다. 그러나 우리는 이러한 모든 문서를 가지고 있으며 수동으로 읽을 수 있습니다. 인쇄 할 수도 있습니다. 우리가 생각하는 언어이기 때문에 파이썬으로 읽는 것이 목표입니다.

먼저, 일부 파이썬 라이브러리로 PDF를 읽으려고했습니다. 그러나 내가 찾은 Python 라이브러리는 암호화 된 PDF를 읽지 않습니다. 당시에는 Adobe Reader를 사용하여 정보를 내보낼 수 없었습니다.

둘째, PDF를 해독하기로 결정했습니다. 파이썬 라이브러리 pykepdf를 성공적으로 사용했습니다. Pykepdf 는 매우 잘 작동합니다! 그러나 이전 시점의 Python 라이브러리 ( PyPDF2Tabula )를 사용 하여 해독 된 PDF를 읽을 수 없습니다 . 현재 Adobe Reader를 사용하면 해독 된 PDF에서 정보를 내보낼 수 있지만 파이썬으로 모든 것을 수행하는 것이 목표이기 때문에 약간의 개선이 이루어졌습니다.

내가 보여주는 코드는 암호화되지 않은 PDF에서는 완벽하게 작동하지만 암호화 된 PDF에서는 완벽하게 작동하지 않습니다. pykepdf로 얻은 해독 된 PDF에서는 작동하지 않습니다.

코드를 작성하지 않았습니다. 파이썬 라이브러리 PykepdfTabula 의 문서에서 찾았습니다 . PyPDF2 솔루션은 Al Sweigart 가 자신의 저서 " Python으로 지루한 물건 자동화 "에서 작성했습니다 . 또한 앞에서 설명한 제한 사항으로 코드가 제대로 작동하는지 확인했습니다.

첫 번째 질문, 프로그램이 암호화되지 않은 파일로 프로그램이 작동하는 경우 해독 된 파일을 읽을 수없는 이유는 무엇입니까?

두 번째 질문입니다. 어떻게하면 해독 된 파일을 파이썬으로 읽을 수 있습니까? 어느 도서관이 할 수 있습니까 아니면 불가능합니까? 해독 된 모든 PDF를 추출 할 수 있습니까?

시간과 도움에 감사드립니다 !!!

Python 3.7, Windows 10, Jupiter Notebooks 및 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()

Tabula를 사용하면 "출력 파일이 비어 있습니다"라는 메시지가 나타납니다.

PyPDF2를 사용하면 '/ n'만 받고 있습니다.

업데이트 10/3/2019 Pdfminer.six (버전 11 월 2018)

DuckPuncher가 게시 한 솔루션을 사용하여 더 나은 결과를 얻었 습니다 . 해독 된 파일의 경우 레이블이 있지만 데이터는 없습니다. 암호화 된 파일에서도 마찬가지입니다. 암호화되지 않은 파일은 완벽하게 작동합니다. 암호화되거나 해독 된 파일의 데이터와 레이블이 필요하기 때문에이 코드는 작동하지 않습니다. 이 분석을 위해 2018 년 11 월에 릴리스 된 Python 라이브러리 인 pdfminer.six 를 사용 했습니다 . Pdfminer.six에는 pycryptodome 라이브러리가 포함되어 있습니다. 그들의 문서에 따르면 " PyCryptodome 은 저수준 암호 프리미티브의 자체 포함 된 파이썬 패키지입니다."

코드는 스택 교환 질문에 있습니다 : 파이썬에서 PDFMiner를 사용하여 PDF 파일에서 텍스트 추출?

내 실험을 반복하고 싶으면 좋겠습니다. 설명은 다음과 같습니다.

1)이 질문에서 언급 한 코드를 암호화되지 않은 PDF로 실행하십시오.

2) PDF "보안"(Adobe에서 사용하는 용어)과 동일하게 암호화 된 PDF라고합니다. Google에서 찾을 수있는 일반적인 양식을 사용하십시오. 다운로드 한 후 필드를 채워야합니다. 그렇지 않으면 레이블은 검사하지만 필드는 검사하지 않습니다. 데이터는 필드에 있습니다.

3) Pykepdf를 사용하여 암호화 된 PDF를 해독하십시오. 해독 된 PDF가됩니다.

4) 해독 된 PDF를 사용하여 코드를 다시 실행하십시오.

2019 년 10 월 10 일 카멜롯 업데이트 (2019 년 7 월 버전)

파이썬 라이브러리 카멜롯을 찾았습니다. camelot-py 0.7.3 이 필요합니다 .

매우 강력하며 Python 3.7에서 작동합니다. 또한 사용하기가 매우 쉽습니다. 먼저 Ghostscript 도 설치해야합니다 . 그렇지 않으면 작동하지 않습니다. Pandas 도 설치해야합니다 . pip install camelot-py를 사용하지 마십시오 . 대신 pip install camelot-py [cv]를 사용하십시오.

프로그램의 저자는 Vinayak Mehta입니다. Frank Du는 YouTube 비디오 "Python을 사용하여 Camelot으로 PDF에서 테이블 데이터 추출"에서이 코드를 공유합니다.

코드를 확인했으며 암호화되지 않은 파일로 작업하고 있습니다. 그러나 암호화 및 해독 된 파일에는 작동하지 않으므로 이것이 나의 목표 입니다.

Camelot은 PDF에서 테이블을 가져 오기위한 것입니다.

코드는 다음과 같습니다.

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)

업데이트 10/7/2019 하나의 트릭을 찾았습니다. Adobe Reader로 보안 PDF를 열고 Microsoft에서 PDF로 인쇄 한 다음 PDF로 저장하면 해당 사본을 사용하여 데이터를 추출 할 수 있습니다. 또한 PDF 파일을 JSON, Excel, SQLite, CSV, HTML 및 다른 형식으로 변환 할 수도 있습니다. 이것은 내 질문에 대한 가능한 해결책입니다. 그러나 목표는 Python으로 100 %를 수행하는 것이기 때문에 여전히 그 트릭없이 수행 할 수있는 옵션을 찾고 있습니다. 또한 더 나은 암호화 방법을 사용하면 트릭이 작동하지 않을 수도 있습니다. 추출 가능한 사본을 얻으려면 Adobe Reader를 여러 번 사용해야하는 경우가 있습니다.

2019 년 8 월 8 일 업데이트. 세번째 질문입니다. 이제 세 번째 질문이 있습니다. 모든 보안 / 암호화 된 PDF가 비밀번호로 보호됩니까? 왜 pikepdf가 작동하지 않습니까? 내 생각에 현재 버전의 pikepdf는 일부 암호화 유형을 손상시킬 수 있지만 모든 암호화 유형을 파괴하지는 않습니다. @constt는 PyPDF2가 일부 유형의 보호를 중단 할 수 있다고 언급했습니다. 그러나 PyPDF2가 Adobe Acrobat Pro 6.0으로 작성된 암호화를 손상시킬 수 있지만 그 이후 버전에서는 암호화되지 않을 수 있다는 기사를 발견했다고 그에게 대답했습니다.


2
이 문제를 재현 할 수 없었습니다 PyPDF2. 모든 것이 제대로 작동합니다. 내가 사용하는 pdftk암호화 파일에 대한 온라인 서비스뿐만 아니라. "고생스러운"pdf 파일에 대한 링크를 게시 할 수 있습니까?
constt

1
알았어 고마워! qpdf파일을 해독하는 데 사용하려고 했습니까 ? 트릭을 수행하는 경우 subprocess파싱하기 전에 모듈을 사용하여 스크립트에서 파일을 해독 하여 파일을 해독 할 수 있습니다.
constt

1
첫째, PyPDF2는 Acrobat PDF 파일 => 6.0을 해독 할 수 없습니다. 둘째, pikepdf에는 현재 텍스트 추출 도구가 없습니다.
인생은 복잡합니다

1
@Beginner 필자는 이것이 pykepdf에서 암호화되지 않은 PDF를 작성하는 데 사용되는 기본 형식과 관련이 있다고 생각합니다.
인생은 복잡합니다.

2
"모든 보안 / 암호화 된 PDF는 암호로 보호됩니까?" - 아니. X509 인증서에 기반한 개인 / 공개 키 암호화를 사용하여 암호화 된 PDF도 있습니다.
mkl

답변:


8

최신 업데이트 10-11-2019

귀하의 질문을 완전히 이해했는지 잘 모르겠습니다. 아래 코드는 세분화 할 수 있지만 암호화되거나 암호화되지 않은 PDF를 읽고 텍스트를 추출합니다. 요구 사항을 이해하지 못한 경우 알려주십시오.

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)

나는 당신의 주목 pikepdf의 코드는이 오류 메시지를 던져해야 암호를 누락 한 암호화 된 PDF를 여는 데 사용 :

pikepdf._qpdf.PasswordError : encrypted.pdf : 유효하지 않은 비밀번호

import pikepdf

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

tika 를 사용 하여 pikepdf에 의해 작성된 decrypted.pdf에서 텍스트를 추출 할 수 있습니다 .

from tika import parser

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

또한 pikepdf 는 현재 텍스트 추출을 구현하지 않으며 여기에는 최신 릴리스 v1.6.4가 포함됩니다.


다양한 암호화 된 PDF 파일을 사용하여 몇 가지 테스트를 실행하기로 결정했습니다.

암호화 된 파일 이름을 모두 'encrypted.pdf'로 지정했으며 모두 동일한 암호화 및 암호 해독 암호를 사용했습니다.

  1. Adobe Acrobat 9.0 이상-암호화 수준 256 비트 AES

    • pikepdf가이 파일을 해독 할 수있었습니다
    • PyPDF2가 텍스트를 올바르게 추출 할 수 없습니다
    • tika는 텍스트를 올바르게 추출 할 수 있습니다
  2. Adobe Acrobat 6.0 이상-암호화 수준 128 비트 RC4

    • pikepdf가이 파일을 해독 할 수있었습니다
    • PyPDF2가 텍스트를 올바르게 추출 할 수 없습니다
    • tika는 텍스트를 올바르게 추출 할 수 있습니다
  3. Adobe Acrobat 3.0 이상-암호화 수준 40 비트 RC4

    • pikepdf가이 파일을 해독 할 수있었습니다
    • PyPDF2가 텍스트를 올바르게 추출 할 수 없습니다
    • tika는 텍스트를 올바르게 추출 할 수 있습니다
  4. Adobe Acrobat 5.0 이상-암호화 수준 128 비트 RC4

    • Microsoft Word로 작성
    • pikepdf가이 파일을 해독 할 수있었습니다
    • PyPDF2는 텍스트를 올바르게 추출 할 수 있습니다
    • tika는 텍스트를 올바르게 추출 할 수 있습니다
  5. Adobe Acrobat 9.0 이상-암호화 수준 256 비트 AES

    • pdfprotectfree를 사용하여 생성
    • pikepdf가이 파일을 해독 할 수있었습니다
    • PyPDF2는 텍스트를 올바르게 추출 할 수 있습니다
    • tika는 텍스트를 올바르게 추출 할 수 있습니다

PyPDF2는 Adobe Acrobat으로 작성되지 않은 해독 된 PDF 파일에서 텍스트를 추출 할 수있었습니다.

Adobe Acrobat에서 만든 PDF에 포함 된 서식과 관련이 있다고 가정합니다. 형식에 대한이 추측을 확인하려면 추가 테스트가 필요합니다.

tika는 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 가 Acrobat PDF 파일을 해독 할 수 없음 => 6.0

이 문제는 2015 년 9 월 15 일 부터 모듈 소유자에게 공개되었습니다 . 이 문제가 프로젝트 소유자에 의해 해결 될 때이 문제와 관련된 의견에서 명확하지 않습니다. 마지막 커밋은 2018 년 6 월 25 일입니다.

PyPDF4 암호 해독 문제

PyPDF4는 PyPDF2를 대체합니다. 이 모듈에는 PDF 파일을 암호화하는 데 사용되는 특정 알고리즘의 암호 해독 문제도 있습니다.

테스트 파일 : Adobe Acrobat 9.0 이상-암호화 수준 256 비트 AES

PyPDF2 오류 메시지 : 알고리즘 코드 1과 2 만 지원됩니다

PyPDF4 오류 메시지 : 알고리즘 코드 1과 2 만 지원됩니다. 이 PDF는 코드 5를 사용합니다.


업데이트 섹션 10-11-2019

이 섹션은 10-07-2019 및 10-08-2019의 업데이트에 대한 답변입니다.

업데이트에서 'Adobe Reader로 보안 PDF'를 열고 문서를 다른 PDF로 인쇄하면 'SECURED'플래그가 제거됩니다. 몇 가지 테스트를 수행 한 후이 시나리오에서 어떤 일이 발생하는지 파악했습니다.

Adobe PDF 수준의 보안

Adobe PDF에는 문서 소유자가 활성화 할 수있는 여러 유형의 보안 컨트롤이 있습니다. 암호 나 인증서로 제어를 시행 할 수 있습니다.

  1. 문서 암호화 (문서 열기 암호로 시행)

    • 모든 문서 내용을 암호화 (가장 일반적)
    • 메타 데이터를 제외한 모든 문서 내용 암호화 => Acrobat 6.0
    • 첨부 파일 만 암호화 => Acrobat 7.0
  2. 제한적인 편집 및 인쇄 (권한 비밀번호로 시행)

    • 인쇄 허용
    • 허용되는 변경

아래 이미지는 256 비트 AES 암호화로 암호화 된 Adobe PDF를 보여줍니다. 이 PDF를 열거 나 인쇄하려면 비밀번호가 필요합니다. 암호를 사용하여 Adobe Reader에서이 문서를 열면 제목에 SECURED가 표시됩니다

password_level_encryption

이 문서에는이 답변에서 언급 한 Python 모듈로 열려면 암호가 필요합니다. Adobe Reader를 사용하여 암호화 된 PDF를 열려고합니다. 당신은 이것을 볼 수 있습니다 :

password_prompt

이 경고가 표시되지 않으면 문서에 보안 제어 기능이 없거나 제한적인 편집 및 인쇄 기능 만 활성화 된 것입니다.

아래 이미지는 PDF 문서에서 비밀번호를 사용하여 제한적으로 편집 할 수있는 것을 보여줍니다. 참고 인쇄가 가능 합니다. 이 PDF를 열거 나 인쇄하려면 암호 가 필요하지 않습니다 . 암호없이 Adobe Reader에서이 문서를 열면 제목에 SECURED가 표시됩니다 이 표시됩니다. 암호로 연 암호화 된 PDF와 동일한 경고입니다.

이 문서를 새 PDF로 인쇄 하면 제한 편집이 제거되었으므로 SECURED 경고가 제거됩니다.

password_level_restrictive_editing

모든 Adobe 제품은 권한 암호로 설정된 제한 사항을 적용합니다. 그러나 타사 제품이 이러한 설정을 지원하지 않으면 문서 받는 사람이 일부 또는 모든 제한 집합 을 무시할 수 있습니다.

따라서 PDF로 인쇄하는 문서에는 제한적인 편집 기능이 있으며 활성화 하는 데 필요한 암호 가없는 것으로 가정합니다.

PDF 암호화 중단과 관련하여

PyPDF2 또는 PyPDF4 는 PDF 문서의 문서 열기 암호 기능을 중단하도록 설계 되지 않았습니다 . 암호화 된 비밀번호로 보호 된 PDF 파일을 열려고하면 두 모듈 모두 다음 오류가 발생합니다.

PyPDF2.utils.PdfReadError : 파일이 해독되지 않았습니다

암호화 된 PDF 파일의 암호 열기 기능은 다양한 방법을 사용하여 무시할 수 있지만 단일 기법이 작동하지 않을 수 있으며 암호 복잡성 등 여러 요인으로 인해 일부 기법이 허용되지 않을 수 있습니다.

PDF 암호화는 내부적으로 PDF 버전에 따라 40, 128 또는 256 비트의 암호화 키와 함께 작동합니다. 이진 암호화 키는 사용자가 제공 한 암호에서 파생됩니다. 암호는 길이 및 인코딩 제약 조건이 적용됩니다.

예를 들어, PDF 1.7 Adobe Extension Level 3 (Acrobat 9-AES-256)은 유니 코드 문자 (65,536 개의 가능한 문자)를 도입했으며 비밀번호의 UTF-8 표현에서 최대 길이를 127 바이트로 올렸습니다.


아래 코드는 제한 편집이 활성화 된 PDF를 엽니 다. SECURED 경고를 추가하지 않고이 파일을 새 PDF로 저장합니다. 티카의 코드는 새 파일에서 내용을 구문 분석합니다.

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)

이 코드는 파일을 여는 데 암호가 필요한지 확인합니다. 이 코드는 수정되고 다른 기능을 추가 할 수 있습니다. 추가 할 수있는 몇 가지 다른 기능이 있지만 pikepdf에 대한 설명서가 코드베이스 내의 주석과 일치하지 않으므로이를 개선하기 위해 더 많은 연구가 필요합니다.

# 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
비밀번호를 제공하지 않고 어떻게 안전한 PDF 파일을 열 수 있습니까?
인생은 복잡합니다.

1
제한적인 편집 보호 만 언급하고 있습니까?
인생은 복잡합니다.

1
제한적인 편집 보호 기능이 활성화되었지만 인쇄가 가능한 PDF로 작동하는 코드로 업데이트되었습니다.
인생은 복잡합니다.

1
XHTML을 사용할 수 있습니까?
인생은 복잡하다

1
XHTML을 출력하도록 답변을 수정했습니다. JSON도 가능하지만 tika 파서와 관련된 github 프로젝트 코드를 파헤쳐 야합니다.
인생은 복잡합니다

1

암호없이 이러한 파일을 열면 이러한 파일에서 발생하는 오류를 처리 할 수 ​​있습니다.

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

파싱 ​​작업에 반환 된 pdf_obj를 사용할 수 있습니다. 또한 암호화 된 PDF가있는 경우 비밀번호를 제공 할 수 있습니다.


1
답변 주셔서 감사합니다! 비밀번호없이 읽으려고합니다. 현재, 우리는 내 업데이트 10/7/2019
Beginner

이것은 질문에 대답하는 것과는 거리가 멀다. 완전한 질문을 읽지 않은 것 같습니다.
shoonya ek

1
비밀번호의 기본값이 없음 인 경우 일반적으로 pikepdf가 실패하는 보안 PDF를 처리합니다. 빈 문자열을 전달하면 보안 PDF 문서를 올바르게 열고 구문 분석 할 수 있습니다 (테스트 한 경우).
Mahendra Singh 9

1
이 경우 @Beginner u 여기에서 PDF를 변환 할 필요가 없습니다. 이것은 빈 암호를 제공하여 보안 PDF가 작동하는 이전 경험에서 비롯된 것입니다.
Mahendra Singh

1
@Beginner 이것은 내 전체 코드입니다. pikepdf에서 pdf_object 만 리턴합니다. 이 pdf를 저장하려면 pdf_obj.save ( 'your_file_path')를 사용하여 반환 된 객체를 저장하십시오. 그런 다음이 PDF를 사용하여 텍스트 및 기타 개체를 구문 분석 할 수 있습니다. 텍스트 추출에 PdfPlumber 라는 라이브러리를 사용합니다 .
Mahendra Singh

1

tabula-py의 경우 read_pdf를 사용하여 비밀번호 옵션을 시도 할 수 있습니다. tabula-java의 기능에 달려 있으므로 어떤 암호화가 지원되는지 확실하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.