OCRテキストを含むスキャンしたPDFをOCRテキストのないスキャンPDFに変換するには?

OCRテキストを含むスキャンしたPDFをOCRテキストのないスキャンPDFに変換するには?

私は持っていますスキャンしたPDFファイル、品質の低いORテキストが含まれています。

OCRテキストのないPDFファイルが必要です。

OCR処理されたテキストを含むスキャンしたPDFをOCR処理されたテキストを含まないスキャンされたPDFに変換するには?

各ページの幅と高さをピクセル単位で変更せずに、各ページのインチあたりのピクセル数を変更せずに、OCRの前にスキャンした元のPDFファイルにできるだけ近づける方法があるかどうか疑問に思います。

どのようなラスター化が再び役に立ちますか?ラスター化すると画質が再び低下しますか?

多くの試み:

  1. 私はEvinceで印刷ファイルを使用していますが、cups-pdfOCRされたテキストは削除しません。
  2. 次のコマンドを使用してもgsOCRされたテキストは削除されません(まだ正しく使用する方法が見つからないようですgs)。

    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
       -dNOPAUSE -dQUIET -dBATCH -sOutputFile=out.pdf toc.pdf
    

答え1

これを行う必要がある場合は、次のようにOCRテキストを削除します。

まず、PDFのOCRテキストがOCRテキストではないことに注意してください。フロアしかし、特別なテキストレンダリングモード。下のスクリーンショット公式PDF仕様から利用可能なすべてのテキストレンダリングモードを一覧表示します。

詳細な背景については、StackOverflow で次の回答をご覧ください。


今私が想像するプログラムは次のとおりです。

0. オリジナルPDFファイルのバックアップ

ヌープは言った…

1.qpdfほとんどのPDFオブジェクトを解凍するために使用されます。

qpdfsedほとんどのPDFをテキストエディタ(または以下を介して)で操作しやすい形式に変換する素晴らしいコマンドラインツールです。

qpdf                       \
  --qdf                    \
  --object-streams=disable \
    input.pdf              \
    editable.pdf

2. PDFコードに含まれる場所を検索してください3 Tr

「見えない」場所editable.pdf(別名。パディングも愛撫でもない) 初期定義で表示されるテキスト

3 Tr

今読めるように変更してください。

1 Tr

これにより、以前に隠されたテキストが表示されます。文字の外観は、スキャンした元のページ画像の上に太い輪郭で表示されます。

とても醜いようです。

編集したPDFを保存します。

3. ストローク演算子Tjとテキストを「no-ops」に変更します。TJ

テキスト文字列をレンダリングする準備ができたときはいつでも、これを実行する実際の演算子の名前はまたはTjですTJ

それらすべてに注意を払う。tJとに置き換えてくださいtj。これは「no-op」に変更されます。 PDFソースコードではまったく意味がなく、PDFビューアやプロセッサもこれを「理解」することはできません。 (PDFソースコードの内容を置き換えるときは、バイト数を変更しないように注意してください。これが「破損」する可能性があります。)

PDFファイルを保存します。

4. 今PDFファイルがどのように見えるかを確認してください

これでPDFは再び「きれいに」見えます。名前が変更されたテキスト演算子は、もはやPDFビューアやPDFソルバーには意味がありません。

5. Ghostscriptを使用して最終PDFを作成する

このコマンドを使用すると、目的の結果を得ることができます。

gs                        \
  -o final.pdf            \
  -sDEVICE=pdfwrite       \
  -dPDFSETTINGS=/prepress \
   editable.pdf

最後のステップがeditable.pdf入力として使用されます。出力final.pdfはテキストのすべての痕跡を削除します。スチール入力持つ演算子の名前が変更されたため、「使用できない」形式ですが、テキストです。 Ghostscript は名前が変更された演算子を「理解する」ことができないため、デフォルトではその演算子をスキップします。

答え2

ファイルからORされたテキストを削除する方法はいくつかあります。

  1. PDFからスキャンした画像をエクスポートして再結合します。pdfimages(パッケージから)を使用してそれらを抽出しpoppler-utilsconvertから)imagemagick再変換できます。

    pdfimages toc.pdf toctmp
    convert toctmp*.pbm newtoc.pdf
    
  2. PDFで印刷(PDF対応cups-pdf

PDFは画像スキャンには適していませんが、1つのファイルに複数のページを含めることができるため、よく使用されます。ただし、保存形式は通常JPEG(スキャン用)には適していません。スキャンした画像からPDFを作成するのは通常、スキャン後の品質を低下させるステップなので、PDF(スキャンした元のPDFファイルがない場合)から元の画像を復元することは不可能です。pdfimagePDFで画像を使用またはインポートしようとすることができますが、pdftoppmPDFの画像を処理するOCRソフトウェアはすでにそのPDFから最高品質の画像を取得する方法を知っているため、これを改善するために何もする可能性はありません。

問題は、OCRソフトウェアではなくスキャンソフトウェアにある可能性があります。元の素材がまだ残っている場合は、別のコピーを複数ページのTIFF(lzw圧縮)でスキャンすると、JPEGを含むPDFに変換されたものよりも優れたOCRを提供できます。

答え3

接続しようとするとサンプルスキャンファイルへのリンク以前は私にはうまくいきませんでした。しかし、その間私はそれをダウンロードして詳細に見ました。

1.pdfimages -list埋め込みイメージ研究のため

Popplerバリアントの最新(!)バージョンを実行すると、パラメータを使用pdfimagesできます。-listこのパラメータは、PDFファイルに含まれている便利な画像のリストを印刷します。これ最大最新バージョンでは、以前は使用できなかったいくつかの追加情報(画像の解像度や圧縮率など)も提供されています。

残念ながら、PDFファイルには、出力が歪んでいるいくつかの構文エラーが含まれています。

kp@mbp:#175536> pdfimages -l 1 -list toc.pdf
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 Syntax Warning: Couldn't link the profiles
 Syntax Warning: Can't create transform
 page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
 --------------------------------------------------------------------------------------
    1   0 image  2000  2650  icc     1   1  jbig2  no       51 0   300   300 12.4K 1.9%

それでは<stderr>、出力を次にリダイレクトしてもう一度やり直して/dev/nullみましょう。

kp@mbp:#175536> pdfimages -list toc.pdf 2>/dev/null
page num  type width height color comp bpc  enc interp objectID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------
   1   0 image  2000  2650  icc     1   1  jbig2  no       51 0   300   300 12.4K 1.9%
   2   1 image  2012  2659  icc     1   1  jbig2  no      616 0   300   301 16.1K 2.5%
   3   2 image  2014  2661  icc     1   1  jbig2  no      696 0   301   300 16.0K 2.4%
   4   3 image  2000  2650  icc     1   1  jbig2  no      778 0   300   300 16.2K 2.5%
   5   4 image  2000  2650  icc     1   1  jbig2  no      855 0   300   300 16.2K 2.5%
   6   5 image  2000  2650  icc     1   1  jbig2  no      938 0   300   300 15.7K 2.4%
   7   6 image  2000  2650  icc     1   1  jbig2  no     1026 0   300   300 15.5K 2.4%
   8   7 image  2022  2667  icc     1   1  jbig2  no     1103 0   300   300 15.7K 2.4%
   9   8 image  2000  2650  icc     1   1  jbig2  no     1190 0   300   300 15.5K 2.4%
  10   9 image  2011  2658  icc     1   1  jbig2  no     1271 0   300   301 15.7K 2.4%
  11  10 image  2000  2650  icc     1   1  jbig2  no     1347 0   300   300 15.7K 2.4%
  12  11 image  2010  2657  icc     1   1  jbig2  no     1429 0   300   300 15.5K 2.4%
  13  12 image  2000  2650  icc     1   1  jbig2  no     1504 0   300   300 16.8K 2.6%
  14  13 image  2000  2650  icc     1   1  jbig2  no     1589 0   300   300 15.4K 2.4%
  15  14 image  2000  2650  icc     1   1  jbig2  no     1666 0   300   300 17.6K 2.7%
  16  15 image  2010  2657  icc     1   1  jbig2  no     1740 0   300   300 18.7K 2.9%
  17  16 image  2006  2654  icc     1   1  jbig2  no     1823 0   300   301 17.7K 2.7%
  18  17 image  2007  2656  icc     1   1  jbig2  no     1905 0   300   300 16.9K 2.6%
  19  18 image  2000  2650  icc     1   1  jbig2  no     1983 0   300   300 16.7K 2.6%
  20  19 image  2000  2650  icc     1   1  jbig2  no     2065 0   300   300 17.4K 2.7%
  21  20 image  2000  2650  icc     1   1  jbig2  no     2148 0   300   300 17.4K 2.7%
  22  21 image  2011  2658  icc     1   1  jbig2  no     2229 0   300   301 17.2K 2.6%
  23  22 image  2006  2654  icc     1   1  jbig2  no     2305 0   300   301 17.5K 2.7%
  24  23 image  2000  2650  icc     1   1  jbig2  no     2377 0   300   300 14.5K 2.2%

この出力は次のことを意味します。

  • 24枚の写真を含む24ページ(0~23番)(1ページあたり1枚)。
  • すべての画像のサイズ(幅/高さ)は非常に似ており、解像度は300 PPIです。
  • すべての画像は同じ圧縮方法を使用し、JBIG2

この結果、私はPDFからOCRテキストを削除するための他のアプローチを提案するという自信を得ました。

  1. すべての画像を抽出します。
  2. この画像で新しいPDFを作成します。

2. PDFからすべての画像を抽出する

最新のPopplerバージョンの1つを使用している場合は、pdfimagesJBIG2圧縮で画像を抽出できます。

pdfimages -jbig2 toc.pdf toc--

結果イメージファイルのファイル名はtoc---000.jb2e、、、toc---000.jb2e...(サフィックス.jb2e)です。これらの各ファイルには toc---000.jb2g、、、toc---000.jb2g...(サフィックス.jb2g)という名前の異なるファイルが必要です。

.jb2e画像を取得できず、代わりに.pbmJPEGを生成するためにImageMagickの変換を使用する必要がある場合:

for i in toc--*.pbm; do
  convert $i ${i/.pbm/.jpg}
done

しかし、JPEG画像はJBIG2画像よりはるかに大きい。 (試してみました:24枚の画像を含むJPEGの場合は合計15MB、PBMの場合は合計15MB、JBIG2の場合は合計436KB!)

3.抽出した画像から新しいPDFを作成します。

残念ながらJPEGに変換する必要がある場合は、PDFに変換できます。

convert toc--*.jpg -density out.pdf

望むより! 、今15MBのPDFファイルができました。いいえOCR処理されたテキスト、以前は1.6MBのPDFファイルがありました。そしてOCRテキスト! (しかし、以前の資質はあまり失われません...)


私のコードはpdfimagesソースからコンパイルされているので、時にはエラーが発生します。現時点では、画像をJBIG2ファイルに正しく抽出できません。そのため、PDFを作成することもできません。しかし、このPDFのサイズはtoc.pdf元のサイズに似ています。

答え4

高品質の多層PDFのために私が見つけた最良の方法はとinkscapeを使用することですimg2pdf。私は次のようなクイックbashスクリプトを作成しました。

#!/bin/bash
mkdir "$1_temp"
cp "$1" "$1_temp"/to_do.pdf
cd "$1_temp"
pdftk to_do.pdf burst output pg_%04d.pdf
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png
rm *.pdf
ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300 - {}.jpg
rm *.pdf
ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
rm *.jpg
pdftk *.pdf cat output combined.pdf

関連情報