close

iText製品Q&A 01

iText製品Q&A 02はこちらから

ライセンスファイルが破損しています。

XMLファイルがあり、この例外が発生している場合は、古いバージョンのライセンスキーライブラリ (<= 3.1.3)を使用している可能性があります。

バージョン3.1.4、または Artifactoryにある最新のものに更新してください。

.NET環境でpdfRenderを使用するにはどうすればよいですか?

はじめに

iTextは現在 Javaの場合のようにネイティブC#バージョンのpdfRenderを提供していません。 コマンドラインバージョンを提供しています。 pdfRenderのCLI機能を使用してpdfRenderを任意の.NETプロジェクトに統合することが可能です。 以下は、pdfRenderのCLIインフラストラクチャを利用する際の潜在的なパラメータを示す表です。

注)“license”は必須であり、pdfRenderライセンスファイルの場所を指定するために使用されます。

以下は、PDFをレンダリングできる画像ファイルタイプのリストです(上記の「type」変数によって決定されます )。

  • JPEG
  • PNG
  • TIFF
  • JPEG2000
  • BMP

以下は、Windowsで入力し、PDFをTIFFファイルに変換するC#コードスニペットです。 このコードが正しく機能するためには、pdfRenderの実行可能バージョンをダウンロードしてください。
ダウンロードはこちらから。

実際、pdfRender CLIは、コマンドラインにアクセスできる任意の言語で機能する可能性があります。 Pythonなどの言語を介してCLIにアクセスして対話するという基本事項を適用して、同じ結果を得ることができます。

pdfOCR:TESS_DATA_DIRECTORYはどのように取得できますか?

トレーニングモデルが異なる複数のリポジトリがあるため、tessdataディレクトリはユーザーが取得する必要があります。 Tesseract独自のGitHubリポジトリには、ここでは、tessdata (標準モデル)とtessdata_best (低速ですが精度が高い)データファイルがありますので、そちらから取得してください。

トレーニングモデルをダウンロードしたら、適切な方法で(Java / .NET )pdfOCRで指定するだけです。

pdfOCR:手書き文字認識はサポートされていますか?

手書きテキスト(筆記体)を認識するためにTesseractコミュニティではいくつか試していますが、 現段階では手書き認識はサポートされていません。

pdfOCR:スキャンしたドキュメントに段落と表を含むセクションが混在している場合の対処法は?

この質問はTextPositioning プロパティに関連しており、 FAQの「pdfOCRのTextPositioningとは何ですか?」もご参照ください。

コンテンツが混在していて、BY_WORDSとBY_LINEのどちらを使用するのがよいかわからない場合は、 BY_WORDSストラテジーを使用することをお勧めします。単語の境界を失うことなく単語を段落にグループ化できます。

pdfOCR 1.0.1以降では、BY_WORDS_AND_LINESも使用できます。 BY_WORDSモードに似ていますが、単語の境界ボックスの上部と下部が行から継承されます。

別のOCRレイヤーを作成するにはどうすればよいですか?

デフォルトでは、pdfOCRは認識されたテキストを処理された画像にマージしますが、 この情報を分離したままにしておくこともできます。 これを行うには、OcrPdfCreatorProperties (Java / .NET)クラスの下に必要なものがあります。

次のことを定義できます。

  • 別のテキストレイヤーが必要な場合(以下の2つのオプションのいずれかがテキストレイヤーの作成をトリガーします)
    • 名前を定義すること(Java / .NET
    • 色を定義すること(Java / .NET)-このパラメーターを定義しない場合、テキストは透明になることに注意してください
  • 別の画像レイヤーが必要な場合
    • その名前を定義すること(Java / .NET

以下は、すべての機能をオンにした簡単な例です(先に挙げたオプションはすべて使用されています)。

TESS_DATA_FOLDERでTesseractデータへのパスを指定することを忘れないでください。 こちらのリンクも参照ください。

Unicode文字に対応するグリフが見つかりません。

pdfOCRは、レンダリングされるグリフをカバーしているため、 LiberationGitHub)SansRegularとともに出荷されます。 しかし、すべてを網羅しているわけではないので(特にラテン語の領域外の場合)、pdfOCRは対応するグリフが見つからない場合、警告します。

このような場合、レンダリングする関連するグリフを含むPdfOcrFontProviderクラス(Java / .NET) を使用してフォントファイルを指定する必要があります。

特定のフォントのグリフカバレッジ情報を表示したい場合、ttfファイルをチェックするためのツールは FontDrop!が良いでしょう。 (iTextが提携しているツールではありません)。

pdfOCRのTextPositioningとは何ですか?

pdfOCRでは、Tesseract 4.1出力におけるテキストの取得方法を定義することができます。 Tesseract4OcrEnginePropertiesクラス(Java/.NET)で設定可能な2つのオプションがあります。

  • BY_LINES(デフォルト)
  • BY_WORDS

これらのオプションは、OCRしようとする文書と、その文書で何をしたいかに応じて違いがあります。 簡単に言うと、たとえば請求書を OCR する場合は BY_WORDS が理にかなっていますが、本を OCR する場合は BY_LINES が最も安全な方法です。

では、実際にどのような違いがあるのでしょうか。

簡単に言えば、抽出する情報をどのように集約するかということです。pdfOCRで、複数の単語を一行に束ねようとするのか、それともそれぞれの単語を独自のバウンディングボックスに収めようとするのか?

なぜ気にする必要があるのでしょうか?

pdfSweepのようなツールを使って、特定の単語を再編集する場合、特定の単語を選択するだけで、ほとんど興味のない広い領域を強調する大きな矩形が表示されないので、上記の請求書の例のように、はるかに簡単になります。表の中の数字が書いてあるセルは、できるだけ限定して表示させたいものです。

pdfOCRはどのような言語に対応していますか?

pdfOCRは、 Tesseract4.1に依存しているため、 GitHubリポジトリでいつでも最新の言語(+130!)のデータモデルとスクリプト(+35)を取得できます。

OCRドキュメントの別のレイヤーに高度なタイポグラフィをレンダリングするためにフォントが必要な場合は、 pdfCalligraphを確認してください。

※Tesseract4OcrEngineProperties (Java / .NET)クラスを使用して、 コードでTesseractデータへのパスを指定することを忘れないでください。

※Tesseract4OcrEngineProperties (Java / .NET)クラスでOCRする言語を指定することを忘れないでください。

pdfHTMLはどのような言語に対応していますか?

この質問に対する簡単な答えは、適切なフォントを提供する限り、すべての言語がサポートされているということです。 たとえば、中国語と英語のテキストを組み合わせてHTMLページを変換する場合、 中国語のグリフのレンダリング方法を知っているフォントを指定しない限り、英語のテキストのみが表示されます。これ

適切なフォントを提供し、pdfCalligraphを使用している限り、ほとんどの言語がサポートされています。

  • ヒンディー語、カンナダ語、タミル語、テルグ語などのインド語のテキストを含むHTMLページを変換する場合、 iTextは合字を作成する必要があり、これを実現するにはpdfCalligraphアドオンが必要です。
  • ヘブライ語のテキストを含むHTMLページを変換する場合は、書記体系を左から右から右から左に変更する必要があります。 これには、pdfCalligraphアドオンも必要です。
  • アラビア語のテキストを含むHTMLページを変換する場合は、書記体系を右から左に変更し、合字を作成する必要があります。

これらは、pdfCalligraphアドオンでサポートされている言語、つまり書記体系のほんの一例です。 新しい書記体系は定期的に追加されます。

注意:pdfCalligraphはオープンソースライセンスでは利用できません。

商用ライセンスを購入せずにクローズドソースアプリケーションでiTextを配布しているという意味で、 AGPLライセンスに違反している企業がいます。これらの企業の何社かに対しては訴訟を起こしましたが、訴訟を起こし、 そこに労力を使うより不正を防ぐ方がより簡単なことだと思います。 クローズドソースライセンスを使用するプロプライエタリソフトウェアとして、pdfCalligraphなどのiTextの特定のコンポーネントを配布することにしました。 企業がこれらのアドオンを使用する場合は、iTextソフトウェアとのビジネス関係を成立させる必要があります。 このことにより、フリー/オープンソースソフトウェアがフリーウェアではないことを伝える場が与えられるということになります。 iTextコアライブラリはAGPLソフトウェアとしてリリースされています。AGPLはフリーソフトウェアのライセンスですが、 常に無料でiTextを使うことができるという意味ではありません。iTextは、iTextのソースコードに付属しているAGPLの解釈を使用して、 AGPLの規則に従っている場合にのみ無料で使用できます。

以下のスクリーンショットは、 peace.htmlHTMLファイルの一部を示しています。このファイルは数百の言語でpeaceという単語を表しています。

 ※さまざまな言語でのPeace/平和(HTML)

たとえば、アブハズ語やアフロシミノール語の平和という言葉を翻訳してもそれが正しいか分かりません。 そのため完全なものではありません。

C07E13_Peaceの例は、以下のスクリーンショットに示すように、 このHTMLファイルをPDFドキュメントに変換します。

 ※さまざまな言語でのPeace平和(PDF)

よく見ると、iTextはアムハラ語、アングロサクソン語(古英語)、チェロキー語、 その他多くの言語をサポートしていることがわかります。なぜ、そんなことが可能なのでしょうか? ドキュメントのプロパティ」の「フォント」タブを見てみると、その理由がわかります。

 ※さまざまな言語でのPeace平和(PDFフォント)

fonts /noto/ディレクトリをに追加しました。 このフォルダには、 Google Noto フォントプロジェクトから取得した95個の.ttfファイルがあります。

Googleは、調和のとれた外観ですべての言語をサポートすることを目的としたNotoと呼ばれるフォントファミリを開発してきました。 Notoに対するGoogleの答えは「豆腐」です。 Notoという名前は、Googleの目標が「no more tofu」であることを伝えることです。 Notoには複数のスタイルと重みがあり、すべての人が自由に利用できます。 Googleの開発で使用されるフォントとツールの包括的なセットは、 GoogleのGitHubリポジトリで利用できます。

 ※表示できないグリフは「豆腐」に置き換えられます

点線をセルの境界線として使用するにはどうすればよいですか?

境界線に点線のあるセルを含むテーブルを作成しようとしています。どうやるのですか?

2013年11月21日にuser1913695によってStackOverflowに投稿されました

解決例を作りました: DottedLineCell。結果のPDFは、2つのテーブルを持つドキュメントです。最初のテーブルには、テーブルレンダラーを使用します。

これは、すべての線に1つの「stroke()」オペレーターのみを使用するため、 セルの境界線を描画するために最も洗練された方法です。 行スパンのあるテーブルがある場合、このソリューションはオプションではありません。 2番目のテーブルはセルレンダラーを使用しています。

セルイベントでは、すべてのセルの周囲に境界線が描画されます。 これは、複数のstroke()オペレーターと重複する行があることを意味します。 ただし、このソリューションは、テーブルに1より大きい行スパンのセルがある場合にも常に機能します。

非圧縮のPDFファイルを作成するにはどうすればよいですか?

開発テスト中は、iTextSharpを使用して非圧縮のバイナリではないPDFファイルを作成し、 内部を簡単に確認できるようにしたいと思います。
完成したPDFは、さまざまなユーティリティを使用していつでも変換できますが、面倒なステップを踏む必要があります。
圧縮レベルを決定できる場所(PdfImageなど)がいくつかありますが、 個々のPDFオブジェクトをストリームに出力するために使用される圧縮については何も見つかりませんでした。 iTextSharpでこれをすることは可能ですか?

2014年5月15日にGáborによってStackOverflowに投稿されました。

iText 7では、圧縮レベルを0に設定できます。WriterPropertiesクラスを使用した圧縮がないことを意味します。

この場合、PDF構文ストリームは圧縮されません。

特定の位置からテキストを読む方法は?

PDFファイルからデータを読み取るときにiTextSharpを使用すると問題が発生します。 PDFページの特定の部分のみを読み取りたいのです。(一定の位置にあるアドレス情報のみを取得したい)。 次のような全ページを読むためにiTextSharpを使用するのを見たことがあります。

しかし、どうすれば特定の場所にのみ制限できますか?

2014年6月12日にRobertJによってStackOverflowに投稿されました。

LocationTextExtractionStrategyの代わりにSimpleTextExtractionStrategyを使用しています。 rectがアドレスの座標に基づく長方形の場合、iText7では下記が必要です。

これで、rectと交差するすべてのテキストスニペットを取得できます (したがって、テキストの一部がrectの外側にある可能性があり、iTextはテキストスニペットを分割しません)。

※次を使用してページのMediaBoxを取得できることに注意してください。

左下の座標は x = mediabox.getLeft(), y = mediabox.getBottom() 右上の座標は x = mediabox.getRight(), y = mediabox.getTop() となります。

xの値は左から右に、yの値は下から上に向かって増加します。 PDFの測定システムの単位は「ユーザー単位」と呼ばれます。 デフォルトでは、1つのユーザーユニットが1ポイントと一致します (これは変更される可能性がありますが、異なるUserUnit値を持つPDFは多くありません)。 通常の状況では、72ユーザー単位= 1インチです。

PdfStamperが0バイトのファイルを作成するのはなぜですか?

PDFを暗号化しようとすると、結果としてサイズがゼロのファイルが表示されます。 これを引き起こしている原因は何でしょうか?

2014年7月8日にintegratedsolnsによってStackOverflowに投稿されました。

iText 7では、PDFによるすべての操作はPdfDocumentインスタンスを使用して行われます。 暗号化は次のように実行できます。

原因はPdfStamperを閉じていないことでした。 今後は、PdfDocumentインスタンスを閉じることを忘れないでください。

PdfStamperをバイト配列に変換する方法は?

私のアプリケーションでは、既存のPDFを読み取り、このPDFにバーコードを追加して、 出力ストリームに渡す必要があります。 ここで、既存のpdfはテンプレートのようなものです。 バーコードを追加するためにiTextjarを使用しています。

PdfStamperオブジェクトをバイト配列に変換する可能性またはPdfContentByteをバイト配列に変換することは可能ですか。

2014年10月27日にuser1636102によってStackOverflowに投稿されました。

FileOutputStreamではなくByteArrayOutputStreamに書き込みたいのだと思います。 これを行う方法については、iTextWebサイトにさまざまな例が掲載されています。 なお、iText 7にはPdfStamperはなく、PdfDocumentのインスタンスを使っています。

たとえば、FormServletの例を参照してください。

そして、例の後半では、このようにします。

byte[]が必要な場合は、次のようにしてください。

PdfContentByteストリームをbyte []に書き込むことについての質問ではないことを願っています。 なぜならそれは意味がないためです。 コンテンツストリームには、フォント、画像、フォームXObjectsなどのリソースが含まれていません。

リンク注釈のズーム率を変更するにはどうすればよいですか?

リンクのズームプロパティのみを変更したいと思っています。 下記は今使っているものです:

上記ではズーム率が変更できないので、困っています。

2014年4月3日にparesh3489227によってStackOverflowに投稿されました。

ChangeZoomXYZDestinationの例をご覧ください。 移動先を置き換えるのではなく、ズームファクターを置き換える必要があります。 また、iText 7 には PdfCopyクラスがないことに注意してください。必要なのは PdfDocument インスタンスだけです。

たとえば、11ページのファイル xyz_destination.pdfを例にとると、前の10ページへの10個のリンクがあり、 それぞれに特定のズーム率で特定のページを指す/ XYZ宛先があります。 これは、次のスクリーンショットで確認できます。

リンク注釈とそのリンク先の内部構造

最初の注釈では、ズーム率は1で、2番目の注釈では2、というように続きます。

これらのリンクのズーム率を0に変更したい場合は、注釈をループする必要がありますが(すでに行っています)、 /DESTをアクションに正しく置き換えるのではなく、/DEST配列のズーム率の値を変更する必要があります。

これで、タイプ/ XYZのすべてのリンクのズーム率がゼロになるxyz_zoom.pdfなどのファイルが作成されます。

ColumnTextの最初の行の位置を調整するにはどうすればよいですか?

下記はColumnTextオブジェクトにフレーズが追加されている状況です。

タイトル(黒)は、iTextがColumnText内のフレーズのテキストを配置している場所です。 タイトル(ピンク)が希望の配置です。 グリフ(この場合はDとZ)の上部とColumnTextボックスの上部の間にスペースを入れないようにiTextに指示するすることはできますか。

Locriansaxによって2015年1月12日にStackOverflowに投稿されました

ColumnTextAscenderの例をご覧ください。 これがiText7でどのように機能するかです。最初は赤い長方形を描きました。

次に、現在のドキュメントにColumnDocumentRendererを設定して、指定した領域に新しいデータが表示されるようにします。

iText 7で任意の位置に段落を追加するには、マージン値を0に、リーディングを1に設定する必要があります。

次に、列ごとに異なるuseAscenderパラメーターを使用してこのメソッドを実行します。

結果は次のようになります。

画像にテキストを追加するにはどうすればよいですか?

私のプロジェクトでは、iText を使用して PDF 文書を生成しています。 ページの高さが500pt(1ユーザーユニット=1ポイント)で、ページにテキストを書き、その後に画像を書き込むとします。 内容も画像も450pt以下であれば、画像の前に表示されます。 内容も画像も450ptを超える場合は、テキストが次のページに転送されます。 質問ですが、画像を書き込む前に残りの空きスペースを取得するにはどうしたらよいでしょうか?

2014年11月6日にMadheshによってStackOverflowに投稿されました。

OPは透かし入りの画像を追加したいことのことです。 実際の要件に応じて、これを実現するための2つのアプローチがあります。

【アプローチ1】
最初のアプローチは、WatermarkedImages1の例で説明されています。 iText 7では、適切な幅と高さを持つ長方形としてPdfFormXObjectテンプレートを作成します。 このテンプレートからCanvasを作成し、画像とその画像の上に書かれたテキストを追加できます。 次に、このPdfFormXObjectを画像で囲み、単一のdoc.add()ステートメントを使用してその画像を透かしと一緒に追加できます。

画像を追加する方法は次のとおりです。

ご覧のとおり、非常に大きな画像が1つあります。 この画像をページに収まるように拡大縮小する必要があります。 これを避けたい場合は、2番目のアプローチを見てください。



【アプローチ2】

2番目のアプローチは、WatermarkedImages2の例で説明されています。 この場合、各画像をセルに追加します。 このセルは、ページの幅に合うように画像を拡大縮小します。 透かしを追加するには、セルレンダラーを使用します。

このセルレンダラーは、次のように使用できます。

すべての画像のサイズがほぼ同じで、画像をページに合わせる心配がない場合は、このアプローチを使用します。


■考察:
もちろん、どちらのアプローチも、デザインの選択によって結果が異なることは明らかです。 出来上がったPDFを比較して、違いを確認してください: watermark_template.pdfwatermark_table.pdf


■関連する質問:
iTextSharpを使用してPDFを作成していますが、複数のページにまたがるテーブルが含まれています。 テーブルを追加した後、pdfPDFドキュメントは3ページになります。 次に、署名画像を追加し、PdfContentByteを使用してその署名画像にテキストを追加します。

また、PdfContentByteを使用して最後のページにテキストを追加したいと思います。 ImageWatermarkの例を試しましたが、機能しません。

2015年2月14日にrahlrokksによってStackOverflowに投稿されました。

WatermarkedImages3の例をご覧ください。

Rahlrokksは、これは機能しないと主張しています。しかしそれは間違っています。 Watermark3.pdfを見ると、最後のページの画像の上に追加されたテキストがはっきりとわかります。

■画像の上にテキストを追加

ColumnTextを使用したテキストの追加に関する2番目の質問にも回答しました。 iText 7では、doc.showTextAligned()メソッドを使用します。

画像にテキストを追加するだけでなく、PdfContentByteを使用して最後のページにもテキストを追加します。

PdfContentByteを使用してテキストを追加。

フォントが太字であるかどうかを確認するにはどうすればよいですか?

PDFファイルから見出しを抽出するアプリケーションがあります。 アプリケーションが処理することになっているドキュメントはすべて、多かれ少なかれ一貫した構造とフォーマットを持っています。 実際、テキストの塊が太字であるかどうかを判断することは非常に重要です。 最近、いくつかのチャンクが視覚的に太字に見えるものの、フォントの文字列表現に「太字」の部分がないファイルを大量に見かけました。 レンダリングモードを変更するなど、テキストを太字で表示する方法があることは知っています。 ただし、私の場合、GetTextRenderMode()を呼び出しても、通常のテキストであるかのように0が返されるため、役に立ちません。 テキストを太字で表示する他の方法はありますか?iTextSharpを使用してそれを検出することは可能ですか?

2015年1月21日にuser2082616によってStackOverflowに投稿されました。

PDFファイル内のフォントが太字かどうかを認識していると想定しています。 内部を見て、仮定が正しいかどうかを確認しましょう。

共有したPDFファイルの内部を見ると、フォントTT116t00のサブセットJOJJAHはこのように見えます。

 ※PDF内のフォント

フォントがサブタイプ/ TrueTypeで、/ ItalicAngleが0、そして /Flags の 3 ビット目が設定されていることがわかります。。 PDFリファレンスをチェックして、これが何を示しているかを調べてみましょう。

 ※PDFリファレンス1.7セクション5.7.1

引用:
フォントには、Adobeの標準ラテン文字セット以外のグリフが含まれています。

グリフが太く見えるのは、グリフが太く見えるように描かれているからです。 あなたがフォントを太字に見えるのは、あなたが人間だからです。 しかし、機械がこのフォントを見たところで、そのフォントが太字であるという手がかりはありません。 機械は、/FontFile2ストリームに格納されている命令に従うだけなのです。

要素の高さを計算する方法は?

XMLデータからPDFファイルを生成しています。 段落要素の高さは次のように計算します。

しかし、この方法では正しく機能しません。

Valeriによって2014年7月3日にStackOverflowに投稿されました。

あなたの質問は不思議です。 質問のヘッダーによると、文字列の高さを知りたいようですが、 コードは文字列の幅をを尋ねているようです。

FoobarFilmFestivalの例をご覧ください。

myFontがPdfFontインスタンスの場合、次を使用できます。

これは、フォントサイズを12としたときの、ベースラインより上の高さと、ベースラインより下の高さを返すものです。 フォントサイズは平均の高さを示していて、実際の高さではありません。あくまで数値として扱うだけです。
高さのトータルは次のようになります。