Ghostscript를 통해 실행 한 후 PDF에 모든 단어에 추가 공백이 있습니다.


10

이 PDF는 Abbyy Finereader 10에 의해 제작되었습니다 :

http://ebooks.zeitr.org/from_abbyy.pdf

첫 번째 문장을 복사하여 붙여 넣으면 다음과 같은 텍스트 결과를 얻을 수 있습니다.

Der»Bund Deutscher Gymnastik-Schulleiter«는 1955.

Ghostscript 9.02 (64 비트 Windows)로 처리 한 후이 파일을 얻습니다.

http://ebooks.zeitr.org/after_ghostscript.pdf

이제 첫 번째 문장이 이상하게 보입니다-각 단어의 마지막 문자 앞에 여분의 공간이 있습니다.

Der»Bun d Deutsche r GymnastikSchulleiter«wurd eam 20. Novembe r 195 5 기타 건강 및 건강 관리 Leiterinne n un d Leite r de r private n deutsche n GymnastikAusbildungsstätte n gegründet.

이것은 Acrobat Reader에서 전체 단어를 검색 할 수없는 주요 부정적인 영향을 미칩니다. Ghostscript에 대해 다음과 같은 최소 매개 변수 세트를 사용하여 효과를 재현 할 수 있습니다.

-sDEVICE=pdfwrite ^
-dBATCH ^
-dNOPAUSE ^
-sstdout="myStdOut" ^
-sOutputFile="myDestFile.pdf" ^
 mySourceFile.pdf

어떤 아이디어?


@Erwin Jurschitza : from_abbyy.pdf 파일 의 링크를 잠시 동안 유지하여 몇 개월 후에도 검색 할 수 있습니까?
커트 파이 플

@pipitas : 문제 없습니다. Amazon S3에 있습니다.

답변:


8

나는이 흥미로운 문제를 발견하고 자세히 살펴 보았습니다 ...

먼저 qpdf명령 줄 도구를 사용하여 PDF 데이터 스트림을 압축 해제하여 두 파일의 소스 코드를 더 잘 볼 수있었습니다.

qpdf.exe ^
   --qdf ^
     from_abbyy.pdf ^
     qdf--from_abbyy.pdf

qpdf.exe ^
   --qdf ^
     after_ghostscript.pdf ^
     qdf--after_ghostscript.pdf

여분의 공간이 삽입되는 첫 번째 발생 중 하나를보고 (원래 문자열 "Bund Deutscher Gymnastik-Schulleiter"가 "Bund d Deutsche r GymnastikSchulleiter" string ) 다음 PDF 스 니펫을 찾습니다.

qdf--from_abbyy.pdf에서 :

( Deutsche) Tj
0 Tc
(r) Tj
1 0 0 1 143.236 265.140 Tm     %% Tm = 'text matrix' operator
3.569 Tw
0.706 Tc
( Gymnastik-Schulleite) Tj

qdf--after_ghostscript.pdf에서 :

( Deutsche)Tj
0 Tc
36.235 0 Td                    %% extra Td = 'move text current point' operator
(r)Tj
2.16501 0 Td                   %% Td = 'move text current point' instead of Tm
3.569 Tw
0.706 Tc
( Gymnastik-Schulleite)Tj

여기에 사용 된 PDF 그래픽 연산자가 무엇을 의미하는지 간략하게 설명하기 위해 다음은 간단한 목록입니다.

Tj - show text
Tc - set character spacing
Tm - set text matrix
Tw - set word spacing
Td - move text current point

보시다시피, Ghostscript는 원래 Tm( 텍스트 매트릭스 ) 연산자를 Td( 텍스트를 현재 위치로 이동 ) 연산자 로 바꾸었고 추가로 추가했습니다 2.16501 0 Td...이 이유를 모르겠습니다. 버그 스크립트를 Ghostscript의 bugzilla [*]에 제출하여 문제 해결에 관심이 있는지 확인하겠습니다.

그러나 Linux Acrobat Reader 9.4.2를 사용하고 "파일-> 텍스트로 저장 ..." 메뉴 작업을 사용하면이 문제가 발생하지 않습니다 . 이 경우 추가 공백은 없지만 몇 개의 추가 줄 바꿈이 있습니다. Linux에서도 텍스트를 올바르게 검색 할 수 없으며 copy'n'paste ...를 수행 할 때 추가 공백이 표시됩니다 .


[*] 이 작업을 마치면 버그 번호로 업데이트하겠습니다.


최신 정보:

교체 된 Tm연산자 에 대해 조금 더 숙고 한 후에 는 이것이 문제의 근본이 아니어야한다고 생각합니다.

그것을 깨달았을 때 v9.02 대신 Ghostscript v8.71로 변환하려고했습니다. 그리고 나는 무엇을 말해야합니까? v8.71 출력에서는 복사하여 붙여 넣기 문제가 발생하지 않습니다!

이는 Ghostscript 9.02에 8.71에없는 문제가 있음을 의미합니다. 출력 PDF에 포함 된 글꼴 메트릭과 관련이있을 가능성이 높습니다. 위에서 인용 한 PDF 스 니펫은 v9.02 출력과 v8.71 출력에서 ​​동일하기 때문에 ...

업데이트 2 :

Ghostscript의 bugzilla에있는 버그 입력 URL :

업데이트 3 :

이 버그는 수정 된 것으로 보입니다. 현재 Git (v9.10GIT) 또는 Ghostscript v9.06으로 다시 테스트 한 Ghostscript 버전에서는 발생하지 않습니다.


@pipitas : 이것을 분석해 주셔서 감사합니다!

5

텍스트가있는 페이지를 PDF로 스캔하고 OCR 응용 프로그램을 실행하면 텍스트가 페이지에 추가되지만 "텍스트 렌더링 모드"는 보이지 않게 설정됩니다. 거기에 있지만 화면 (또는 인쇄 된 경우 용지)에 렌더링되지 않습니다. 보거나 인쇄하는 것은 원본 스캔 이미지입니다.

보이지 않는 텍스트를 어떻게 보이게 할 수 있습니까?

글쎄, 우리는 PDF를 편집 할 수 있습니다 ... 텍스트 렌더링을 보이지 않게 설정하는 PDF 코드는 다음과 같습니다.

3 Tr

원래이 문자열을 (아직) 찾을 수 없습니다 from_abbyy.pdf 도에 from_ghostscript.pdf PDF 파일의 일부가 압축되어 있기 때문이다. 따라서 우리는 가능한 한 다음을 통해 압축을 해제합니다 qpdf.

qpdf \
 --qdf \
   from_abbyy.pdf \
   qdf--from_abbyy.pdf

qpdf \
 --qdf \
   after_ghostscript.pdf \
   qdf--after_ghostscript.pdf

이제 위의 문자열을 쉽게 찾을 수 있습니다 (각 파일에는 한 번만 나타납니다).

이것을 텍스트 렌더링의 보이는 모드 중 하나로 전환합시다. 전체적으로 다음 8 가지 텍스트 렌더링 모드 중에서 선택할 수 있습니다.

 0 -  fill glyph shapes
 1 -  stroke glyph shapes
 2 -  fill, then stroke glyph shapes
 3 -  neither fill nor stroke glyph shapes (invisible)
 4 -  fill and add to path for clipping glyph shapes
 5 -  stroke glyph shapes and add to path for clipping
 6 -  fill, then stroke glyph shapes and add path for clipping
 7 -  add glyph shapes to path for clipping

"채우기"모드를 사용하는 경우 OCR의 텍스트가 기본 스캔 이미지 위에 제대로 표시되지 않을 수 있습니다. 따라서 "stroke"변형을 선호합니다. 그래서 단순히 위의 행을 변경하여 읽습니다.

 1 Tr

이 수정 된 PDF를 보면 기본 선폭이 너무 두껍기 때문에 마음에 들지 않습니다. 또한 윤곽 선의 색상은 검은 색입니다 (기본값). 원래 스캔 한 모양과 대조를 이루기 위해 빨간색을 선호합니다. 따라서 선 너비를 점의 1/4로 설정하는이 코드 앞에 코드를 추가합니다.

 .25 w

획 색상을 빨간색으로 설정하는 다른 것 :

 1 0 0 RG

이제 전체 줄을 읽습니다.

 .25 w 1 0 0 RG 1 Tr

그게 다야.

주, 우리의 작은 조작 파일을 손상했다고, (기술적 인 용어로 : 자사의 "TOC"때문에 xref테이블)는 이제 더 이상 유효하지 않습니다. 그럼에도 불구하고 Acrobat Reader 또는 Acrobat Professional은 여전히 ​​파일을 열어 (심지어 불평하지 않고) 파일의 외부 참조 섹션을 자동으로 "수리"합니다. 다른 PDF 뷰어는 파일을 거부 할 수 있지만 현재로서는 신경 쓰지 않습니다.

결과의 스크린 샷은 다음과 같습니다. 창 너비로 확대 (첫 번째 스크린 샷은 창 너비로 확대됩니다.) 800 %로 확대 (두 번째 스크린 샷은 800 %로 확대되었습니다.)

빨간색 외곽선은 스캔 한 텍스트가 원하는대로 표시됩니다.

from_abbyy.pdfafter_ghostscript.pdf 파일 모두에 대해 위에서 설명한 것과 동일한 절차를 수행했습니다 . Acrobat Reader의 두 가지 다른 인스턴스에서 두 결과를 모두 열었습니다. 둘 다 같은 값으로 확대하고 두 창을 모두 최대화하면을 통해 두 파일간에보기를 쉽게 전환 할 수 있습니다 [alt]+[tab]. 이는 두 PDF 파일 간의 렌더링 차이를 가장 잘 표현할 수있는 좋은 방법입니다.

내 결과는 : Ghostscript (v9.02) 입력 과이 파일의 출력 사이에 다른 단일 픽셀조차 없습니다. 그러나 텍스트를 복사하여 붙여 넣기를 원한다면 상당한 차이가 있습니다 ...


1

설명 된 문제가 보이지 않습니다. Acrobat Professional 9.0에서 'after'PDF 파일을 열었으며 텍스트가 올바르게 복사 및 붙여 넣기되었습니다.

Ghostscript는 PDF 파일을 완전히 해석하고 해석 한 내용을 기반으로 새 PDF 파일을 생성하며 텍스트의 위치를 ​​기록하는 것 외에는 원본 파일과 아무 관련이 없습니다.

다양한 PDF 기능 세트로 인해 여러 가지 다른 방법을 사용하여 문자를 동일한 위치에 배치 할 수 있습니다. 따라서 GS가 PDF 파일을 생성하는 방식에는 그 자체로 잘못되거나 예상치 못한 것이 없습니다.

텍스트를 올바르게 저장할 수 있다고 가정하면 이는 연속적인 ASCII로 처리 될 때 두 개의 '가까운'문자가 인접하거나 사이에 공백이 있는지 여부를 결정하는 Acrobat 휴리스틱의 문제입니다.

글꼴이 포함되지 않은 간단한 이유 때문에 문제가 포함 된 글꼴 메트릭이 될 수 있다고 생각하지 않습니다 .-) 사용되는 글꼴은 Helvetica이며 문서에 포함되어 있지 않습니다. ArialMT를 사용합니다. '원본'PDF 파일에도 글꼴이 포함되어 있지 않습니다.

결국보고 된 버그를 살펴볼 것이지만, 머지 않아 곧 우리가 할 수있는 일 (또는 할 수있는 일)이 있는지 의심됩니다. 이것이 휴리스틱의 필연적 결과 인 것 같습니다. 그것은 수도 있지만 글꼴을 포함에 너무 적어도 그들은 일관성이 될 것이라고, 도움이됩니다.


@ user701996 : 흥미 롭습니다-Acrobat Pro 9.0에 문제가 없습니까? Acrobat Reader X (10.0.1, Windows)에 문제가 있습니다.

@ user701996 : Acrobat Professional 9.4.4에서 파일을 열었습니다. 이후 파일의 붙여 넣기 붙여 넣기가 작동하지 않습니다. 저장 텍스트로 ... 그러나 .... 작업을 수행
커트 Pfeifle에게

@ user701996 : 글꼴이 포함되지 않은 경우에도 글꼴 메트릭 입니다. 음, 폰트가 'Base 14'중 하나가 아니면 ...이 경우에 맞을 것입니다. 좀 더 자세히 살펴 보겠습니다.
Kurt Pfeifle

@ user701996 : 당신은 당신이 Ghostscript 사람들 중 하나 인 것처럼 들립니다. 당신은?
커트 파이 플

1

다음의 Ghostscript 버그 보고서에서 :

http://bugs.ghostscript.com/show_bug.cgi?id=692206


나는 이제 그 문제를 재현 할 수 있었고, 8.71의 회귀가 아니며, 그 진보 (그리고 Adobe 변화)이다.

8.71은 잘못된 ToUnicode CMap을 작성하게하는 버그와 함께 제공되었습니다. 잘못 이해되고 모순되는 Adobe 설명서는 실제로 ToUnicode CMap에 고유하고 호환되지 않는 규칙이있는 경우 CMap을 CMap으로 작성했습니다.

ToUnicode CMap은 일반적으로 검색 및 복사 / 붙여 넣기에만 사용됩니다. 이름에서 알 수 있듯이 문자 코드를 유니 코드 코드 포인트에 매핑하는 데 사용됩니다. 8.71 PDF 파일의 ToUnicode CMap은 유효하지 않으며 이후 버전의 ToUnicode CMap은 유효하며 Acrobat은이를 사용하는 것으로 알려져 있습니다.

Acrobat Reader에서는 9.2 이하까지 ToUnicode 데이터가 존재해도 차이가 없습니다. 9.2 이후 어떤 시점에서 검색 메커니즘이 변경되고 Acrobat은 ToUnicode CMap의 존재 여부에 따라 두 가지 다른 메커니즘을 사용하는 것으로 보입니다. 9.2 이후에는 Acrobat Pro에 액세스 할 수없고 최근에 Reader X 만 설치했는데 그 사이에는 아무 것도 없습니다.

'유니 코드 없음'방법은 모든 버전의 Acrobat에서 작동하며 '유니 코드'방법은 최신 버전에서는 실패합니다.

FontDescriptor에서 ToUnicode CMap에 대한 참조를 흰색으로 띄워서 이것을 보여주었습니다. 필요한 경우 다양한 파일을 사용할 수 있지만 압축이 풀리면 크기가 큽니다.

검색은 PDF에서 발견적인 노력이므로 결과를 보장 할 수는 없습니다. 동작 변경은 Ghostscript가 아닌 Acrobat으로 인한 것이며 Ghostscript의 변경은 실제 버그를 수정하여 회귀가 아닌 진행을 수정하는 것이 었습니다.


0

이 문제가 글꼴의 '내장'에 연결되어 있는지 여부를 확인하기 위해 Linux에서 다른 변환을 수행했습니다. Ghostscript에 사용 된 글꼴을 포함시키기 위해이 명령 줄을 사용했습니다.

gs \
 -o after_ghostscriptonlinux.pdf \
 -sDEVICE=pdfwrite \
 -dPDFSETTINGS=/prepress \
 -sEmbedAllFonts=true \
  from_abbyy.pdf

고스트 스크립트는이 결과를 보여줍니다 :

GPL Ghostscript SVN PRE-RELEASE 9.02 (2011-02-07)
Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Loading NimbusSanL-Regu font from %rom%Resource/Font/NimbusSanL-Regu... 2776276 1420923 2081124 778943 3 done.
Loading NimbusSanL-ReguItal font from %rom%Resource/Font/NimbusSanL-ReguItal... 2853416 1529123 2137980 831640 3 done.
Loading NimbusSanL-Bold font from %rom%Resource/Font/NimbusSanL-Bold... 2970748 1643508 2194836 886454 3 done.

Ghostscript에는 NimbusSanL 이라는 글꼴 패밀리의 글꼴이 포함되어 있습니다. 따라서 누락 된 Helvetica를 대신하여 Acrobat Reader에서 화면에 렌더링하는 데 사용 된 ArialMT 는 더 이상 없습니다 (위의 user701996의 주석 참조). Ghostscript는 포함 된 즉시 해당 글꼴의 이름을 Helvetica로 바꿉니다. 그러나 NimbusSanL은 Helvetica의 복제본으로 만들어 졌기 때문에 문제가되지 않습니다 ...

그러나이 출력 PDF의 경우에도 Acrobat Reader에서 복사하여 붙여 넣기가 제대로 작동하지 않습니다. Reader가 Helvetica를 대체하기 위해 더 이상 ArialMT를 사용할 필요가 없다는 사실에도 불구하고. Reader는 이제 내장 된 NimbusSanL / Helvetica 클론을 사용합니다.

지금까지 Acrobat Reader 또는 Acrobat Professional에서 텍스트를 복사하여 붙여 넣기하는 방법에 대한 다음 사실을 확인했습니다.

  • Ghostscript v9.02의 출력 이이 파일에 충분 하지 않습니다 .
  • GS에 글꼴이 포함되어 있는지 아닌지에 대한 경우입니다.
  • Windows XP의 GS와 Linux의 GS도 마찬가지입니다.

  • Ghostscript v8.71의 출력은 이 파일에 적합합니다.

  • GS에 글꼴이 포함되어 있는지 아닌지에 대한 경우입니다.
  • Windows XP의 GS와 Linux의 GS도 마찬가지입니다.

  • 복사하여 붙여 넣기가 중단 된 출력의 경우에도 텍스트로 저장 ... 이 수행됩니다.

나는 이것이 왜 그런지 이해하지 못합니다. 그러나 그것은 v8.71에서 9.02로가는 길에 고스트 스크립트의 일종의 (일부 사소한) 회귀처럼 보입니다.

이제 '핵심'PDF로 다른 PDF 뷰어 소프트웨어를 사용해 보겠습니다.

  • Linux의 Wine에 포함 된 Adobe Reader X : copy'n'paste는 v9.4.4와 같은 방식으로 손상되었습니다.
  • Linux에서 v2.32.2를 확인하십시오. 복사하여 붙여 넣기가 작동합니다.
  • Windows XP Prof의 PDFXChange Viewer 2.5 (빌드 191) : 복사하여 붙여 넣기가 작동합니다.
  • Linux의 MuPDF Reader 0.8 : 복사하여 붙여 넣기 방법을 모르지만 '검색'은 완벽하게 작동합니다.
  • s.th를 찾았습니다. Linux에서 "PDF Viewer 0.1.7"이라고 함 : 복사하여 붙여 넣기가 작동합니다.
  • Linux의 Wine에 포함 된 SumatraPDF v1.5 : copy'n'paste가 작동합니다.
  • Windows XP의 SumatraPDF v1.5.1 : 복사하여 붙여 넣기가 작동합니다.
  • Windows XP의 FoxitReader 4.3.1.0113 : 복사하여 붙여 넣기가 작동합니다.
  • Linux의 Wine에있는 Nitro PDF Reader : copy'n'paste가 작동합니다.

내 평결이 copy'n'paste works 인 모든 '작동하는'PDF 리더 간에는 여전히 다른 차이가 있지만 약간의 차이가 있습니다 . 여기에 누락 된 대시 또는 단어 사이에 두 배의 공백이 있고 다른 것들이 있습니다. 나는 이것이 왜 그런지 설명 할 수는 없지만 어도비 제품들 사이에 큰 차이가있는 이유와 같은 근본 원인 일 것입니다 (이 파일에 대한 작업 사본을 붙여 넣지 않은) 하나는 다른 하나는 "세계의 나머지 부분"입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.