프린터 없이 정부사이트(민원24등) PDF 출력하기

in #kr7 years ago (edited)
민원24,대법원인터넷등기소, 프린터 없이 등본 출력, 프린터 없다고 울지마세요~

어쩌다 보니 각종 증명서류를 출력해야할 일이 빈번해 지는 와중에 빈번히 다음과 같은 상황이 발생하더군요..

  1. 용지가 없다
  2. 내 컴퓨터에 연결된 프린터에 잉크 또는 토너가 없다
  3. 프린터가 한대 있으나 다른PC에 연결되어 있고, 문서한장 출력하자고 프린터를 옮겨올 수도 없다.
  4. 대부분의 정부사이트들은 지원가능 프린터를 여러 방법으로 체크하며 USB등으로 직접 연결되거나 공유 프린터가 아닌 네트워크 지원 프린터의 경우만 가능하다.
  5. 프린터가 용지를 씹었다. 하지만 사이트에선 출력이 완료됫고. 유료문서라 다시 뽑을라면 결제도 다시 해야 한다. ( 이게 가장 빡칩니다 ㅠ_ㅠ )

일단 본인의 경우만 하더라도 이전에 비해서 종이에 출력한 출력물을 다룰일이 많이 줄어든건 사실인데, 개인적으론 PDF의 사용률이 높아진 듯하달까요 최근에는 Print to PDF 같은 기능으로 한글이나 MS워드등에서 작성한 문서를 PDF로 출력해서 PDF로 보내는 경우도 많고. 이메일 이나 카톡등 실질 문서파일등을 직접 주고 받음으로 굳이 종이에 출력된 형태여야만 할 경우가 아니라면 물리적 프린터가 필요한 경우가 점점 줄어들 고 있다고 봅니다.

게다가 사무실이나 가정등 고정된 곳에서 컴퓨터를 사용하는게 아닌 도서관이나 커피숍등에서 컴퓨터를 사용하거나 개인정보를 담은 민원문서들은 공인인증서를 필요로 하는데 타인의 PC나 공용PC에 인증서를 설치 또는 인증서가 저장된 USB를 꼽는 행위 자체가 꺼림직할 정도로 흉흉한 세상이기도 하구요.

제가 정부사이트라 칭하는 곳들을 보자면 민원24, 대법원인터넷등기소, 4대보험 관련 사이트등 다양한데요 대부분 개인 신상을 포함한 정보가 들어 있는 경우 물리적으로 연결된 프린터를 통해 종이에 출력하는 상황을 가정하고 그 외의 경우에는 불가한 상황이 됩니다.

프린터에 대한 제한이 존재하는 이유중 가장 큰 건 PDF등의 파일이나 가상프린터등을 통해 JPG등의 이미지 포맷으로 각종 증명서류를 출력가능한 경우에 위조를 통해 범죄에 사용될 수 있다 라는 부분 일테지만 개인적으론 증명서류를 위조할 정도의 능력이라면 출력물을 스캔하는 등의 방법으로도 충분히 가능한 영역이고 애초에 인감증명서 등의 중요서류는 인터넷 발급조차 되지 않으며 대부분의 증명서류들은 인터넷을 통한 위변조 여부의 확인이 가능하고 그 문서 자체의 내용이 큰 의미를 가지는 부동산등기부등본등은 위변조 여부를 떠나 누구나 발급 가능하고 본인이 직접 발급받아 확인하는게 각종 사기범죄에 당하지 않는 상식적인 수준의 가이드라인 이라고 생각 합니다.

본인의 경우 같은 증명서류를 여러장을 출력해야 하는 경우가 많은 관계로 매번 발급, 인쇄 과정을 반복하는데서 오는 비효율성과 어딘가에 제출하기 위함이 아닌 내용의 확인을 위한 경우가 대부분이라 어떻게 하면 정부사이트들의 각종 증명서류들의 출력을 프린터 없이 파일로 저장할 수 있을지 고민 했었습니다.

기존에 인터넷 상에도 많은 분들이 여러 추가 프로그램들을 사용하여 가능할 방법을 공개해 왔지만 유료이거나 더이상 유효하지 않은 방법등이 많았습니다.

사실 본인의 경우 20년을 넘게 프로그래머를 직업으로 살아왔고 30년을 넘게 프로그래밍을 해오고 있는 사람으로써 이러한 개인적인 불편함을 해소하기 위한 프로그램을 만들어 쓰기 시작했습니다.

사용자들 입장에선 단지 그냥 프로그램만 받아서 설치하고 사용가능하면 그만 일지 몰라도 어떻게 이런놈이 만들어 졌는지 궁금해 하실 분도 또 언젠가 제가 더이상 개발을 이어가지 못하더라도 기본적인 원리에 대한 기록을 남겨두면 그 누군가가 후에라도 좀더 유용하고 더 좋은 프로그램을 내 놓을수도 있을테지요.. ( 그렇게 세상이 발전해 왔으니까요 )

각설 하구요.. 이제 어떤 과정을 통해 프로그램을 개발하게 되었는지 본격적으로 썰을 풀어 보겠습니다.

윈도우에서 특정 프로그램이 프린터를 통해 출력하는 과정은 간단히 보자면 다음과 같습니다.

프로그램 -> 인쇄 -> Window 프린터 스풀러 -> 프린터 드라이버 -> 프린터 -> 출력

정부사이트들에서 프린터의 유효성을 체크하는 부분은 우선 프린터 드라이버의 명칭을 통해 제조사 및 프린터명, 드라이버명 등을 체크하고 연결된 포트정보를 통해 프린터가 LPT1등의 시리얼 포트, USB포트등에 직접 연결되었거나 IP를 이용한 네트워크 프린터라 하여도 프린터의 IP가 127.0.0.1등의 로컬호스트이거나 192.168.0.x 등의 주소라 하여도 결국 인쇄명령을 내리는 PC자신의 IP인 경우 Print to PDF 등과 마찮가지로 출력할 수 없습니다.

이를 반대로 풀어서 무언가를 해보기 위해선

  1. 인쇄가능 프린터 목록에 존재하는 프린터 드라이버를 쓰고
  2. 공유프린터가 아닌 IP기반의 네트워크 프린터로 포트구성을 하고
  3. 프린터 데이터를 수신할 서버 프로그래밍을 구성하여 파일로 저장한다

이렇게 3가지로 문제를 해결하면 되겠습니다. 이러한 생각을 해오면서 윈도우에서의 인쇄와 관련된 자료를 찾기위한 서핑중에 Github에 올라온 어떤 소스코드에서 재미난 힌트를 하나 얻게 되었지요. RawPrinterServer 인가 하는 명칭이었는데 해당 프로그램은 원격지의 PC에 USB등으로 연결된 프린터를 네트워크 프린터 인냥 프린트 데이터를 받아 프린터로 전달해주는 역할을 하는 프로그램 이었는데 그 프로그램의 소스를 보다보니 IP기반의 네트워크 프린터들은 Standard TCP/IP Port 라는 프린터 포트를 사용하고 이 포트의 정보에는 프린터의 IP와 포트정보가 포함되어 있으며 일반적인 서버/클라이언트 방식으로 구동되는 많은 프로그램들이 접속->인증->작업->종료 등의 과정을 거치는 반면 네트워크 프린터들은 애초에 자신이 뭐하는 놈인질 자신에게 접속할 놈들이 알고 있고 자신이 알아먹을 형태의 데이터들 외에는 받아들일 이유가 없다고 단정하고 있다는 것이지요.

조금더 풀어보자면. 네트워크 통신을 위한 많은 프로토콜은 상호간에 데이터를 주고 받는데요 이를 위해 각종 프로토콜 규약을 통해 데이터의 구성 및 각종 값들에 대해서 미리 정의를 해두고 이를 검증하며 무언가를 해나가는 편입니다. 하지만 프린터는 말그대로 인쇄할 데이터를 받아서 종이로 출력하면 그만이기 때문에 클라이언트에 해당하는 PC의 윈도우, 그 안의 프린터 드라이버는 프린터 포트정보상의 IP주소와 포트에 접속하고 출력할 데이터를 주르륵 전송한뒤에 접속을 끊어버리면 그만인 것이지요. 한마디로 PC에선 그저 접속후 데이터를 보낸후 접속을 끊기만 하면 되고 프린터 입장에선 접속요청을 기다리고 접속된 PC의 접속이 종료되기 전까지 전송된 모든 데이터를 해석해서 종이로 출력하면 되는겁니다. 만약 해석 불가능한 이상한 데이터가 수신될 경우 수신된 데이터는 버려버리고 접속은 끊어버리면 그만이겠지요.

여기서 부터 문제가 조금 수월하게 풀렸습니다. 현존하는 대다수의 프린터들은 크게 PostScript, PCL/XL, XPS 이 3가지와 아에 독립적인 자체 포맷으로 프린트할 데이터를 프린터에 전송한다고 봐도 됩니다. 정부사이트들의 인쇄가능 프린터 목록만 봐도 PS3, PS, XL, PCL, PCL5, XPS 등이 표시된 프린터가 다수 존재하구요.

PostScript 는 워낙 역사깊은 포맷이고 친절하게도 GhostScript의 각종 기능을 통해 PostScript -> PDF, GhostPCL을 통해 PCL을 PDF로 변환하는등 다양한 짓도 가능하구요. XPS는 그 요즘 윈도우에는 대부분 기본적으로 뷰어가 존재하니 그건 그것대로 문제가 없겠다 싶었습니다. 또한 어짜피 언놈이던 몇 놈만 출력가능한 프린터가 있다해도 원하는 바는 이룰수 있겠다 싶었구요. 포맷이 공개되지 않았거나 구조를 알기 힘든 완전 자체 포맷을 사용하는 프린터의 경우 과감히 버리는 방향으로 진행하였습니다.

그리하여 처음 만들었던 프로그램은 IP PRINTER 라는 프로그램 이었고 HP Universal Print PS 라는 PostScript 방식의 프린터 드라이버를 사용 했었는데 이 IP PRINTER 라는 놈에 포함된 기능은 UPnP, TCP Server, 프린트 포트 관련 자동 설정 기능 등을 포함하고 있었습니다. 원래 계속 고민했던것이 정부사이트 들에선 출력 대상 네트워크 프린터의 IP 주소가 출력하는 PC의 IP인 경우 로컬포트로 인식해서 오류를 발생시켰습니다. 그렇다면 출력대상의 IP 주소가 출력하는 PC의 IP와 다른데 결국 출력하는 PC한테 출력 데이터가 돌아오려면 어찌해야 하는가?

이 고민을 하는데 제 책상위에 놓여진 공유기가 눈에 들어오더군요.. 이전에 모 통신사의 인터넷 전화기용으로 납품되는 공유기를 개발했던 경험이 있었지요. 대부분의 공유기는 NAT라는 방식을 기반하고 UPnP라고 하는 기능을 탑재하고 있습니다. 외부에서 공유기 내부의 사설IP를 사용하는 PC와 통신을 하기 위해선 포트포워딩 설정등이 필요하지만 UPnP 기능을 통하면 프로그램적으로 공유기에 포트포워딩 설정을 동적으로 할 수 있습니다.

그리하여, IP PRINTER를 실행하면 이 프로그램이 하는 짓은.

  1. 9100번 포트에 TCP Server를 연다
  2. UPnP를 통해 공유기에 부여된 외부공인IP와 PC의 사설IP를 얻고 공유기의 외부공인IP의 9100포트로 들어오는 TCP 데이터를 PC의 사설IP의 9100 포트로 포워딩 시킨다.
  3. 2번에서 얻은 외부공인IP와 9100 포트로 Standard TCP/IP Port 프린터 포트 레지스트리를 생성하고
  4. HP Universal Print PS의 출력포트를 3번에서 생성한 포트로 설정하고 프린터 서비스를 재시작하여 적용한다.

공유기의 외부공인IP가 100.0.0.1 이라 치고 PC의 사설IP가 192.168.0.100 이라 치자면 위와같은 과정을 거친후 HP Universal Print PS로 출력을 하게 되면 프린터 드라이버는 PostScript포맷으로 가공된 프린트 데이터를 100.0.0.1에 9100포트로 전송할꺼고 UPnP를 통해 100.0.0.1에 9100포트로 들어온 데이터는 내부 사설IP인 192.168.0.100의 9100포트로 전달 되도록 포워딩 설정이 되어 있으니 공유기의 포트포워딩 기능에 의해서 프린트 데이터는 다시 192.168.0.100의 9100 포트로 전달되게 되겠지요. 그러면 9100 포트에 실행중인 TCP Server에서 해당 데이터를 전송받아 파일로 저장하면 PostScript 정보를 담은 출력파일을 얻게 됩니다.

이 파일은 GhostScrit 와 Gsview 등을 통해 직접 볼 수도 있고 PDF나 JPG등으로 변환할 수도 있고 다양하게 사용 할 수 있었습니다.

이 프로그램은 IP PRINTER 라는 이름으로 제 블로그를 통해 배포했었습니다.. 만!!! 제 경우에는 보통 집 아니면 사무실에서 사용을 하다보니 늘 무선공유기를 사용중이었는데 급한데 잘 안된다고 문의해 오시는 분들이 하나 둘씩 생겨나더군요. 그 이유를 보자면

  1. 공유기가 없어요
  2. 방화벽이 있어요
  3. 공유기는 있는데 UPnP가 없는것 같아요

일단 직장인들의 경우 UPnP등의 기능이 없는 단순 라우터들로 망이 구성되거나 방화벽이 아주 강하게 물려 있는 경우가 많았고 대학교 기숙사나 통신사의 공용WIFI등에서는 UPnP기능이 동작하길 기대하기 어렵고 당연히 공용인터넷을 위한 장치에 서버 구동에 쓰이는 포트포워딩에 대한 기능이 포함될리 만무했던 것이지요.

또한 모든 사람이 공유기의 설정을 맘대로 주무를 수 있을 정도로 NAT니 포트포워딩이니 하는 개념과 용어와 의미를 다 알고 현재 네트워크 환경을 판단해서 환경구성을 하는 등의 일을 할 수 있을것이라 기대하긴 어렵겠구나 라고 생각했습니다..

이에 문의하시는 분들이 가장많이 하신 질문이 스마트폰의 테더링이나 핫스팟으로는 혹시 안되느냐 라는 것이었습니다. 생각해보니 제 경우에도 노트북 들고다니다 급할때는 스마트폰의 핫스팟 기능을 종종 쓰거든요..

그리하여 스마트폰을 프린터화 시켜보자! 라는 마음으로

새로운 프로그램을 다시 만들게 되었습니다..

이름하여 ..

모두의 프린터!! 두둥!!

다음글에서 모두의 프린터의 개발이야기를 계속 풀어가 보도록 하겠습니다.


참고로 모두의 프린터는 이미 한달여 전에 제 블로그에 공개를 했던 프로그램입니다. 당장 관련된 무언가가 필요하신 분이라면 피로곰의 모두의프린터 를 방문하시면 여전히 테스트중인 버전을 다운로드 받으실 수 있습니다.

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 63207.55
ETH 2571.17
USDT 1.00
SBD 2.82