PDF 파일의 코드를보고 편집하는 방법


12

PDF 파일의 코드를보고 편집하는 방법이 궁금합니다.

  1. 볼 때 바이너리 형식을보고 싶지 않으므로 원하는 것이 hexdump아닐 수도 있습니다. 시도 gedit했지만 PDF 내용을 디코딩하는 데 인코딩 방법을 사용할 수 없습니다.

  2. 편집 /Fit/XYZ통해 sed 와 같이 검색 하고 변경하고 싶습니다 . 그러나 내 명령 sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdf은 오류를보고하지는 않지만 예상대로 PDF 모양을 변경하지 않는 것 같습니다. sedPDF 파일이 일반 텍스트 인 것처럼 실제로 작업 할 수 있는지 궁금 합니다.

내 질문의 맥락은 이 질문 에서 찾을 수 있습니다 . 내 OS는 Ubuntu 10.10입니다.

답변:


9

sed이진 파일과 함께 사용할 수 있습니다 (적어도 GNU sed; 일부 구현은 null 문자를 포함하거나 개행 문자로 끝나지 않는 파일에 문제가있을 수 있음). 그러나 사용한 명령 /Fit은 각 줄 에서 처음 나타나는 항목 만 대체 하며 PDF 파일에서 줄은 거의 의미가 없습니다. 모든 발생을 교체해야합니다.

 sed s/\/Fit/\/XYZ/g

/Fit뒤에 단어 구성 요소가없는 경우 에만 대체 하는 것이 더 강력합니다 (예 : 대체 /Fitness하지 마십시오. 파일에 /Fit문제가있는 파일이 있는지 알 수 없습니다 ). 한 가지 방법이 있습니다.

perl -pe 's!/Fit\b!/XYZ!g'

감사! 이제 작동합니다! (1) 바이너리 콘텐츠에서 sed 검색 문자가 어떻게 궁금하십니까? sed는 먼저 검색하기 전에 쿼리 문자를 인코딩합니까? 마지막 명령 (2), 무엇을 !, \b그리고 g의미? sed만으로 펄없이 할 수 있습니까?
Tim

1
@Tim (1) Sed는 데이터를 메모리에로드하고 작동시킨 후 인쇄합니다. 왜 무언가를 인코딩해야합니까? (2) g는 sed와 perl 모두에서 각 행의 모든 ​​발생을 대체하는 것을 의미합니다. !분리기이고; s명령 의 구분 기호로 (거의) 모든 문자를 선택할 수 있습니다 ( sed와 perl로 진행됨). \b단어 경계를 의미하고; 펄에는 있지만 sed에는 없습니다.
Gilles 'SO- 악마 그만'

명령에서 sed에 제공하는 문자는 사람이 읽을 수 있기 때문에 (1) 정보. 검색 할 내용이 완전히 바이너리 인 경우 sed는 어떻게 쿼리 단어를 찾을 수 있습니까?
Tim

@Tim Text는 사람이 읽을 수있는 이진 데이터입니다.
Gilles 'SO- 악마 그만'

1
@Tim 예, 쿼리에서 이진 데이터를 전달할 수 있습니다. sed 또는 shell 소스 코드에 문자를 문자 그대로 삽입해야합니다.
Gilles 'SO- 악한 중지'

17

첫 번째 질문 ( "이진 코드는 보이지 않지만 소스 코드보기")과 관련하여 : 많은 객체에 첨부 된 내부 이진 스트림을 압축 해제하기위한 몇 가지 옵션이 있습니다.

내가 가장 좋아하는 도구는 모든 주요 OS 플랫폼에서 사용할 수있는 QPDF 입니다. 다음 명령은 모든 스트림과 모든 객체 스트림을 압축 해제 합니다.

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

이제 모든 텍스트 편집기에서 PDF를 열 수 있습니다. (글꼴 파일 및 ICC 프로파일과 같은 일부 바이너리 블롭이 여전히있을 수 있습니다. QPDF 확장에는 적합하지 않습니다).

재 - 압축expanded.pdf편집 한 후 다시, 당신은 실행할 수 있습니다 :

 qpdf expanded.pdf orig2.pdf

(PDF를 수동으로 편집 할 때주의하십시오!이 작업을 올바르게 수행하려면 내부 구문에 대해 많이 알아야합니다. 단일 바이트를 추가하거나 삭제하면 더 이상 PDF 리더에서 오류 메시지를받을 수 있습니다. PDF 파일 내부 TOC는 바이트 오프셋에 기초하여 계산되는, 손상 되었기 때문에, 그것을 연다. 단 교체 FitXYZ있지만, 미세 가야 문자열 ...)


1
텍스트를 추가하거나 제거 할 수도 있습니다. 객체 스트림의 길이가 변경되면 fix-qdfqpdf의 일부인 프로그램을 사용하여 바이트 오프셋을 다시 계산할 수 있습니다 . 그래도 약간 조심해야합니다. 참조 qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich에게

@ H.Rittich : 논평을위한 Thx ... 이것이 어떻게 문제에 대한 새로운 관점을 열어 주는가? 이런 식으로 텍스트를 추가하거나 제거 할 수 있다는 것을 모른다고 생각 했습니까?
Kurt Pfeifle '10

@ KursPfeifle : 나는 당신이 알고있는 것에 대해 어떤 가정도하지 않습니다. 답은 PDF를 이런 식으로 편집하면 파일 에있는 객체의 바이트 오프셋을 유지 해야 한다는 것입니다. 그러나 나중에을 사용하여 수정할 때 바이트 오프셋을 변경할 수 있습니다 fix-qdf. 따라서 문자열을 길이가 다른 문자열로 바꾸려면 가능하지만 fix-qdf도구 를 사용해야합니다 . 나는 이것이 대답에 유용한 추가 사항이라고 말합니다.
H. Rittich

@ H.Rittich : 당신의 관점을 제공합니다. 객체의 바이트 오프셋을 유지할 필요성을 강조했을 때 사람들에게 어떻게 해야하는지 조언하고 싶지 않았습니다 . 귀하의 의견을 약간 다르게 표현했다면 귀하의 의견의 의도를 더 빨리 이해했을 것입니다.
Kurt Pfeifle

1

sed행 지향적이므로 이진 파일에는 적합하지 않습니다. 이진 파일은 행이 아닌 블록으로 구성됩니다.
대신 bbe (bbe-.sourceforge.net)를 사용해보십시오.

또는 Emacs (GNU 및 XEmacs)와 vim 모두 PDF 파일을 매끄럽게 엽니 다. 텍스트와 이진이 혼합되어 있기 때문에 물론 꽤 인쇄되지는 않지만 편집 목적으로는 충분합니다.
있습니다 Pdftk에 쉽게 모든 것을 만드는 정력을위한 플러그인을 다운로드 여기 (zip 파일).
아시다시피, 위의 두 편집기 모두 강력한 검색 및 바꾸기 기능이 있습니다.

또한 PDF 파일을 QDF 모드 로 변환 하기 전에 PDF 파일을 쉽게 편집 할 수 있습니다.


스위치 를 sed사용하여 편집을 시도 할 수도 있습니다 -b. 그것이 작동하면 나는 이것을 내 대답에 추가 할 것입니다.
Philomath

@Tim : 비어있는 "아무것도 보여주지 않는다"는 무슨 뜻입니까? 오류 메시지가 있습니까? 또한 XEmacs로 시험해 볼 수 있습니까? (세 사람 모두 나를 위해 일했습니다).
Philomath

신경 쓰지 -b않아도됩니다.
Philomath

Emacs는 "파일 1.pdf가 큽니다 (9MB), 실제로 열려 있습니까? (y 또는 n)"라고 말합니다. 나는 "y"를 선택했는데 아무것도 없습니다.
Tim

아마도 Emacs 문제 일 것입니다. XEmacs가 있습니까? (방금 아무런 문제없이 31MB PDF를 열었습니다).
Philomath

0

LibreOffice 또는 OpenOffice를 사용하여 PDF를 열고,보고, 바꾸고, 새 PDF를 작성하는 등의 작업을 수행 할 수 있습니다. 처리 할 문서가 많은 경우 명령 줄에서 또는 프로그래밍 방식으로 사용할 수도 있습니다.

스캐너와 같은 일부 소스의 PDF 에는 종종 텍스트가 아닌 이미지로 페이지가 포함되므로 검색 및 바꾸기를 사용하는 것이 좋지 않을 수 있습니다.


3
(1/2) 다음 사실에 유의하십시오. LibreOffice는 기본 PDF 편집기가 아닙니다. PDF를 열면 모든 페이지를 벡터 이미지로 변환하여 (래스터 부분을 원본 PDF의 래스터 부분으로 유지할 수 있음) LibreOffice 제품군 의 LibreOffice Draw 부분 에서 엽니 다 . 그런 다음 편집 한 PDF 파일을 저장하면 기본 LibreOffice Draw 형식 (접미사가 .odg 인 )에서 PDF 로 내 보낸 PDF 파일이 됩니다.
커트 파이 플

3
(2/2)이 워크 플로에는 예기치 않은 부작용이있을 수 있습니다. 또한 LibreOffice Draw 응용 프로그램이 원본 PDF에서 모든 요소를 ​​올바르게 가져올 수 없습니다. 그러나 많은 경우에 더 나은 수단이없는 모든 사람들에게 유용한 도구가 될 수 있습니다.
커트 파이 플
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.