2017-12-28 34 views
2

PDFパーサーをC#で作成しようとしていますが、仕様の解釈方法がわからない問題があります。PDF仕様 - ポイントでのフォントサイズの取得

特に指定のない限り、PDFドキュメントのユーザースペースは1/72インチ(つまり1pt)です。

Tfオペレータによって提供されるスケールは、フォントを標準サイズ(通常は1単位のユーザースペース/ 1pt)から正しい表示サイズに調整します。

私は、次のページのコンテンツを持っている:

1 0 0 -1 0 792 cm 
q 
0 0 612 792 re 
W* n 
q 
.75 0 0 .75 0 0 cm 
1 1 1 RG 1 1 1 rg 
/G0 gs 
0 0 816 1056 re 
f 
0 0 816 1056 re 
f 
0 0 816 1056 re 
f 
Q 
Q 
q 
0 0 612 791.25 re 
W* n 
q 
.75 0 0 .75 0 0 cm 
1 1 1 RG 1 1 1 rg 
/G0 gs 
0 0 816 1055 re 
f 
0 96 816 960 re 
f 
0 0 0 RG 0 0 0 rg 
BT 
/F0 21.33 Tf 
1 0 0 -1 0 140 Tm 
96 0 Td <0037> Tj 
13.0280762 0 Td <004B> Tj 
11.8616943 0 Td <004C> Tj 
4.7384338 0 Td <0056> Tj 
ET 
BT 
/F1 21.33 Tf 
1 0 0 -1 0 140 Tm 
136.292267 0 Td <0001> Tj 
ET 
... 

私はサンプルで定義された2つのテキスト操作のポイント単位でのフォントサイズがしかし、Tfの演算子は21.33のサイズを使用している16ポイントであることを知っています。バック私はポイントサイズを作るセンチオペレータの規模(y)を使用するように意図されたポイントにこのフォントサイズから変換するために:私は、この変換をサポートするPDFの仕様では何も見つけることができませんでしたしかし

21.33 * 0.75 = 15.9975 

と私がチェックしたライブラリ(PDFBox、iTextSharp、Spire PDF)のどれもが21.33以外のものとしてフォントサイズをリストしていませんでした。

CTM(cm演算子で定義)を使用して、フォントサイズを正しいスケールにスケールするか、これはちょうどいいチャンスですか?

pdfファイルはこちらです:すべてのhttps://github.com/UglyToad/PdfPig/blob/master/src/UglyToad.PdfPig.Tests/Integration/Documents/Single%20Page%20Simple%20-%20from%20google%20drive.pdf

+2

'cm'操作*連結*するので、最初のスケール演算の係数 '0.75'は' Tf'演算子が処理されます。それは実際に変換ではありません。 *すべての*グラフィック操作は行列を使用して行われます。 – usr2564301

+0

フォントサイズのスケーリングを行列演算として表現する方法はありますか?スカラー値なので、行列で乗算することはできません。問題の例ではscaleX = 0.75の値とscaleY = -0.75(負の値)なので、Xスケールで掛けるのが理にかなっていますが、そうすることの正当性を理解することはできません。 – Underscore

答えて

3

まず、他のテキスト抽出と、あなたの比較は誤解に基づいている:私がチェックしたライブラリの

なし(PDFBox、iTextSharp、スパイアPDF )は、21.33以外のものとしてフォントサイズを列挙しました。

すべてのそれらのライブラリによって返された「フォントサイズ」パラメータは、単にあなたのあなたが決定しようとしている最終文書に観察のTf命令ではなく、効果的なフォントサイズのサイズ引数です。だからあなたの他のライブラリとの比較は理にかなっていません。

Iのポイントサイズを作成センチオペレータのスケール(y)を使用するように意図されたポイントに戻って、このフォントサイズへ変換するために


次に、あなたのアプローチについて

21.33 * 0.75 = 15.9975 

いくつかのライブラリは、それを呼び出している間、第四センチパラメータ "スケール(Y)" を呼び出すことは誤解を招くです。例えば。テキストが90°回転した場合、通常はグラフィック表示がではなく、がゼロの高さに縮小されます。

"scale(y)"パラメータを使用するだけでは機能しませんので、変換全体を考慮する必要があります。


最終的にあなたが実際に行っていることについて話しましょう。

結合変換マトリックス(現在の変換マトリックス+テキストマトリックス+水平スケーリング)が直交し、テキストラインがこの直交性に従う限り、フォントサイズの概念の意味はかなり明白です。

しかし、その結合マトリックスにせん断があるとすぐに、「フォントサイズ」の意味は明らかになりません。

  • 元の縦線(1単位の高さ)がどのように変形されたのかを示すことがあります。
  • 変換された線の、変換されたフォントの基線に対して直角の線への投影の長さを意味します。
  • または、その変換された線の、観察される基線と直角の線への投影の長さを意味する場合があります。

前の2つの数値は単純な線形代数を使用して計算するのは簡単です。 3番目の数値は、結果のPDFで人間が観測した基準線を決定する必要があるため、より困難な場合があります。革新的な変換の使用の場合、これは重要ではないかもしれません

関連する問題