Ghostscriptを実行した後、PDFのすべての単語に余分な空白が含まれる


10

このPDFは、Abbyy Finereader 10によって作成されました。

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

最初の文をコピーして貼り付けると、次の(非常に良い)テキスト結果が得られます。

Der»Bund Deutscher Gymnastik-Schulleiter«wurde am 20. November 1955 1955年11月ライスリンネンとライターデルプライベートドゥイッチェンジムナスティクアウスビルドゥングシュテッテンゲグリュンデット。

Ghostscript 9.02(64ビットWindows)で処理した後、次のファイルを取得します。

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

最初の文は奇妙に見えます-各単語の最後の文字の前に余分なスペースがあります。

Der»Bun d Deutsche r GymnastikSchulleiter«wurd eam 20。Novembe r 195 5anläßlich eine r Zusammenkunf t der Leiterinne n un d Leite r de r private n deutsche nGymnastikAusbildungsstättengegründet。

これには、Acrobat Readerで単語全体を検索できないという主な悪影響があります。Ghostscriptの次の最小限のパラメーターセットで効果を再現できます。

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

何か案は?


@Erwin Jurschitza:from_abbyy.pdfファイルのリンクをしばらく維持して、数か月後にも取得できるようにしますか?
カートファイフル

@pipitas:問題ありません。AmazonS3にあります。

回答:


8

私はこれを興味深い問題だと考え、詳しく調べました...

最初に、qpdfコマンドラインツールを使用してPDFデータストリームを解凍し、両方のファイルのソースコードをより見やすくしました。

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

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

余分なスペースが挿入される最初の出現の1つ(元の文字列"Bund Deutscher Gymnastik-Schulleiter""Bun d Deutsche r GymnastikSchulleiter"に変わる)を見ると、次の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のバグジラ[*]に送信して、問題の解決に関心があるかどうかを確認します。

ただし、Linux Acrobat Reader 9.4.2を使用し、メニューの[ファイル ] -> [テキストとして保存... ]を使用した場合、この問題は発生しません。この場合、追加のスペースはありません(ただし、いくつかの余分な改行があります)。Linuxでも、テキストは正しく検索できず、コピーアンドペーストを実行すると余分なスペースが表示されます....


[*]完了したら、ここでバグ番号を更新します。


更新:

置き換えられたTm演算子についてもう少し考えた結果、これが問題の根本ではないはずです。

それを実現するとき、私はv9.02ではなくGhostscript v8.71で変換を試みました。そして、私は何を言うべきですか?コピー&ペーストの問題は、v8.71出力では発生しません。

つまり、Ghostscript 9.02には8.71にはなかった問題があります。ほとんどの場合、出力PDFに埋め込まれたフォントメトリックに関係しています。上記の引用PDFスニペットはv8.71出力でもv9.02出力と同じなので...

アップデート2:

Ghostscriptのバグジラのバグエントリの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

これで、上記の文字列を簡単に見つけることができます(各ファイルに出現するのは1つだけです)。

これをテキストレンダリングの表示モードのいずれかに切り替えましょう。全体として、次の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からのテキストは、下にあるスキャン画像の上におそらくあまりよく見えません。したがって、私は「ストローク」バリアントを好みます。だから私は単に上の行を変更して読みます

 1 Tr

この変更されたPDFを見ると、デフォルトの線幅が私の好みには太すぎるので、私はそれが好きではありません。また、アウトラインストロークの色は黒(デフォルト)です。最初にスキャンされた形状とのコントラストを付けるために、赤を好みます。したがって、この行の前にコードを追加して、線幅を4分の1ポイントに設定します。

 .25 w

ストロークの色を赤に設定するその他の方法:

 1 0 0 RG

完全な行は次のようになります。

 .25 w 1 0 0 RG 1 Tr

それで全部です。

"TOC"(技術用語ではそのxrefテーブル)が有効ではなくなったため、少し操作するとファイルが破損したことに注意してください。それでも、Acrobat ReaderまたはAcrobat Professionalはそれを開き(不平を言わずに)、ファイルの外部参照セクションを黙って「修復」します。他のPDFビューアはファイルを拒否する可能性がありますが、現時点では気にしません...

結果のウィンドウ幅にズーム スクリーンショットは次の とおりです (最初のスクリーンショットはウィンドウの幅にズームされています)800%に拡大 (2番目のスクリーンショットは800%にズームされています)。

赤いアウトラインは、スキャンしたテキストが希望どおりに表示されるようになりました。

from_abbyy.pdfafter_ghostscript.pdfの両方のファイルに対して、上記と同じ手順を実行しました。両方の結果をAcrobat Readerの2つの異なるインスタンスで開きました。両方を同じ値にズームして両方のウィンドウを最大化すると、両方のファイル間でビューを簡単に切り替えることができます[alt]+[tab]。これは、2つのPDFファイル間の最も細かいレンダリングの違いを明らかにするための良い方法です。

私の結果は次のとおりです。このファイルのGhostscript(v9.02)の入力とその出力の間には、1つのピクセルでも違いはありません。しかし、テキストをコピーアンドペーストしたい場合は、かなり違いがあります...


1

説明されている問題が表示されません。Acrobat Professional 9.0で「後」のPDFファイルを開いたところ、テキストが正しくコピーおよび貼り付けられました。

GhostscriptはPDFファイルを完全に解釈し、解釈した内容に基づいて新しいPDFファイルを作成します。テキストの位置を記録すること以外、元のファイルとは関係ありません。

PDFの豊富な機能セットにより、複数の異なる方法を使用して、文字を同じ場所に配置することが可能です。したがって、GSがPDFファイルを生成する方法自体には、何の問題も予想外の問題もありません。

テキストを正しく保存できることを考えると、これは、Acrobatのヒューリスティックが、連続するASCIIとして処理されるときに、2つの「近接」文字が隣接するか、間にスペースがあるかどうかを判断する問題です。

フォントが埋め込まれていないという単純な理由で、問題が埋め込みフォントのメトリックであるとは思わない:-)使用されているフォントは、ドキュメントに埋め込まれていないHelveticaなので、Acrobat(少なくとも私にとっては) ArialMTを使用します。「元の」PDFファイルにもフォントが含まれていないことに注意してください。

最終的には報告されたバグを確認しますが、すぐには見当たらず、それについて私たちができる(またはできる)ことはないと思います。これはヒューリスティックの必然的な結果であるように思えます。それは可能性があるもののフォントを埋め込むので、少なくとも、彼らは一致するであろうことを、助けます。


@ user701996:興味深い-Acrobat Pro 9.0で問題はありませんか?私のAcrobat Reader X(10.0.1、Windows)に問題があります。

@ user701996:Acrobat Professional 9.4.4でファイルを開きました。後のファイルのコピーと貼り付けが機能しません。テキストとして保存...しかし動作します...
カートファイフル

@ user701996:フォントが埋め込まれていない場合でも、フォントメトリックです。うーん、フォントが 'Base 14'の1つでない限り....したがって、この場合は正しいかもしれません。よく見てみます。
カートファイフル

@ user701996:あなたはあなたがGhostscriptの仲間の1人であるように聞こえます。あなたは?
カートファイフル

1

次のGhostscriptバグレポートから:

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


これで問題を再現できました。8.71からの回帰ではなく、その進行(およびAdobeの変更)です。

8.71には、無効なToUnicode CMapを書き込むバグが含まれています。紛らわしく矛盾するアドビのドキュメントにより、CMapはCMapとして記述されましたが、実際には、ToUnicode CMapには独自の互換性のないルールがあります。

ToUnicode CMapは通常、検索とコピー/貼り付けにのみ使用されます。名前が示すように、文字コードをUnicodeコードポイントにマップするために使用されます。8.71 PDFファイルのToUnicode CMapは無効です。それ以降のバージョンのToMapは有効であり、Acrobatがそれを使用することがわかっているため、使用されていません。

9.2までのAcrobat Readerでは、ToUnicodeデータが存在しても違いはないようです。9.2以降のある時点で、検索メカニズムが変更され、AcrobatはToUnicode CMapが存在するかどうかに応じて2つの異なるメカニズムを使用するように見えます。9.2以降のAcrobat Proにアクセスできず、最近Reader Xをインストールしただけで、間に何もありません。

'no Unicode'メソッドはすべてのバージョンのAcrobatで機能し、 'Unicode'メソッドは新しいバージョンでは失敗します。

私は、FontDescriptorからToUnicode CMapへの参照を空白で区切ってこれを示しました。必要に応じて、さまざまなファイルを使用可能にすることもできますが、解凍されるため、ファイルは大きくなります。

PDFでの検索はヒューリスティックな作業であるため、結果を保証することはできません。動作の変更はGhostscriptではなくAcrobatによるものであり、Ghostscriptの変更は実際のバグを修正するためのものであり、回帰ではなく進行でした。


0

この問題がフォントの「埋め込み性」に関連しているかどうかを確認するために、Linuxで別の変換を行いました。使用したフォントをGhostscriptに埋め込むために、次のコマンドラインを使用しました。

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

Ghostscriptはこの出力を表示します:

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がArialMTを使用してHelveticaを置き換える必要がなくなったという事実にもかかわらず。Readerは、埋め込まれているNimbusSanL / Helvetica-cloneを使用するようになりました。

これまでに、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へのGhostscriptのある種の(おそらくマイナーな)退行のように見えます。

次に、「クリティカル」PDFを使用して他のPDFビューアソフトウェアを試してみましょう。

  • Linux上のWine内のAdobe Reader X:copy'n'pasteはv9.4.4と同じようにb0rkenです。
  • Linux上のEvince v2.32.2:コピーアンドペーストが機能します。
  • Windows XP上のPDFXChange Viewer 2.5(ビルド191)教授:コピーと貼り付けが機能します。
  • Linux上のMuPDFリーダー0.8:コピーと貼り付けの方法はわかりませんが、「検索」は問題なく動作します。
  • s.thが見つかりました。Linuxでは「PDF Viewer 0.1.7」と呼ばれ、コピーアンドペーストが機能します。
  • Linux上のWine内のSumatraPDF v1.5:コピーアンドペーストが機能します。
  • Windows XP上のSumatraPDF v1.5.1:コピーアンドペーストが機能します。
  • Windows XP上のFoxitReader 4.3.1.0113:コピーアンドペーストが機能します。
  • Linux上のWine内のNitro PDFリーダー:コピーアンドペーストが機能します。

まだ他にもありますが、私の評決がコピーアンドペーストであったすべての「機能している」PDFリーダーの間には非常に小さな違いがあります。ダッシュが足りない、単語の間にスペースが2つあるなどの理由で、現在のところ理由はわかりませんが、Adobe製品間に大きなギャップがあるのはおそらく同じ根本原因です。 (このファイルには作業コピーと貼り付けがありません)もう1つは「残りの世界」でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.