안녕하세요 오늘은 pdf파일을 text(html)형식으로 바꾸는 법을 알려드리도록 하겠습니다.

 

일단 cmd창에서 

pip isntall pdfminer를 설치해줍니다. 

또는 

pip3 install pdfminer.six 

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
 
path = "C:\\Users\\admin\\Desktop\\techmate_2\\11031996791214.pdf" #경로 
 
rsrcmgr = PDFResourceManager() 
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
 
f = open('./out.html', 'wb') # out으로 저장 python 파일 안에 가면 out이 저장됨 
device = HTMLConverter(rsrcmgr, f, codec=codec, laparams=laparams) # 변환
 
fp = open(path, 'rb')
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)
fp.close()
device.close()
str = retstr.getvalue()
retstr.close()
f.close()
 


음 저는 일단 긁어 왔는데요 정확한 사용설명서 및 해석내용은 추후에 업데이트 하도록 하겠습니다.

 

이상 pdf를 html으로 바꾸는 형식을 마치겠습니다. 

 

직렬화(Serialization) : 파이썬의 객체를 일련의 바이트들로 변환한 후 다시 파이썬 객체로 복원할 수 있는 것 즉, 바이트들로 변환

 

역직렬화(Deserialization) : 다시 바이트들을 파이썬 객체로 메모리 상에 복원하는 것

 

파이썬의 pickle모듈을 사용합니다.

 

소스코드는 다음과 같습니다.

 

import pickle  # (객체, 텍스트) 직렬화, 역직렬화


#파일 이름과 데이터
bfilename = 'C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python38-32/test.bin'
tfilename = 'C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python38-32/test.txt'

data1 = 77
data2 = "hello, world!"
data3 = ["car", "apple","house"]

#바이너리 쓰기
with open(bfilename, 'wb') as f:
    pickle.dump(data1,f)    #dumps(문자열을 직렬화) 
    pickle.dump(data2,f)    #dump 객체를 바이너리로
    pickle.dump(data3,f)

#텍스트 쓰기
with open(tfilename, 'wt') as f:
    f.write(str(data1))
    f.write('\n')
    f.write(data2)
    f.write('\n')
    f.writelines('\n'.join(data3))
    #write는리스트를 추출할 수 없기때문에
    # writelines함수를 제공한다.

#바이너리 읽기
with open(bfilename, 'rb') as f:
    b = pickle.load(f) # 객체를 역직렬화
    #loads 문자열을 읽어오는 것 (문자열 역질렬화)
    print(type(b), ' Binary Read1 | ',b)
    b = pickle.load(f)
    print(type(b), ' Binary Read2 | ',b)
    b = pickle.load(f)
    print(type(b), ' Binary Read3 | ',b)
    
#텍스트 읽기
with open(tfilename, 'rt') as f:
    for i, line in enumerate(f, 1):
        print(type(line), 'Text Read' + str(i) + '| ', line, end='')

         

 결과를 한 번 유추해보시길 바랍니다.

 

결과

 

pickle말고도 json을 변환하는 것도 있는데 나중에 크롤링, 자동화 만들 때 꼭 필요한 부분이라고 생각합니다.

 

 

이상 포스터를 마치겠습니다.

파이썬을 설치하고 파이썬의 selenium과 webdriver, chromewebdriver을 설치해야됩니다.

소스코드는 다음과 같습니다.

import sys
import io
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time



chrome_options = Options() # 인스턴스 생성 

driver = webdriver.Chrome('C:\\Users\\admin\\chromedriver.exe')
driver.set_window_size(1920,1280)
driver.implicitly_wait(3)


driver.get('https://logins.daum.net/accounts/signinform.do?nil_profile=login&url=https://www.daum.net') # 다음불러오기  
time.sleep(5)
driver.implicitly_wait(3)

driver.find_element_by_name('id').send_keys('') # id
driver.find_element_by_name('pw').send_keys('') # password

driver.find_element_by_xpath('//*[@id="loginBtn"]').click()





print('완료')

id하고 password부분에 자신의 id와 password를 넣어주시면 됩니다.

 

딱히 어려운 곳이 없으니 설명은 생략하겠습니다. 

 

이상포스터를 맞치겠습니다.

 

추후에 로그인 후 이것 저것 해보겠습니다. 

안녕하세요 이번에 엄청 간단한 실습을 해보겠습니다.

 스크린샷을 일일이 하기 힘들잖아요 

그래서 저는 구글 홈페이지 스크린샷, 다음 홈페이지 스크린샷 이렇게 두 개를 해보겠습니다.

 

소스 코드는 다음과 같습니다.

 

파이썬으로 하기 위해서는 selenium와 chromewebdriver가 설치 되어 있어야 됩니다.

import sys
import io
from selenium import webdriver


driver = webdriver.Chrome(r'C:\\Users\\admin\\chromedriver.exe')
# 크롬드라이버 있는 곳 

driver.implicitly_wait(5)

driver.get('https://google.com') # 구글 불러오기 

driver.save_screenshot("C:\\Users\\admin/website1.png") #
# 구글  사진 찍기, 사진 찍을 곳 저장위치 

driver.implicitly_wait(5) #기다림 

driver.get("https://www.daum.net") #다음 불러오기 

driver.save_screenshot("C:\\Users\\admin/website2.png")
# 다음 사진 찍기, 사진 찍을 곳 저장위치 


driver.quit() # 종료 

print('스크린샷 완료')

 

이렇게 되면 자동으로 다음과구글이 알아서 켜지고 꺼집니다.

제가 폴더에 저장한 곳에 들어가보면

 

 

만약 내부적으로 실행시키고 싶다면 밑에 꺼를 사용해주세요

import sys
import io
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time



chrome_options = Options() # 인스턴스 생성
chrome_options.add_argument("--headless") # 내부적으로 실행 

driver = webdriver.Chrome(chrome_options=chrome_options,executable_path=r'C:\\Users\\admin\\chromedriver.exe')
# 크롬드라이버 있는 곳  excutable_pat = 즉시실행 
#12줄에서 오류가 뜬다면 r'C:\\을 r을 빼보고 실행시켜보세요~ 


#driver.implicitly_wait(5)

driver.get('https://google.com') # 구글 불러오기 

driver.save_screenshot("C:\\Users\\admin/website_ch0.png") #
# 구글  사진 찍기, 사진 찍을 곳 저장위치 

#driver.implicitly_wait(5) #기다림 

driver.get("https://www.daum.net") #다음 불러오기 

driver.save_screenshot("C:\\Users\\admin/website_ch.png")
# 다음 사진 찍기, 사진 찍을 곳 저장위치 


driver.quit() # 종료 

print('스크린샷 완료')

 

이어서 하는 법을 알려드리겠습니다. tasks.json파일이 열리게 됩니다.

 

 

 

tasks.json파일 안에 이 소스코드를 넣어줍니다.



 {

    // See https://go.microsoft.com/fwlink/?LinkId=733558

    // for the documentation about the tasks.json format

    "version": "2.0.0",

    "tasks": [

        {

            "label": "build_gcc",

            "type": "shell",

            "command": "gcc",

            "args": [

                "-g",

                "-o",

                "${fileDirname}/${fileBasenameNoExtension}.out",

                "${file}"

            ],

            "group": {

                "kind": "build",

                "isDefault": true

            }

        },

        {

            "label": "build_g++",

            "type": "shell",

            "command": "g++",

            "args": [

                "-g",

                "-o",

                "${fileDirname}/${fileBasenameNoExtension}.out",

                "${file}"

            ],

            "group": {

                "kind": "build",

                "isDefault": true

            }

        },

        {

            "label": "exec",

            "type": "shell",

            "command": "${fileDirname}/${fileBasenameNoExtension}.out",

            "group": {

                "kind": "build",

                "isDefault": true

            }

        }

    ]

}

command + 쉬프트 + b 를 눌러 exec를 눌러줍니다!

 

안 될 시 폴더를 한 번 삭제해보고 다시 해보시길 바랍니다. 

안녕하세요 오늘은 맥에서 vscode를 설치해보겠습니다!!

 

밑에 아래vscode를 설치해줍니다.

 

https://code.visualstudio.com/

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 

저는 설치가 이미 완료되어서 바로 넘어가겠습니다.

 

설치하신 분은 폴더열기 -> C/C++ 파일을 만들어줍니다. 만약 그게 없거나 잘 모르시는 분들은

상단 메뉴 -> 파일 -> Open에서 파일을 설치해줍니다.

 

 

그런 다음 1번을 눌르고 2번을 설치해줍니다.

 

 

그리고 korean을 쳐서 korean Language Pack을 설치해줍니다.

 

 

그리고 이제 1번을 눌르고 2번을 눌러 hello.cpp을 만들어줍니다. 아니면 *.cpp

 

command + 쉬프트(z옆에 있는 거) + p를 눌러줍니다. 밑에 엔터를 치면

 

create tasks.json ile from templete을 만들어 줍니다. 

그 뒤로 저기서 엔터를 치면 Others를  또 눌러줍니다.

 

 

2탄에서 vscode c++설치법에 대해서 알려드리겠습니다.

 

1. 네트워크 설치 구조

통신망은 정보를 전달하기 위해서 통신 규약에 의해 연결한 통신 설비의 집합이다.

2. 성형(Star, 중앙 집중형)

성형은 중앙에 중앙 컴퓨터가 있고, 이를 중심으로 단말장치들이 연결되는 중앙 집중식의 네트워크이다.

  • 포인트 투 포인트 방식이다.

  • 중앙 컴퓨터를 통하여 데이터를 교환이다.

  • 단말장치 추가, 제거 쉽다.

  • 하나가 고장나더라도 다른 단말장치에 영향을 주지 않음, 중앙이 고장나면 전체 통신 마비가 된다.

  • 교환 노드의 수가 가장 적다.

3. 링형(Ring,루프형)

링형은 서로 이웃하는 것끼리 포인트 투 포인트(Point-to-Point)방식으로 연결시킨 형태이다.

  • 분산 및 집중 제어 모두 가능하다.

  • 단말장치의 추가/ 제거 및 기밀 보호가 어렵다.

  • 전송 지연이 발생할 수 있다.

  • 중계기의 수가 많아진다.

  • 데이터는 단방향, 양방향으로 전송할 수 있으며, 단방향의 링의 경우 컴퓨터, 단말장치, 통신 회선 중 어느 하나라도 고장나면 전체 통신망에 영향을 미친다.

4. 버스형(Bus)

버스형은 한 개의 통신 회선에 여러 대의 단말장치가 연결되어 있는 형태이다.

  • 물리적 구조가 간단하고, 추가와 제거가 용이하다.

  • 단말장치가 고장나더라도 전체에 영향을 주지 않는다. 신뢰성을 높일 수 있다.

  • 기밀 보장이 어렵고, 통신 회선의 길이에 제한이 있다.

5. 계층형(Tree, 분산형)

계층형은 중앙 컴퓨터와 일정 지역의 단말장치까지는 하나의 통신 회선으로 연결시키고, 이웃하는 단말장치는 일정 지역 내에 설치된 중간 단말장치로부터 다시 연결시키는 형태이다.(분산)

6.망형(Mesh)

망형은 모든 지점과 서로 연결한 형태, 노드의 연결성이 높다.

  • 많은 양의 통신을 필요로 하는 경우에 유리하다.

  • 공중 데이터 통신망에서 사용되며, 통신 회선의 총 경로가 가장 길다.

  • 회선 장애 시 다른 경로를 통하여 데이터를 전송할 수 있다.

  • 모든 노드를 망형으로 연결하려먼 노드의 수가 n개 일 때, n(n-1)/2개의 회선이 필요하고 노드의 n-1개의 포트가 필요하다.

예를 들어 25개의 노드를 망형으로 연결할 때 회선 수 = n(n-1) / 2 = 25(25-1)/2 = 600 = 300(개) , 포트수 = n-1 = 24개

 

 

7. 네트워크 분류

두 가지의 종류가 있다 . LAN과 WAN이 있다.

근거리 통신망(LAN; Local Area Network)는 회사, 학교, 연구소 등에서 비교적 가까운 거리에 있는 컴퓨터, 프린터, 테이프 등과 같은 자원을 연결하여 구성한다. 주로 공유 목적이며 버스형이나 링형 구조를 사용하며 전송 속도가 빠르며, 에러 발생율이 낮다.

 

광대역 통신망(WAN; Wide Area Network)는 국가, 대륙과 대륙 등과 같이 멀리 떨어진 사이트들을 연결하여 구성한다. 통신 속도가 느리고, 에러 발생률이 높다.

 

이상 포스터를 마치겠습니다.

안녕하세요 이번 문제는

문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

예제 입력 1 복사

5 20 10 35 30 7

예제 출력 1 복사

7 35

 

#include <iostream>

using namespace std;


int main()
{
      int a;
    cin >> a;
    int score[a+1];
    int max = -1000000;
    int min = 1000000;
  

    for(int i=0; i<a; i++)
    {
        cin >> score[i];
    
        if(max < score[i])
     {       max = score[i];}
        if(min > score[i])
         {   min = score[i];
    }
    }
    cout << min <<' '<< max;
    
    return 0;
    
    
}

cin >> a에서 5번 적고

 

for문에서 20 , 10 , 35 , 30  7을 입력합니다.

 

그런 다음 만약 max값보다 score[i]가 크면 max 값으로 저장해놓고

만약 min값도나 socre[i]이 작으면 min값에 저장해놓습니다.

 

딱히 어려운 점은 없는 것 같습니다.

 

이상 포스터를 마치겠습니다.

 

'C&C++' 카테고리의 다른 글

백준 1110번 c++ 문제풀이  (0) 2020.04.05
C++ , 자바(Java) 입출력  (0) 2020.04.05
블록과 블록체인  (0) 2020.03.12
머클 트리(Merkle tree)  (0) 2020.03.12
유닉스/리눅스의 구성요소  (0) 2020.03.12

+ Recent posts