8

編集:より良い説明: この質問に報奨金を設定する前に、何が必要かをより明確に述べたいと思います:

印刷可能なドキュメントを生成するための .NET ライブラリが必要です。ユーザーは、自分のアプリケーションまたは外部ツール (Adobe Acrobat Reader など) を使用して表示されるのとまったく同じドキュメントを印刷できる必要があります。PDF文書を生成するためのライブラリである必要はなく、上記の条件を満たす文書形式であれば何でも構いません。

次のシナリオをサポートするには、ライブラリが必要です。

シナリオ 1:

  1. いくつかのフォントと色でテキストを作成します。
  2. このテキストを印刷する場合は、図書館に幅を尋ねます。
  3. 2. からの情報に基づいて、このテキストの位置 (ページ上の [X,Y] 座標) を計算し、ページ上のこの位置に印刷するためのライブラリを用意します。

シナリオ 2:

  1. 上付き文字の一部を含むテキストを作成します。テキストのすべての部分 (通常および上付き文字) は、同じ (ただし可変) フォントです。
  2. このテキストを印刷した場合の幅を図書館に尋ねます。通常のテキストと上付き文字の間のカーニングも考慮した正解が得られます。
  3. このテキストを印刷するページ上の位置 ([X,Y] 座標) を計算します (ステップ 2 の幅を使用)。図書館にこの位置に印刷してもらいました。前の手順でライブラリから返された幅とまったく同じページに印刷されます。

2 番目のシナリオの注意:上付き文字の一部を含むテキストがあります - 例AAA{v-superscript text}BBB({}中かっこ内のテキストは上付き文字)。ライブラリは、正しいカーニングを使用してこのテキストを印刷できる必要があります。右カーニングを使用しない場合、最後の上付き文字と最初の上付き文字の間には、最後の上付き文字と最初の上A付き文字の間に同じギャップがあります。ユーザーにとっては、上付き文字と上付き文字の間にスペースがあるように見えますが、最後の上付き文字の後にはスペースがありません。そのため、テキストは見苦しくなります。ライブラリがこれを正しく処理する場合、一部が上付き文字であるという仕様で、テキスト全体を一度に印刷する方法があります。次に、通常のテキストと上付き文字の間で正しいカーニングを使用します。vtBAvAAA{v-superscript text}BBB

シナリオ 3:

  1. 線、円、塗りつぶされた円、文字、およびベジェ曲線で構成される画像を、ページ内の正確な位置に印刷したいと考えています。線と円の幅を指定する必要があります。すべての形状は、ピクセル精度で印刷する必要があります。

ライブラリは無料であり、GPL ではありません (LGPL は問題ありません)。必要なことを実行できるものはありますか? iTextSharp (AGPL ではなく LGPL であるバージョン 4.1.6) で実行できますか? それとも Fixed document でしょうか? ご提案ありがとうございます。


元の質問:

ユーザーのために .NET (C#) アプリケーションで複雑なドキュメントをタイプセットする必要があります。これらのドキュメントの主な用途は印刷です。

ドキュメントには、テキストと生成された単純なグラフィックスが含まれます。テキストとグラフィックのレイアウトは複雑で、計算する必要があります (つまり、ドキュメント内のテキストの位置はコードで制御する必要があり、選択したライブラリによって自動的に行われることはありません)。

私のAPI要件は次のとおりです。

  1. 指定された文字列とテキストが表示される指定されたフォントの正確な幅を返す関数
  2. テキストをページ上の正確な位置に配置する機能
  3. 上付き文字で一部を含むテキストを持っている
  4. 上付き文字の一部を含むテキストの正確な幅を取得する関数
  5. 写真を追加する機能、または単純なグラフィックを描画するためのさらに優れたオプション (指定された太さの線、指定された半径/直径の塗りつぶされた円)

PDF ドキュメントを作成するためのライブラリである必要はありません。他の「見たままが印刷される」ドキュメント形式でもかまいません。そのようなドキュメントを表示できる WPF コンポーネントがあれば有利です。iTextSharp があることは知っていますが、iTextSharp で要件を達成するのは簡単ではありません。もちろん、上記の要件を満たす一部の PDF 生成ライブラリも優れたソリューションになります。

詳細やより明確な説明を提供できることも嬉しく思います。

4

7 に答える 7

4

Docotic.Pdf Libraryを参照してください(免責事項: 私は Bit Miracle で働いています)。使いやすい API と、オンラインで表示したり、サンプル ビューア アプリケーションで実行したりできる優れたサンプル セットがあります。

また、それはあなたの要件を満たしています:

  • 指定された文字列とテキストが表示される指定されたフォントの正確な幅を返す関数

これにはPdfCanvas.MeasureText()メソッドを使用できます。

  • テキストをページ上の正確な位置に配置する機能

任意の位置または領域にテキストを表示できるオーバーロードが多数あります。
http://bitmiracle.com/pdf-library/help/pdfcanvas.drawstring.aspx
http://bitmiracle.com/pdf-library/help/pdfcanvas.drawtext.aspx

  • 上付き文字で一部を含むテキストを持っている

PdfCanvas.TextRise プロパティを使用すると、上付き文字を表示できます。上付きテキストのサイズを制御するために PdfCanvas.FontSize プロパティと組み合わせて使用​​できます。サンプル: http://bitmiracle.com/pdf-library/help/text-rise.aspx

  • 上付き文字の一部を含むテキストの正確な幅を取得する関数

上付きテキストに別のフォントまたはフォント サイズを使用する場合、 PdfCanvas.MeasureText() メソッドを直接呼び出すと、正しくない結果が生成されます。

回避策があります:

-異なるフォントで描かれた文字列の各部分を別々に測定し、すべての幅を合計します。

-描画されたテキストの幅を取得したい場合は、描画後に最初のテキスト位置を最終的なテキスト位置から差し引くだけです。

  • 写真を追加する機能、または単純なグラフィックを描画するためのさらに優れたオプション (指定された太さの線、指定された半径/直径の塗りつぶされた円)

サポートされています。これらのサンプルを見てください:
https://github.com/BitMiracle/Docotic.Pdf.Samples/tree/master/Samples/Graphics
https://github.com/BitMiracle/Docotic.Pdf.Samples/tree/master/Samples/画像


PDF ビューア コンポーネントは計画中ですが、現在 Docotic.Pdf はそのような機能を提供していません。

更新: Docotic.Pdf を使用して PDF ドキュメントをラスタライズ、レンダリング、または印刷できるようになりました。次の記事を見てください:
https://bitmiracle.com/pdf-library/convert-pdf-to-image.aspx
https://bitmiracle.com/pdf-library/draw-print-pdf.aspx

于 2011-04-12T17:42:04.853 に答える
2

他のライブラリを探すのではなく、混合サイズ/スタイルのテキストの幅を計算するより良い方法を探してみませんか?

float width = ColumText.getWidth(phrase);

Phrase は、ArrayList をさまざまなテキスト レイアウト関数と属性で拡張します。段落はフレーズを拡張します。各チャンクには、Font独自の色、サイズ、および基礎となる PDF フォントを持つ固有のものがあります。各チャンクには、ベースラインを調整するための独自の「テキスト ライズ」があります。

どのバージョンの iText を使用していますか? ColumnText はかなり前から存在しています。


通常の文字と上付き文字の間のカーニングが必要ですか?それは私にはあまり良い考えとは思えません。カーニングは調整であるため、たとえば「T」は「j」にオーバーハングする可能性があります。カーニング値は、ベースラインとフォント サイズが共有されていることを前提としています。ベースラインを共有することは決してなく、上付きテキストを扱うときはほぼ確実に異なるフォント サイズを使用します。また、これらの値を使用するのが良いと判断した場合でも (私は同意しません)、ベース テキストのポイント サイズまたは上付き文字のフォント サイズをカーニングしますか?

私のポイントは、ここでのあなたの目標(通常のテキストでカーニングされた上付き文字/下付き文字のテキスト境界)は、レイアウトを悪化させるだけでなく、改善することになると思うということです。

それとも私はあなたを誤解していますか?あなたのコメントを読み直させてください:

ただし、ページ上に上付き文字を含むこのテキストを配置したい場合は、PdfContentByte を使用する必要があります。

あなたがそこで何を意味するのか完全にはわかりません。ページ上の任意の場所にテキストを配置したい場合は、はい、使用する必要がありますPdfContentByte

それを使用すると、上付き文字を含む複雑なテキストを一度に印刷する方法が見つかりませんでした。

特定の「show text」コマンド内のすべてのテキストは、同じフォント/サイズ/色/その他を共有する必要があります。それがPDFの仕組みであり、iTextの制限ではありません。

一度に1つのテキストチャンクしか印刷できないと思います。

正しい。

そのため、カーニングを考慮して上付き文字でテキストを測定し、ページ上の特定の位置に配置することはできません

異なるチャンクのすべての幅を一緒に追加する必要があります。通常のテキストと上付きテキストの間のカーニングが良い考えだとは信じられませんが、問題を示す PDF のサンプルはそうではないことを私に納得させることができます.

を使用する必要があるようBaseFont.getWidthPointKerned(String text, float fontSize)です。上付き文字、下付き文字、または通常の文字、ポイント サイズとフォントがすべてです。また、絶対に主張する場合は、 を使用して同じフォント内のBaseFont.getKerning(int c1, int c2)任意の 2 文字間のカーニング値を取得し、それを使用してチャンク間カーニングを決定できます。


iText & を使用してテキストを描画する別の方法PdfContentByteは、ColumnText. iText は段落をレイアウトするときに ColumnText を使用すると思いますが、確認するにはコードを確認する必要があります。

とにかく、コードは次のようになります。

ColumnText colTx = new ColumnText(contByte);
// paragraphs are phrases.
colTx.addText(phraseWithSuperAndSubScriptStuff);
colTx.setSimpleColumn(llx, lly, urx, ury);
colTx.go();
于 2011-04-12T23:19:38.190 に答える
1

GDI+ の経験を積む必要があるようです。

私は住宅ローン会社で働いていましたが、彼らはレポートのレイアウト方法に非常にこだわっています。ピクセル精度まで。残念ながら、GDI+ はテキストをうまく測定できません。したがって、Windows API を使用することをお勧めします。

[DllImport("gdi32.dll")]
static extern bool GetTextExtentPoint(IntPtr hdc, string lpString, 
                                      int cbString, ref Size lpSize);

描画しているビットマップのハンドルを渡します。はるかに正確です。

または、TextRenderer の使用を検討することもできます

http://msdn.microsoft.com/en-us/library/system.windows.forms.textrenderer(v=VS.80).aspx

それがどれほど正確であるかについては、私は何の主張もできません。

于 2011-04-22T05:57:51.260 に答える
1

MSDN の FixedDocument オブジェクトの構築に関する記事を次に示します。

WPF を使用していて、印刷品質のドキュメントを作成したい場合は、おそらく組み込みの FixedDocument および XPS テクノロジを学習する必要があります。また、最終的にはオブジェクト モデル内の FixedDocument 全体にアクセスできるため、幅の数値もわかる場合があります。私はまだそれを試していません。

于 2011-04-12T02:20:59.323 に答える
1

当社の製品であるPDFOne .NETは、お客様の要件に適合する場合があります。ロイヤリティフリーの商用ライセンスが付属しています。

  1. 指定された文字列と、テキストが表示される指定されたフォントの正確な幅を返す関数
    PDFFont.GetTextWidth() メソッドを使用できます。
  2. ページ上の正確な位置にテキストを配置する
    機能
  3. スーパー スクリプト
    PDF には、そのテキストアウトにこの概念がありません。スーパーストリングとして表示されるものは、フォント サイズと位置が異なる単なる別のストリングです。これには、別のテキストアウトを呼び出すだけです。
  4. 上付き文字の一部を含むテキストの正確な幅を取得する関数は、
    前の応答を参照してください。
  5. 画像を追加する機能、または単純なグラフィックスを描画するためのさらに優れたオプション (指定された太さの線、指定された半径/直径の塗りつぶされた円) - PDFOne .NET には、レンダリング イメージ、正方形、長方形、円弧、ベゼワール曲線、楕円、円、長方形、ポリラインがあります。 、多角形、長方形、透かし、スタンプ、いくつかの種類の注釈、...

PDFOne .NET には、PDF プリンター コンポーネントと PDF ビューアー コンポーネントも付属しています。

免責事項: 私は Gnostice で働いています。

于 2011-04-12T05:10:24.887 に答える
1

WPFには優れた印刷機能がありますが、問題を考えすぎている可能性があると思います。ビジュアル (ほとんどすべての WPF クラス) は、画面に表示されているとおりに非常に簡単な方法で印刷できます。ここに良いチュートリアルがあります: http://www.switchonthecode.com/tutorials/printing-in-wpf

于 2011-04-21T01:43:41.823 に答える
0
  1. LaTeX:本番環境でのPDF生成用のLaTeX
  2. Asposeなどの有料ライブラリの場合:http ://www.aspose.com/categories/.net-components/aspose.pdf-for-.net/default.aspx
  3. 優れたCSSを備えたプレーンHTMLもかなりうまく機能します。
  4. Microsoft Open XML: http: //msdn.microsoft.com/en-us/library/bb448854.aspx

その価値については、iTextSharpが最も簡単なものだと思います。あなたはそれらすべてであなたが望むことをすることができます、しかしそれらはそれぞれ賛否両論を持っています。

于 2011-04-12T02:02:10.527 に答える