質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Q&A

2回答

774閲覧

1行の文字数を制限するにはどうしたらいいですか?

iText_Q

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

0グッド

0クリップ

投稿2019/07/09 07:04

PDFを作成するためiTextを利用しています。そうしたPDFで、1行に2つのStringを追加しなければなりません。
1つ目のString(string1)の長さは1から10の間です。2つ目のString(string2)の長さは不明ですが、string1string2の長さを合わせて10文字を超過しないようにしたいです。
このような文字列を、下線が引かれた1行に追加するにはどうしたらいいですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

S_kawa

2019/07/09 09:56

iText_Q、iText_Aは同じユーザーさんでしょうか? 恐らく質問記載用と回答記載用で分けたのだと思いますがマルチユーザは推奨されませんし、質問者も回答欄使えますので不要かと思います。 そもそも質問を編集して記載すべき内容です。 上記2点ご対応ください。
iText_Q

2019/08/08 05:06

失礼しました。今度からは注意します。 質問を編集して記載すべき内容ってことは質問に解決策を一緒に乗せればいいってことでしょうか?
guest

回答2

0

UnderlineParagraphWithTwoPartsのサンプルコードを挙げたうえで、このサンプルコードがどのような問題を解決したのかをご説明したいと思います。

**第1の問題:**1行を100文字に合わせたいです。まず、101文字を基準とします。string1string2の間に空白が必要だと仮定したためです。(そうでない場合、サンプルコードを簡単に修正できる必要があります)

string1string2の間の内容は事前に分からないので、すべてのグリフの幅が同一のフォントを選択しました。Courier(固定幅または等幅フォント)を使用します。プロポーショナルフォント(例:Arial)を使用したい場合は、string1string2の組み合わせごとにフォントサイズを別途に計算しなければならないので、フォントサイズの計算が非常に困難で、各列のフォントサイズがすべて異なるおかしい見た目の文書になってしまいます。

このコードは、COURIERフォントの1文字の幅を基準にしてフォントサイズを計算します。ページの左右余白の間の使用可能な空間と同じ幅の1行に101文字を追加してみます。

PdfFont font = PdfFontFactory.createFont(FontConstants.COURIER, PdfEncodings.WINANSI, false);
float charWidth = font.getWidth(" ");
int charactersPerLine = 101;
float pageWidth = pdfDoc.getPage(1).getPageSize().getWidth() - doc.getLeftMargin() - doc.getRightMargin();
float fontSize = (1000 * (pageWidth / (charWidth * charactersPerLine)));
fontSize = ((int) (fontSize * 100)) / 100f;

ご参考までに、float値は四捨五入します。そうしないと、float値の使用に内在された丸め誤差により問題が発生することがあります。

**第2の問題:**次に、1行に2つの文字列を追加してから下線を引きたいと思います。ご質問からは、このように文字列を整列したいのかは分かりかねます。

単純な作業としては、string1string2を1つの空白で分離することがあります。

public void addParagraphWithTwoParts2(Document doc, PdfFont font, String string1, String string2, float fontSize) {
if (string1 == null) string1 = "";
if (string1.length() > 10)
string1 = string1.substring(0, 10);
if (string2 == null) string2 = "";
if (string1.length() + string2.length() > 100)
string2 = string2.substring(0, 100 - string1.length());
Paragraph p = new Paragraph(string1 + " " + string2).setFont(font).setFontSize(fontSize);
doc.add(p);
doc.add(new LineSeparator(new SolidLine(1)).setMarginTop(-6));
}

より複雑な作業としては、string2を右側に整列させることがあります。

public void addParagraphWithTwoParts1(Document doc, PdfFont font, String string1, String string2, float fontSize) {
if (string1 == null) string1 = "";
if (string1.length() > 10)
string1 = string1.substring(0, 10);
Text chunk1 = new Text(string1).setFont(font).setFontSize(fontSize);
if (string2 == null) string2 = "";
if (string1.length() + string2.length() > 100)
string2 = string2.substring(0, 100 - string1.length());
Text chunk2 = new Text(string2).setFont(font).setFontSize(fontSize);
Paragraph p = new Paragraph();
p.add(chunk1);
p.addTabStops(new TabStop(1000, TabAlignment.RIGHT));
p.add(new Tab());
p.add(chunk2);
doc.add(p);
doc.add(new LineSeparator(new SolidLine(1)).setMarginTop(-6));
}

ご覧のとおり、空白を追加する必要なく、TabStopのみを使用します。

p.addTabStops(new TabStop(1000, TabAlignment.RIGHT));
p.add(new Tab());

string1とstring2が数字で構成されたサンプルコードを作成してみました。サンプルコードは以下のとおりです。

イメージ説明

スクリーンショットでstring2が右側に整列されており、string2がstring1のすぐ次に追加されたサンプルコード(ただし、空白1個により分離されている。)をご覧いただけます。

投稿2019/07/09 07:20

編集2019/07/09 07:33
iText_A

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azuapricot

2019/07/09 07:57

コードをのせるのはいいですがせめてマークダウンつかいましょー
iText_Q

2019/08/08 05:07

すみません。マークダウンをつけようとしましたがなぜか破れてしましました。使い方をよくわかりませんので・・・失礼しました。
guest

0

それぞれの文字列長を出して、合計10を超える分は文字列を切り詰めるなりするということになりますね

投稿2019/07/09 07:10

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問