명령줄을 사용하여 PDF의 이미지 바꾸기

명령줄을 사용하여 PDF의 이미지 바꾸기

일부 PDF 파일을 처리해야 합니다. 작업은 주어진 이미지 파일을 다른 이미지 파일과 교환하는 것으로 구성됩니다. 첫 번째 질문은 일괄 처리 중에 명령줄에서 PDF 이미지를 바꾸는 방법입니다. 다음으로 교체해야 할 이미지를 식별하는 방법과 같은 다른 문제를 해결하려고 노력할 것입니다(PDF 파일에는 여러 이미지가 있을 수 있으므로). 하지만 먼저 첫 번째 문제인 PDF의 이미지를 다른 이미지로 바꾸는 방법을 해결하고 싶습니다.

poppler-utils 및 pdftk에 대해 읽었지만 내가 아는 한 이 도구 중 어느 것도 이미지를 PDF로 바꾸는 것을 허용하지 않습니다.

답변1

음...제 생각엔 pdflatex그게 여기서 빠진 부분인 것 같아요.

OP는 자신이 조사를 했다고 밝혔 poppler-utils습니다 pdftk. 뭔가를 추가하겠습니다 pdfimages. 이것들은 pdflatex모두 솔루션의 일부입니다.

pdfimages -f 4 -l 20 -j -png target.pdf imageroot

위 샘플 코드에서는 pdfimages 4페이지부터 20페이지까지 탐색하여 target.pdf모든 이미지를 이름이 로 시작하는 파일로 추출합니다 imageroot.

poppler-utilspdftotext이 옵션을 권장합니다. 문서 -layout를 읽기 쉽게 유지하는 데 효과적입니다.

pdftotext -layout $1.pdf $1.txt

imagemagick제공된 솔루션 에 대한 OP 개체쉴드 드래곤이미지에 추출 가능한 텍스트가 없다는 것입니다. 내가 설명한 유틸리티를 사용하면 이제 OP에 모든 이미지와 추출된 모든 텍스트가 포함되며 -layout옵션은 페이지 번호와 내용을 보존합니다. OP는 올바른 텍스트 페이지를 식별하여 .tex지시문으로 끝나는 파일 에 넣고 %includegraphics파일 이름 참조로 이미지를 바꿀 수 있습니다. 그런 다음 pdflatex새로운 단일 페이지 .pdf를 얻고 이 .pdf를 사용하여 문서의 나머지 부분을 삽입합니다 pdftk. 원본 페이지 텍스트 내에서 이미지가 어디에 있는지 알면 %includegraphics [h]이미지를 올바른 위치에 배치할 수 있습니다.

답변2

간단한 Python 스크립트가 귀하의 요구 사항에 충분하다면 솔루션은 간단합니다.pdfrw 라이브러리.

간단한 작업 예:

#!/bin/python

import pdfrw

# Read the example pdf file originating from:
# https://getsamplefiles.com/download/pdf/sample-3.pdf
reader = pdfrw.PdfReader('sample-3.pdf')

# Opening the new image file originating from:
# https://www.picserver.org/assets/library/2020-10-31/originals/example1.jpg
with open('example1.jpg', 'rb') as f:
    # Overwriting the desired image in the original pdf structure.
    reader.Root.Pages.Kids[0].Resources.XObject['/X9'].stream = f.read().decode('latin')

# Write the modified pdf file out.
pdfrw.PdfWriter('sample-3_out.pdf', trailer=reader).write()

사용된 샘플 파일은 다음과 같습니다.여기(pdf), 그리고여기(.jpg).

PDF 구조에서 올바른 이미지 요소를 찾는 것은 약간 까다로울 수 있지만 PDF 구조를 검사하는 데 매우 유용한 도구인PDF 분석기.

다음과 같이 트리 보기의 경우 -t 플래그와 함께 pdfalyze를 사용하고 리치 트리 보기의 경우 -r 플래그와 함께 사용하십시오.

pdfalyze --maximize-width -r sample-3.pdf | less -R

내가 아는 한, /Filter /DCTDecode구조의 pdf는 jpg 이미지 데이터를 나타내고 /Filter /FlateDecodegzip 압축 데이터를 나타냅니다. 데이터 스트림에는 여러 개의 필터가 있을 수 있으며 필터 수는 이 두 개보다 훨씬 많습니다.

PDF 구조에 대한 추가 정보.

답변3

좀 더 명확하게 설명하자면, 많은 수의 .pdf 파일과 그 중 일부에서 교체해야 하는 이미지 이름 목록이 있지만 각 이미지를 열지 않고도 교체해야 하는 각 이미지를 빠르게 찾을 수 있는 방법이 필요합니까? .pdf 파일입니다. PDF 파일이 디렉토리에 있나요?

제가 귀하의 상황에 처해 있고 코드 기반 솔루션을 찾고 개발하는 데 충분한 시간을 할애할 수 없다면 Inkscape에서 일괄 처리를 시도해 볼 것입니다. 상상을 초월하는 일이지만...

  1. 사용 중인 모든 PDF 파일을 복사하세요.
  2. Inkscape에서 PDF를 열고 Transform/Scale 명령을 사용하여 크기를 줄입니다(파일 크기도 줄입니다). PDF 페이지를 얼마나 작게 만들고 이미지를 인식할 수 있는지 테스트해 보세요.
  3. 배치 명령을 사용하여 복사된 디렉터리에 있는 모든 PDF의 파일 크기를 변환/크기 조정합니다. 또한 일괄 처리를 사용하여 일종의 이미지 최적화 또는 기타 처리를 활성화하여 각 파일의 크기를 줄일 수도 있습니다.
  4. Inkscape에서 한 번에 20개 정도의 이미지를 열고(끌어서 놓기?) 교체해야 할 이미지를 시각적으로 검색하세요.
  5. Inkscape에서 PDF를 클릭하면 파일 이름을 얻거나 쌓인 순서에 따라 파일 이름을 확인한 다음 원본 이미지를 열고 바꿀 수 있습니다.

최악의 경우, 힘든 일 = 팟캐스트 시간입니다.

관련 정보