We're sorry Aspose doesn't work properply without JavaScript enabled.

Free Support Forum - aspose.com

Aspose.Words for Java 見出しの指定方法

①Asposeのメソッド等を使用することで
特定の文字列と完全一致する行に対して、WORDの見出しを設定することは出来ますか。
Aspose問合せ_技術TM課題114(1)_製造QA157.zip (79.2 KB)

②Asposeのメソッド等を使用することで
②で設定したWORDの見出しを元に、WORDの「目次の更新」を行うことは出来ますか。

@dirbi,

ご質問ありがとうございます。 あなたの1)入力Word文書とあなたの2)期待しているWord文書をZIP形式でアップロードしてアップロードしてください。 MS Wordを使用して、この期待されるWord文書を作成してください。 最終的な出力をどのように生成するかについて、期待される文書の構造を調査します。

①と②に対して1)入力Word文書と2)期待しているWord文書を、アップロードします。
調査をお願いいたします。Aspose問合せ_技術TM課題114(1)_製造QA157【追加資料】.zip (84.4 KB)

@dirbi,

段落に適切な見出しスタイルを適用するには、次のコードを使用します。

Document doc = new Document("D:\\temp\\40001_KS024_20171220165748.docx");
Paragraph targetPara = doc.getLastSection().getBody().getLastParagraph();
targetPara.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
doc.save("D:\\Temp\\awjava-18.5.docx");

特定の段落に適切な見出しスタイルを適用したら、次の記事のコードを使用してコンテンツテーブルを挿入できます。

https://docs.aspose.com/display/wordsjava/Use+DocumentBuilder+to+Insert+Document+Elements#UseDocumentBuildertoInsertDocumentElements-InsertingaTableofContents

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

※②について、先に返答いたします。

実現したいのは
②-1) WORDに対して、見出しの検索とそのページ番号を取得する方法
②-2) WORD内の文字を置換

です。WORDの「表の挿入」方法ではありません。

1)入力Word文書と2)期待しているWord文書を元に
②-1)と②-2)の実現イメージを送付いたします。ご確認をお願いいたします。Aspose問合せ_技術TM課題114(1)_製造QA157【追加資料2】.zip (240.2 KB)

@dirbi,

このWord文書(input.zip (20.1 KB))と次の文字列を考えてみましょう:

第1【委託会社等の概況】

この要件を満たすには、次のコードを使用します(出力を参照 output.zip (14.3 KB))。

Document doc = new     Document("D:\\temp\\176514\\a.docx");

String str="第1【委託会社等の概況】";

Paragraph para1 = null;
Paragraph para2 = null;

for (Paragraph para : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)) {
    if (para.toString(SaveFormat.TEXT).trim().startsWith(str)) {
        if (para.getAncestor(NodeType.TABLE) != null) {
            para1 = para;
        } else {
            para2 = para;
        }
    }
}

LayoutCollector collector = new LayoutCollector(doc);
int pageNumber = collector.getStartPageIndex(para2);

Cell cell = (Cell)para1.getAncestor(NodeType.CELL);
Run run = ((Cell)cell.getNextSibling()).getFirstParagraph().getRuns().get(0);
run.setText(""+pageNumber);

doc.save("D:\\Temp\\176514\\awjava-18.5.docx");

質問を変えます。

添付ファイル:
①inputWordFile.docx
②outputWordFile.docx
③image.xlsx ⇒sheet1(inputFile), sheet2(outputFile)
0601Aspose再質問資料.zip (1.1 MB)

@dirbi,

次のコードを試してみてください。このコードで生成されたoutput(awjava-18.5.zip (14.5 KB))があなたに受け入れられるのかどうかお知らせください。

Document doc = new Document("D:\\temp\\176514\\7\\inputWordFile.docx");

Table table = null;
for(Paragraph para : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)){
    if (para.toString(SaveFormat.TEXT).trim().contains("・・・・・・・・")){
        table = (Table) para.getAncestor(NodeType.TABLE);
        break;
    }
}

if (table != null){
    for(Paragraph para : (Iterable<Paragraph>) table.getChildNodes(NodeType.PARAGRAPH, true)){
        if (para.toString(SaveFormat.TEXT).trim().contains("・・・・・・・・")){
            String compareStr = para.toString(SaveFormat.TEXT).replace("・","").trim();

            for(Paragraph paragraph : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)){
                if (para != paragraph && paragraph.toString(SaveFormat.TEXT).trim().equals(compareStr)){
                    if (para.getParagraphFormat().getLeftIndent() == 5.25){
                        paragraph.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_1);
                    }
                    else if (para.getParagraphFormat().getLeftIndent() == 15.75){
                        paragraph.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_2);
                    }
                    else if (para.getParagraphFormat().getLeftIndent() == 28.75){
                        paragraph.getParagraphFormat().setStyleIdentifier(StyleIdentifier.HEADING_3);
                    }
                }
            }
        }
    }

    DocumentBuilder builder = new DocumentBuilder(doc);
    builder.moveTo(table.getPreviousSibling());
    builder.insertTableOfContents(" \\o \"1-3\" \\h \\z \\u ");

    table.remove();

    doc.updatePageLayout();
    doc.updateFields();
}

doc.save("D:\\Temp\\176514\\7\\awjava-18.5.docx");

インデントについてお聞きします。
Indentのサイズですが、単位がわかりません。
inputWordFileのIndentサイズとソース判定の数値の関係がよくわかりません。

if (para.getParagraphFormat().getLeftIndent() == 5.25)

@dirbi,

MS Wordで "inputWordFile.docx"を開いてください。 カーソルをターゲットテーブルの3番目のページに移動します。 Paragraphプロパティで、TableのこれらのParagraphsに特定の左インデント値があることがわかります(スクリーンショットを参照)。 私の前の記事で述べたように、インデントに基づいて段落を識別し、論理を構築することができます。 Aspose.Wordsはインデント値をポイントで表します。 そして72ポイントは1インチに等しい。

How to set the indent size to 17 mm。
(17 mm == 48.18897637795276 point)???

para.getParagraphFormat().setLeftIndent(xxxxxxxxxxx);

@dirbi,

Please try using the following code:

paragraph.getParagraphFormat().setLeftIndent(ConvertUtil.millimeterToPoint(17));

有難うございます。
もう一つ、updateFieldsに関する質問があります。
updateFields処理後、ページ数が間違っています。

※my source code
Document doc = new Document(input.docx);

Table table = null;
for(Paragraph para : (Iterable) doc.getChildNodes(NodeType.PARAGRAPH, true)){
if (para.toString(SaveFormat.TEXT).trim().contains("・・・・・・・・")){
table = (Table) para.getAncestor(NodeType.TABLE);
break;
}
}

DocumentBuilder builder = new DocumentBuilder(doc);
builder.moveTo(table.getPreviousSibling());
builder.insertTableOfContents(" \o “1-2” \h \z \u ");

table.remove();

doc.updatePageLayout();
doc.updateFields();
doc.save(output.docx);
0608_UpdateFields.zip (4.9 MB)

@dirbi,

ご質問ありがとうございます。 私たちはシナリオをテストし、同じ問題を私たちの目的のために再現することができました。 訂正のために、私たちはこの問題を当社の問題追跡システムに記録しました。 この問題のIDはWORDSNET-16973です。 この問題の詳細をさらに調査し、この問題のステータスを更新します。 ご迷惑をおかけして申し訳ありません。

もう一つ、質問があります。
違う方法で試しましたが、同じく取得したページ数が誤っています。
0613_getpageNumber.zip (6.5 MB)
※my source code
Document doc = new Document(wordFileName);
LayoutCollector collector = new LayoutCollector(doc);
Table table = null;
for(Paragraph para : (Iterable) doc.getChildNodes(NodeType.PARAGRAPH, true)){
if (para.toString(SaveFormat.TEXT).trim().contains("・・・・・・・・")){
table = (Table) para.getAncestor(NodeType.TABLE);
break;
}
}
if (table != null){
for(Paragraph paraTable : (Iterable) table.getChildNodes(NodeType.PARAGRAPH, true)){
if (paraTable.toString(SaveFormat.TEXT).trim().contains("・・・・・・・・")){
Paragraph para1 = null;
Paragraph para2 = null;
String mokujiKey = paraTable.toString(SaveFormat.TEXT).replace("・","").trim();
int cnt = 0;
for (Paragraph paragraph : (Iterable) doc.getChildNodes(NodeType.PARAGRAPH, true)) {
if (paragraph.toString(SaveFormat.TEXT).trim().startsWith(mokujiKey + “・・・・・・・・”) && paragraph.getAncestor(NodeType.TABLE) != null) {
para1 = paragraph;
if (“約款”.equals(mokujiKey)) {
break;
}
}
if (paragraph.toString(SaveFormat.TEXT).trim().equals(mokujiKey) && paragraph.getAncestor(NodeType.TABLE) == null) {
para2 = paragraph;
cnt++;
}
}
int pageNumber = 0;
if (para1 != null && para2 != null && cnt <= 1) {
pageNumber = collector.getStartPageIndex(para2);
pageNumber = pageNumber - 1;

		    	} else if (para1 != null && para1.toString(SaveFormat.TEXT).trim().startsWith("約款・・・・・・・・")) {
    	    		pageNumber = yakanPageNum;
		    	} else {
		    		return false;
		    	}
		    	Cell cell = (Cell)para1.getAncestor(NodeType.CELL).getNextSibling();
    	    	Run run = cell.getFirstParagraph().getRuns().get(0);
    	    	run.setText(""+pageNumber);
    	    	System.out.println(pageNumber);
			}
		}
	}
    doc.save(newFileName);

@dirbi,

最後にMS Word 2016で "input.docx"を開くと、次の文字列のページ番号が次のように表示されます。

  • 2【投資方針】==> 11
  • 4【手数料等及び課金】==> 36
  • 第2章【運営および運営】==> 62
  • 第3回【ファンドの経緯状況】=> 69

しかし、次の単純なAspose.Wordsコードを実行すると、

Document doc = new Document("D:\\temp\\0613_getpageNumber\\input.docx");

LayoutCollector collector = new LayoutCollector(doc);
for (Paragraph para : (Iterable<Paragraph>) doc.getChildNodes(NodeType.PARAGRAPH, true)) {
    if (para.toString(SaveFormat.TEXT).trim().contains("【投資方針】")) {
        System.out.println(para.toString(SaveFormat.TEXT).trim() + " --> " + collector.getStartPageIndex(para.getRuns().get(0)));
    }

    if (para.toString(SaveFormat.TEXT).trim().contains("【手数料等及び税金】")) {
        System.out.println(para.toString(SaveFormat.TEXT).trim() + " --> " + collector.getStartPageIndex(para.getRuns().get(0)));
    }

    if (para.toString(SaveFormat.TEXT).trim().contains("【管理及び運営】")) {
        System.out.println(para.toString(SaveFormat.TEXT).trim() + " --> " + collector.getStartPageIndex(para.getRuns().get(0)));
    }

    if (para.toString(SaveFormat.TEXT).trim().contains("【ファンドの経理状況】")) {
        System.out.println(para.toString(SaveFormat.TEXT).trim() + " --> " + collector.getStartPageIndex(para.getRuns().get(0)));
    }
}

しかし、次の単純なAspose.Wordsコードを実行すると、

出力は次のとおりです。

  • 2【投資方針】 ==> 10
  • 4【手数料等及び料金金】 ==> 37
  • 第2章【運営及び運営】==> 63
  • 第3回【ファンドの経緯状況】==> 70

Aspose.WordsはMS Word 2016と同じページ番号を返さなければなりません。修正のために、この問題を問題追跡システムに記録しました。 この問題のIDはWORDSNET-16995です。 この問題の詳細をさらに詳しく調べ、修正のステータスを更新します。 ご迷惑をおかけして申し訳ありません。

The issues you have found earlier (filed as WORDSNET-16995) have been fixed in this Aspose.Words for .NET 18.8 update and this Aspose.Words for Java 18.8 update.