7

簡単に言えば、問題のある PDF を扱っています。

  • evinceフォント情報が欠落しているため、 のようなドキュメント ビューアーでは完全にレンダリングできません。
  • ただしghostscript、同じ PDF を完全にレンダリングできます。

ghostscriptしたがって、空白を埋めるために何を使用するかに関係なく(おそらくフォールバックグリフ、またはフォントにアクセスする別の方法ghostscript)、出力PDFを生成(「蒸留」)するために使用できるようにしたいと思います。追加されたフォント情報以外はevinceも変更されないため、同じドキュメントを同じ方法でレンダリングghostscriptできます。

したがって、私の質問は-これはまったく可能ですか?もしそうなら、そのようなことを達成するためのコマンドラインは何でしょうか?

ご回答ありがとうございます。
乾杯!


詳細:

私は実際には古い Ubuntu 10.04 を使用していますが、バグではなく、インストールの問題(パッケージevinceの不足) が発生している可能性があります。 ..」: バグ: 「poppler」パッケージ: Ubuntu .poppler-data

ただし、それはまさに私が扱いたいものなので、fontspec.pdfその投稿に添付されているものを使用します ( バグをトリガーする PDF」、// v. ) 。問題。

evince

まず、この pdf のページ 3 をevince;で開きます。とevince不平を言う:

$ evince --page-label=3 fontspec.pdf

Error: Missing language pack for 'Adobe-Japan1' mapping
Error: Unknown font tag 'F5.1'
Error (7597): No font in show
Error: Unknown font tag 'F5.1'
Error (7630): No font in show
Error: Unknown font tag 'F5.1'
Error (7660): No font in show
Error: Unknown font tag 'F5.1'
...

レンダリングは次のようになります。

evince-pdf-missfont-render.png

...そして、いくつかのフォント形状が欠落していることは明らかです。

アドビacroread

Adobe の Acrobat Reader for Linux の動作についてのメモです。次のコマンドライン:

$ ./Adobe/Reader9/bin/acroread /a "page=3" fontspec.pdf

...端末への出力はまったく生成されません(スイッチの詳細については、Manページ acroread/aを参照してください)-そして、プログラムはフォントを表示する上でまったく問題ありません。

また、postscript への往復を避けたいのですが、acroreadそれ自体を使用して PDF を postscript に変換できることに注意してください。

$ ./Adobe/Reader9/bin/acroread -v
9.5.1

$ ./Adobe/Reader9/bin/acroread -toPostScript \ 
-rotateAndCenter -choosePaperByPDFPageSize \
-start 3 -end 3 \
-level3 -transQuality 5 \
-optimizeForSpeed -saveVM \
fontspec.pdf ./ 

繰り返しますが、上記のコマンド ラインでは端末への出力は生成されません。-optimizeForSpeed -saveVMどうやらフォントを扱っているためです。最後の引数./は出力ディレクトリです (出力ファイルは自動的に呼び出されますfontspec.ps)。

これで、以前に欠落していたフォントを出力に表示evince できfontspec.psますが、再び不平を言います:

$ evince fontspec.ps 
GPL Ghostscript 9.02: Error: Font Renderer Plugin ( FreeType ) return code = -1
GPL Ghostscript 9.02: Error: Font Renderer Plugin ( FreeType ) return code = -1
...

...さらに、すべてのテキストはポストスクリプトの曲線に平坦化されているように見えるため、.ps ファイル内のテキストを選択することはevinceできなくなりました (.ps ファイルは では開けないことに注意してくださいacroread)。ただし、この .ps を .pdf に再度変換できます。

$ pstopdf fontspec.ps   # note, `pstopdf` has no output filename option;
                        # it will automatically choose 'fontspec.pdf',
                        # and overwrite previous 'fontspec.pdf' in 
                        # the same directory 

...そして、出力のテキストpstopdfは で選択可能になりevince、すべてのフォントがそこにあり、evinceもう文句はありません。ただし、前述のとおり、postscript ファイルへのラウンドトリップは完全に避けたいと思います。

display(からimagemagick)

imagemagicksを使用して同じドキュメント内のページを観察することもできますdisplay( 「display」を使用したコマンドラインからの画像のパンニングは明らかにまだ利用できないことに注意してください。そのため、以下を使用してビューポートを調整しました-crop)。

$ display -density 150 -crop 740x450+280+200 fontspec.pdf[2]
   **** Warning: considering '0000000000 00000 n' as a free entry.
...
   **** This file had errors that were repaired or ignored.
   **** The file was produced by: 
   **** >>>> Mac OS X 10.5.4 Quartz PDFContext <<<<
   **** Please notify the author of the software that produced this
   **** file that it does not conform to Adobe's published PDF
   **** specification.

...いくつghostscripかのっぽいエラーが生成されます-そして、次のような結果になります:

imagemagick-display-pdf.png

evince...レンダリングできなかった欠落フォントがimagemagicksdisplayで適切にここに表示されていることは明らかです。

ghostscript

最後に、ghostscript を x11 ビューアー自体として使用して、同じページ、同じドキュメントを観察できます。

$ gs -sDevice=x11 -g740x450 -r150x150 -dFirstPage=3 \
-c '<</PageOffset [-120 520]>> setpagedevice' \
-f fontspec.pdf

GPL Ghostscript 9.02 (2011-03-30)
Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
Processing pages 3 through 74.
Page 3
>>showpage, press <return> to continue<<
^C

...そして、次の出力が得られます。

Ghostscript-pdf-view.png

 

結論としてghostscript、(そして明らかに拡張によりimagemagick)は、欠落しているフォント(または少なくともそれに代わるもの)を見つけてevince、同じドキュメントで失敗したとしても、それを使用してページをレンダリングできます。

したがって、ghostscript不足しているフォントのみが埋め込まれ、他の処理が行われない PDF バージョンを からエクスポートしたいと思います。だから私はこれを試します:

$ gs -dBATCH -dNOPAUSE -dSAFER  \
-dEmbedAllFonts -dSubsetFonts=true -dMaxSubsetPct=99 \
-dAutoFilterMonoImages=false \
-dAutoFilterGrayImages=false \
-dAutoFilterColorImages=false \
-dDownsampleColorImages=false \
-dDownsampleGrayImages=false \
-dDownsampleMonoImages=false \
-sDEVICE=pdfwrite \
-dFirstPage=3 -dLastPage=3 \
-sOutputFile=mypg3out.pdf -f fontspec.pdf

GPL Ghostscript 9.02 (2011-03-30)
Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
   **** Warning: considering '0000000000 00000 n' as a free entry.
Processing pages 3 through 3.
Page 3

   **** This file had errors that were repaired or ignored.
   **** The file was produced by:
   **** >>>> Mac OS X 10.5.4 Quartz PDFContext <<<<
   **** Please notify the author of the software that produced this
   **** file that it does not conform to Adobe's published PDF
   **** specification.

...しかし、うまくいきません。出力ファイルmypg3out.pdfは、前述のとおり、まったく同じ問題に悩まされてevinceいます。

注: ポストスクリプトのラウンドトリップは避けたいと思いますがgs、フォント埋め込みを使用した from pdf to ps のコマンド ラインの良い例を次に示します。しかし、同じコマンド ラインで .pdf から .pdf に切り替えても、上記の問題には影響しないようです。

4

2 に答える 2

3

そうです、私はこれについてもう少し詳しく説明しました(完全ではありません)。そのため、ここに部分的な回答/コメントを投稿します。

基本的に、これはPDFへのフォントの埋め込みに関する問題ではありません。これはフォントマッピングの問題です。

それを示すために、(ドキュメントの3ページ目から)OPでmypg3out.pdf抽出されたを分析してみましょう。gsfontspec.pdf

$ pdffonts mypg3out.pdf 
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
Error: Missing language pack for 'Adobe-Japan1' mapping
CAAAAA+Osaka-Mono-Identity-H         CID TrueType      yes yes yes     19  0
GBWBYF+CMMI9                         Type 1C           yes yes yes     28  0
FDFZUN+Skia-Regular_wght13333_wdth11999 TrueType          yes yes yes     16  0
ZRLTKK+Optima-Regular                TrueType          yes yes yes     30  0
ZFQZLD+FPLNeu-Bold                   Type 1C           yes yes yes      8  0
DDRFOG+FPLNeu-Italic                 Type 1C           yes yes no      22  0
HMZJAO+FPLNeu-Regular                Type 1C           yes yes yes     10  0
RDNKXT+FPLNeu-Regular                Type 1C           yes yes yes     32  0
GBWBYF+Skia-Regular_wght13333_wdth11999 TrueType          yes yes no      26  0

出力が示すように、すべてのフォント実際に埋め込まれています。だから何か他のものが問題です。(そこには大量のフォントと大量のエラーメッセージがあるため、これを完全に観察することはより困難でしたfontspec.pdf。 )

ここでの重要なポイント(私は思う)は、次のようなものがあるということです。

  • Error: Missing language pack for 'Adobe-Japan1' mapping" "メッセージは1つだけです。と
  • たった1つのCID TrueTypeフォント、つまりCAAAAA+Osaka-Mono-Identity-H

CID TrueTypeと「Adobe-Japan1」のマッピングエラーの間には明らかな関係があるようです。そして私はそれをCIDフォントで最終的に明確にしました-Ghostscriptの使い方

CIDフォントは、多数のグリフ(たとえば、極東言語、中国語、日本語、韓国語のグリフ)を含むPostScriptリソースです。詳細については、PostScript Language Reference、第3版を参照してください。

CIDフォントリソースは、フォントとは異なる種類のPostScriptリソースです。特に、通常のフォントとしては使用できません。CIDフォントリソースは、フォントとして使用する前に、まずグリフの特定のコードを定義するCMapリソースと組み合わせる必要があります。これにより、異なるエンコーディングのグリフのコレクションを再利用できます。

すべて良い-ここでは、PostScriptフォントではなく、PDFフォントを扱っています。それを少しデモンストレーションしましょう。

たとえば、5.3。Ghostscriptを使用してフォントをプレビューする-Ghostscriptでフォントを使用できるようにする-FontHowToは、呼び出されたGhostscriptがインストールされたスクリプトprfont.psを使用してフォントのテーブルをレンダリングする方法について説明しています。

ただし、ここでは、Ghostscriptフォント[gs-devel]を一覧表示し、resourcestatus演算子を使用して特定のフォントを照会する方が簡単です。これには、特別な.psスクリプトは必要ありません。

$ gs -o /dev/null -dNODISPLAY -f mypg3out.pdf \
-c 'currentpagedevice (*) {=} 100 string /Font resourceforall'
...
Processing pages 1 through 1.
Page 1
URWAntiquaT-RegularCondensed
Palatino-Italic
Hershey-Gothic-Italian
...

$ gs -o /dev/null -dNODISPLAY -f mypg3out.pdf \
-c '/TimesNewRoman findfont pop [/TimesNewRoman /Font resourcestatus]'
....
Processing pages 1 through 1.
Page 1
Can't find (or can't open) font file /usr/share/ghostscript/9.02/Resource/Font/TimesNewRomanPSMT.
Can't find (or can't open) font file TimesNewRomanPSMT.
Can't find (or can't open) font file /usr/share/ghostscript/9.02/Resource/Font/TimesNewRomanPSMT.
Can't find (or can't open) font file TimesNewRomanPSMT.
Querying operating system for font files...
Loading TimesNewRomanPSMT font from /usr/share/fonts/truetype/msttcorefonts/times.ttf... 2549340 1142090 3496416 1237949 1 done.

フォントのリストを取得しました。ただし、これらは利用可能なシステムフォントghostscriptであり、PDFに埋め込まれているフォントではありません。

基本的に、

  • gs -o /dev/null -dNODISPLAY -f mypg3out.pdf -c 'currentpagedevice (*) {=} 100 string /Font resourceforall' | grep -i osaka何も返さず、
  • -c '/CAAAAA+Osaka-Mono-Identity-H findfont pop [/CAAAAA+Osaka-Mono-Identity-H /Font resourcestatus]'「システムでこのフォントが見つかりませんでした!CAAAAA+Osaka-Mono-Identity-Hの代わりにフォントCourierを使用してください。」と結論付けます。

PDF内のフォントを一覧表示するには、Ghostscriptのpdf_info.psスクリプトファイル(インストールされていない、ソースにある)を使用できます。

$ wget "http://git.ghostscript.com/?p=ghostpdl.git;a=blob_plain;f=gs/toolbin/pdf_info.ps" -O pdf_info.ps

$ gs -dNODISPLAY -q -sFile=mypg3out.pdf -dDumpFontsNeeded pdf_info.ps
...
No system fonts are needed.

$ gs -dNODISPLAY -q -sFile=mypg3out.pdf -dDumpFontsUsed -dShowEmbeddedFonts pdf_info.ps
...
Font or CIDFont resources used:
CAAAAA+Osaka-Mono
DDRFOG+FPLNeu-Italic
FDFZUN+Skia-Regular_wght13333_wdth11999
GBWBYF+CMMI9
GBWBYF+Skia-Regular_wght13333_wdth11999
GTIIKZ+Osaka-Mono
HMZJAO+FPLNeu-Regular
RDNKXT+FPLNeu-Regular
ZFQZLD+FPLNeu-Bold
ZRLTKK+Optima-Regular

したがって、最終的にはGhostscriptを観察できCAAAAA+Osaka-Monoますが、内からそれに関するより具体的な情報を照会する方法はわかりませんghostscript

 

結局のところ、私の質問ghostscriptは次のように要約されると思います。CID埋め込みフォントからグリフを別の「エンコーディング」(または「文字コード表」)のフォントにマップするためにどのように使用できますか?追加は必要ありません言語ファイル?

補遺

私はこれらのアプローチも試しました:

  • pdffontsここの出力にはOsaka-Monoがリストされていませんが、「エラー:「Adobe-Japan1」マッピングの言語パックがありません」というメッセージが表示されます。
    $ wget http://whalepdfviewer.googlecode.com/svn/trunk/cmaps/Japanese/Adobe-Japan1-UCS2 
    $ gs -sDEVICE = pdfwrite -o mypg3o2.pdf -dBATCH -f mypg3out.pdf Adob​​e-Japan1-UCS2
  • 以前と同じ-これ(Ghostscriptの「Use.htm」を介して)もOsaka-Monoをpdffontsリストから消えさせます:
    gs -sDEVICE = pdfwrite -o mypg3o2.pdf -dBATCH \
    -c'/ CIDSystemInfo << / Registry(Adobe)/ Ordering(Unicode)/ Supplement 1 >>'\
    -f mypg3out.pdf
  • これは次のようにクラッシュしError: /undefinedresource in findresourceます:
    gs -sDEVICE = pdfwrite -o mypg3o2.pdf -dBATCH \
    -c'/ Osaka-Mono-Identity-H / H / CMap findresource [/ Osaka-Mono-Identity / CIDFont findresource] ==' \
    -f mypg3out.pdf

最後に、一部の.psスクリプトghostscriptがインストールされることに注意してください。自動的に使用される場合があります。たとえば、あなたは見つけることができますgs_ttf.ps

$ locate gs_ttf.ps
/usr/share/ghostscript/9.02/Resource/Init/gs_ttf.ps

...次に、を使用して、コードの先頭にステートメントを追加できます。次に、上記のコマンドのいずれかが呼び出されると、印刷出力がstdoutに表示されます。sudo nano locate gs_ttf.ps(Hello from gs_ttf.ps\n) printgs

参考文献

于 2012-06-19T07:52:48.733 に答える
3

OK ポイント 1; Ghostscriptとpdfwrite を使用して、「追加処理なしで」PDF ファイルを作成することはできません。

pdfwrite と Ghostscript が機能する方法は、受信データ (PostScript、PDF、XPS、PCL など) を完全に解釈し、pdfwrite デバイスに渡される一連のグラフィックス プリミティブを作成することです。pdfwrite デバイスは、これらを新しい PDF ファイルに再構築します。

そのため、PDF ファイルを入力として取得して操作することはできず、常に新しいファイルが作成されます。

まず、9.02 Ghostscript を 9.05 にアップグレードすることをお勧めします。欠落している CIDFonts は、9.05 でより適切に処理されます (今年後半に 9.06 でさらに改善される予定です)。('Osaka Mono' に表示されていないフォントは、実際には通常のフォントではなく CIDFont です)

現在の最先端の Ghostscript コードを使用すると、不足しているフォントが埋め込まれた PDF ファイルが生成されます。私の evince のコピーは元のファイルを完全にレンダリングするため、これがうまくいくかどうかはわかりません。

後で追加

元の PDF ファイルを調べると、そこにあるフォントが実際に埋め込まれていることがわかります (予想どおり、サブセットであるため)。実際、上記のあなた自身の回答で言っているように、問題はフォントの埋め込みではなく、CIDFonts の使用です。

pdfwrite は出力に CIDFont を生成するため、ここでの私の回答は役に立ちません。基本的に、これは evince のバージョンまたはインストールの欠陥です。

文字の「再マッピング」の問題は、フォントが 256 個のグリフに制限されているのに対し、CIDFont には事実上制限がないことです。そのため、CIDFont を Font に入れる方法はありません。これを行う唯一の方法は、それぞれがオリジナルの一部を含む複数のフォントを作成し、必要に応じてそれらを切り替えることです。遅くて不格好。

ps2write デバイスを使用して PostScript に変換する場合、これは自動的に行われますが、その過程でベクター グリフ データがビットマップに変換され、うまくスケーリングされないという大きなリスクがあります。

基本的に、Ghostscript を使用したり、実際に私が知っている他のツールを使用したりして、やりたいこと (1 つの CIDFont を N 個の通常のフォントに変換する) を実際に達成することはできません。技術的には可能ですが、すべての PDF コンシューマーが CIDFonts を処理できる必要があるため、本当の意味はありません。できない場合は、PDF コンシューマーのバグです。

于 2012-06-19T08:08:10.170 に答える