gvm-cli PDF Report make html Format

mimic1995·2024년 5월 9일
0

OpenSource

목록 보기
1/1
post-custom-banner

※ Ubuntu 22.04 에서 gvm-cli 로 pdf 레포트를 생성하고 이를 세 가지 방법을 이용하여 html 파일로 변환합니다.

gvm-cli 무료 버전에서는 더이상 html을 지원하지 않습니다. 유료 버전에서만 지원합니다.


📋 Report 생성

📜 Report 생성 bash script

  • vi createReport.sh
#!/bin/bash

name=$1
format_name="PDF"
pass="abcdefg"

# reportID_GET
report_id=$(sudo -u gvm gvm-cli --gmp-username admin --gmp-password "$pass" socket --socketpath /run/gvmd/gvmd.sock --xml "<get_tasks filter='name=${name}'/>" | grep -oP '<report id="\K[^"]+')

# report_format_ID_GET
format_id=$(sudo -u gvm gvm-cli --gmp-username admin --gmp-password "$pass" socket --socketpath /run/gvmd/gvmd.sock --xml "<get_report_formats filter='name=${format_name}'/>" |  xmlstarlet sel -t -m "//report_format" -v "@id")

# make REPORT
sudo -u gvm gvm-cli --gmp-username admin --gmp-password "$pass" socket --socketpath /run/gvmd/gvmd.sock --xml "<get_reports report_id=\"${report_id}\" format_id=\"${format_id}\" details='True' filter='apply_overrides=0 levels=hml rows=100 min_qod=70 first=1 sort-reverse=severity' />" | grep -oP '(?<=</report_format>)[^<]+' | base64 -d > /www/report/${name}.pdf

if [ -s "/www/report/${name}.pdf" ]; then
		# 둘 중 하나만 사용하고 나머지는 삭제 혹은 주석처리

		① pdftohtml 패키지 이용 시 사용
        pdftohtml -s -dataurls "/www/report/${name}.pdf" "/www/report/${name}.html"
        mv "/www/report/${name}-html.html" "/www/report/${name}.html"
        
        
        ② python 스크립트 호출 시 사용
        /usr/bin/python3 pdftohtml.py "/www/report/${name}.pdf" "/www/report/${name}.html"

else
        logger "파일 생성 실패: ${name}"
fi

⚙️ 파일 포맷 변환

🧐 pdftohtml 패키지 사용 시

  • 패키지 설치
apt install -y pdftohtml
  • 변환 예시
# 별다른 이미지, 프레임 없이 단순하게만 출력
pdftohtml -noframes name.pdf (name.html)

# html과 png 파일만 생성
pdftohtml -s -dataurls name.pdf (name.html)

😓 python Spire.PDF 사용 시

결론적으로 Spire.PDF 사용하여 변환 시 img 화 되어 변환되기 때문에 text/html을 추출하여 사용하지 못해 개발 중에 사용이 어려웠습니다. 단순 출력만을 위한 거라면 권유드리지만 output data를 활용해야 한다면 권유드리지 않습니다.

  • 패키지 설치
python3 -m pip install Spire.PDF
  • 변환 스크립트
import sys
from spire.pdf.common import *
from spire.pdf import *

pdf_file = sys.argv[1]
html_file = sys.argv[2]

# PDF class
doc = PdfDocument()

# Load pdf file
doc.LoadFromFile(pdf_file)

# convert
doc.SaveToFile(html_file, FileFormat.HTML)
doc.Close()
※ URL: https://www.e-iceblue.com/ko/pdf/pdf-to-html-python.html

😄 python pdfminer.six 사용 시

gvm-cli 에서 사용되는 python package 와 충돌이 발생하오니 에러가 발생한다면 조치 내역을 따라 해보시길 바랍니다.

  • 패키지 설치
python3 -m pip install pdfminer.six
  • 변환 스크립트
import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import HTMLConverter
# from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

pdf_file = sys.argv[1]
html_file = sys.argv[2]

def convert_pdf_to_html(pdf_file, html_file):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()

    with open(html_file, 'wb') as f:
        device = HTMLConverter(rsrcmgr, f, codec=codec, laparams=laparams)
        with open(pdf_file, 'rb') as fp:
            interpreter = PDFPageInterpreter(rsrcmgr, device)
            password = ""
            maxpages = 0 # is for all
            caching = True
            pagenos = set()
            for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True):
                interpreter.process_page(page)
        device.close()

if __name__ == "__main__":
    if len(sys.argv) != 3:
        #print("Usage: python script.py <pdf_file> <html_file>")
        sys.exit(1)

    pdf_file = sys.argv[1]
    html_file = sys.argv[2]
    convert_pdf_to_html(pdf_file, html_file)
    #print(f"PDF converted to HTML and saved to {html_file}")
URL: https://best-mother-seonnyeo.tistory.com/55

✋ python 스크립트 호출 시

둘 다 인자 값을 받기 때문에 아래와 같이 호출합니다.

python3 스크립트_명.py /path/to/PDF_name.pdf /path/to/HTML_name.html

🤕 pdfminer.six 로 인한 패키지 재설치

멀쩡히 잘 되던 gvm-cli인데 pdfminer.six 설치 후 갑자기 안된다면 아래 조치를 따라해보시길 바랍니다.

# pip show pdfminer.six
===
Name: pdfminer.six
Version: 20231228
Summary: PDF parser and analyzer
Home-page: https://github.com/pdfminer/pdfminer.six
Author: Yusuke Shinyama + Philippe Guglielmetti
Author-email: pdfminer@goulu.net
License: MIT/X
Location: /usr/local/lib/python3.10/dist-packages
Requires: charset-normalizer, cryptography
Required-by: 

cryptography 패키지가 재설치 된 것이 아닌가 의심이 됩니다.

# python3 -m pip show cryptography
===
Name: cryptography
Version: 42.0.7
Summary: cryptography is a package which provides cryptographic recipes and primitives to Python developers.
Home-page: https://github.com/pyca/cryptography
Author: The Python Cryptographic Authority and individual contributors
Author-email: cryptography-dev@python.org
License: BSD or Apache License, Version 2.0
Location: /usr/local/lib/python3.10/dist-packages
Requires: cffi
Required-by: pdfminer.six
# ls -d /usr/local/lib/python3.10/dist-packages/* | grep cryptography
===
/usr/local/lib/python3.10/dist-packages/cryptography
/usr/local/lib/python3.10/dist-packages/cryptography-42.0.7.dist-info

36 버전대로 다운그레이드하기 위해 재설치를 합니다.

python3 -m pip uninstall -y cryptography
python3 -m pip install cryptography==36.0.2
profile
Raiju Hantu Goryo Obake
post-custom-banner

0개의 댓글