원문 캡처 · github.com
원문 캡처 · github.com

iText의 무료 GitHub Action itext/markdown2pdf는 Markdown 파일을 PDF/UA-2 규격의 PDF로, 폴더를 입력하면 각 .md 파일의 PDF를 담은 ZIP 파일로 변환한다. 공개 저장소에서만 사용할 수 있으며, 실행 환경은 ubuntu-latest의 Linux x86_64 러너로 제한된다.

파일을 입력하면 PDF 한 개를 만들고, 폴더를 입력하면 하위 폴더까지 재귀적으로 변환해 입력 폴더 구조를 보존한 ZIP을 만든다. 폴더에 .md 파일이 없으면 실패하며, 기존 PDF는 결과에 복사하지 않는다. 성공하면 지정한 출력 파일을 교체하고, 변환에 실패하면 기존 출력 파일을 유지한다.

워크플로에서는 저장소를 체크아웃한 뒤 Action을 호출하고, 결과물을 보관하려면 actions/upload-artifact 단계를 추가한다. 아래 예시는 docs 폴더를 ZIP으로 변환한다.

yaml
permissions:
 contents: read

jobs:
 convert:
 runs-on: ubuntu-latest
 steps:
 - uses: actions/checkout@v4

 - uses: itext/markdown2pdf@v1
 id: convert
 with:
 input: 'docs'
 output: 'dist/documents.zip'

 - uses: actions/upload-artifact@v4
 with:
 name: itext-markdown2pdf-output
 path: ${{ steps.convert.outputs.output-path }}
 if-no-files-found: error

단일 파일을 변환하려면 input: 'README.md', output: 'dist/README.pdf'로 설정한다. 결과 파일은 러너의 작업 공간에 생성되며, 업로드 단계를 넣지 않으면 러너가 종료된 뒤 보관되지 않는다. GitHub는 업로드한 결과물을 자체 다운로드 아카이브로 감싼다. 입력·출력 경로는 절대 경로가 아니면 작업 공간 기준이며, 출력에는 폴더가 아닌 .pdf 또는 .zip 파일 경로를 지정해야 한다.

생성 PDF는 PDF 2.0을 사용하고 PDF/UA-2에 부합한다고 안내돼 있다. 다만 공개 저장소에서만 실행할 수 있고, 비공개 저장소에서는 사용할 수 없다. 기본 GITHUB_TOKEN으로 저장소 공개 여부를 확인하므로 작업 권한에 contents: read가 필요하다. 자체 호스팅 러너를 쓸 경우 Bash, GNU coreutils/findutils, zip도 PATH에 있어야 한다. 변환기는 저장소에 포함돼 있어 실행 중 내려받지 않는다.

Action과 래퍼 등 원본 코드는 MIT 라이선스지만, 함께 제공되는 실행 파일은 MIT 라이선스가 아니다. 실행 파일에는 iText Markdown-to-PDF Binary Limited Use License가 적용되며, 해당 조건에 따라 공식 iText GitHub Action에서만 사용할 수 있다. 의존성 및 라이선스 범위는 NOTICE와 제3자 고지에서 확인할 수 있다. 저장소에는 사용 예시와 릴리스 안내가 있다.