ONLYOFFICE Nextcloud連携における「トークンが無効です」エラーを修正する
JWTシークレット、認証ヘッダー、Docker設定、プロキシの動作、コネクタの状態を確認することで、NextcloudにおけるONLYOFFICEの「トークンが無効です」エラーを修正します。
名前、住所、日付、その他のテキストフィールドに対して、LibreOffice Writerで完璧な差し込み印刷を作成できたとしても、受信者ごとに異なる写真、署名、製品画像、QRコード、またはバッジが必要になった途端、シンプルなワークフローが複雑になってしまうことに気づくでしょう。その理由は重要です。Writerのドキュメントに記載されている差し込み印刷フィールドは、テキストプレースホルダーとして使用されるデータベースフィールドだからです。LibreOfficeは埋め込み画像やリンク画像もサポートしていますが、現在のヘルプには、レコードごとにファイルパス列から画像を自動的に置き換えるネイティブの「差し込み印刷画像フィールド」に関するドキュメントがありません。
選択肢は2つあります。結合する文書すべてで同じロゴや背景画像を使用する場合は、通常のWriterの差し込み印刷機能を使用し、テンプレートにその画像を固定します。行ごとに画像を変更する必要がある場合は、テキストと画像データをCalcに保持し、Writerテンプレートに名前付きグラフィックオブジェクトを予約して、LibreOffice Basicマクロで差し込み印刷を自動化する方が、より制御しやすい方法です。このガイドでは、後者の方法を採用します。
手順は、2026年に公開予定のLibreOffice 26.2のドキュメントに準拠しています。メニューは、他のリリースやmacOSでは若干異なる場合があります。LibreOfficeの現在のWriterガイドでは、画像を埋め込んだりリンクしたりできると記載されていますが、UNO APIはWriterグラフィックオブジェクトを公開しXTextGraphicObjectsSupplier、外部URLからグラフィックを自動化して設定できるようにします。これらの機能により、標準のメールマージウィザードでは専用の画像フィールドとして公開されていなくても、レコードごとの画像ワークフローが可能になります。
| 要件 | 最善のアプローチ | 主なトレードオフ |
|---|---|---|
| すべての文字に同じロゴまたは写真が印刷されている | 標準ライターメールマージ | シンプルだが、映像は記録によって変わることはない |
| 受信者ごとに異なる画像 | Writerテンプレート + Calc + Basic/UNOオートメーション | 設定は増えるが、画像に対する制御は予測可能になる。 |
| データベースにはパスではなく画像自体が保存されます | データベース/フォームワークフローまたはカスタムUNOコード | 管理データベースには適しているが、スプレッドシートベースのマージよりも負荷が高い。 |
| 数百または数千もの文書が、無人で一括処理される | マクロまたは外部UNOスクリプト | テスト、ログ記録、およびファイルパスの管理が求められます。 |
使用する画像が固定の会社ロゴのみの場合は、ここで作業を終了し、通常のLibreOfficeの定型文書作成ワークフローを使用してください。この記事の残りの部分は、可変画像に関するものです。
ヘッダー行が 1 つと、各行にレコードが1 つある Calc シートを作成します。画像参照は独自の列に保持します。実用的なレイアウトはCustomerID、、、、、、およびです。FirstNameLastNameEmailImagePathOutputName

マージの作成とテスト中は、絶対パスを使用してください。絶対パスは移植性は劣りますが、曖昧さを排除できます。たとえば、C:\MailMerge\Imageslice.jpgWindows や/home/user/mailmerge/images/alice.jpgLinux では、ドキュメントの開き方によってベースディレクトリが変わる相対パスよりも、絶対パスの方が診断が容易です。
同一の運用ファイル内で、WindowsとLinuxのパス形式を混在させないでください。図中の混在例は、列に格納される値の型を示すためのものです。実際のデータソースでは、マージを実行するマシンで有効なパスを使用する必要があります。
適切なOutputName列を使用することで、ファイル名の衝突も防ぐことができます。メールアドレスや任意の自由記述テキストではなく、安定したIDまたはサニタイズされた名前を使用することをお勧めします。同じ値が2回出現する場合は、マクロが上書きするか、接尾辞を追加するか、または処理を失敗させるかを事前に決定してください。
Writer の標準差し込み印刷では、登録済みのデータ ソースを使用します。差し込み印刷ウィザード、住所データ ソース、またはデータ ソース ブラウザーを使用できます。最新の LibreOffice ヘルプには、[ツール] > [差し込み印刷ウィザード] の説明があり、 [挿入] > [フィールド] > [その他のフィールド] > [データベース]からデータベース フィールドを挿入することもできます。データベース フィールドの公式リファレンスを参照してください。

このチェックは、最終的なマクロがスプレッドシートを直接読み込む場合でも役立ちます。シートの間違い、予期しないヘッダー名、空のレコード、登録後に移動されたスプレッドシートなど、よくある問題を早期に検出できます。
通常のテキストのみの差し込み印刷では、列見出しを文書にドラッグするか、データベース タブから差し込み印刷フィールドを挿入できます。Writer の公式ヘルプでは、これらのフィールドは差し込み印刷の実行時にデータベースの内容に置き換えられることが確認されています。ただし、可変イメージについては、ImagePathページにドラッグしたからといってパスがイメージに変換されるとは限りません。コードがそれを解釈してグラフィック オブジェクトを更新しない限り、データのままです。
Writerで、手紙、証明書、バッジ、またはレポートのレイアウトを作成します。テキスト値には、通常の差し込み印刷フィールドを使用するか、マクロで置き換える場合は、<p> {FirstName}、{LastName}<p>、<p>などの明確なトークンを使用します。{CustomerID}
次に、可変画像を表示させたい場所にサンプル画像を挿入します。自動化する前に、希望するサイズ、折り返し、アンカーを設定します。LibreOffice では、Writer 26.2「画像とグラフィック」の章で、画像のサイズ、位置、アンカー、折り返し、リンクされた画像の動作について説明しています。

グラフィック オブジェクトには、 などの安定した名前を付けてくださいMergeImage。プロパティ ダイアログの表示はリリースによって異なる場合があるため、Writer がどのオブジェクトを公開しているか不明な場合は、[ツール] > [開発ツール]を使用してください。LibreOffice の開発ツールは、現在のドキュメント内のグラフィック オブジェクト、プロパティ、メソッド、およびインターフェイスを検査できます。そのため、内部オブジェクト名を推測するよりも安全な診断ツールとなります。
レイアウトを予測可能にするには、すべてのソース画像に同じアスペクト比を使用するか、トリミング方法を事前に決定してください。Writer では、プレースホルダーの寸法に合わせてグラフィックのサイズを変更できますが、縦長の写真を幅広のバナー型のフレームに挿入した場合、事前にファイルを正規化しない限り、見た目が不自然になります。
主要な自動化操作は簡単です。テンプレートを開き、テキストプレースホルダーを置き換え、指定されたグラフィック オブジェクトを見つけ、行の画像ファイルをそのオブジェクトに読み込み、結果をエクスポートします。LibreOffice の UNO API ドキュメントにgetGraphicObjects()は、埋め込みグラフィックとリンクされたグラフィックへのアクセス方法と、TextGraphicObjectグラフィック プロパティのサービスが記載されています。このGraphicURLプロパティは、一般的なオブジェクト ストレージでは非推奨となり、 が推奨されていますGraphicが、現在の API では、外部 URL を設定すると、その画像がグラフィック オブジェクトに読み込まれることが明示的に示されています。そのため、ローカル ファイル パスを使用するシンプルな Basic マクロには便利です。

以下の例は意図的に小規模に作成されています。3つのパス、シート名、列インデックス、プレースホルダー名を、ご自身のファイルに合わせて変更してください。大量のデータを実行する前に、2つのレコードでテストしてください。
Sub MailMergeWithImages()
Dim calcDoc As Object, sheet As Object, doc As Object
Dim graphics As Object, imageObj As Object
Dim row As Long
Dim firstName As String, lastName As String
Dim imagePath As String, outputName As String
Dim sourceURL As String, templateURL As String, outputDir As String
sourceURL = ConvertToURL("C:\MailMerge\customers.ods")
templateURL = ConvertToURL("C:\MailMerge\LetterTemplate.odt")
outputDir = ConvertToURL("C:\MailMerge\Output")
calcDoc = StarDesktop.loadComponentFromURL(sourceURL, "_blank", 0, Array())
sheet = calcDoc.Sheets.getByName("Sheet1")
row = 1 ' row 0 contains headers
Do While sheet.getCellByPosition(0, row).String <> ""
firstName = sheet.getCellByPosition(1, row).String
lastName = sheet.getCellByPosition(2, row).String
imagePath = sheet.getCellByPosition(4, row).String
outputName = sheet.getCellByPosition(5, row).String
doc = StarDesktop.loadComponentFromURL(templateURL, "_blank", 0, Array())
ReplaceAll doc, "{FirstName}", firstName
ReplaceAll doc, "{LastName}", lastName
graphics = doc.getGraphicObjects()
If graphics.hasByName("MergeImage") Then
imageObj = graphics.getByName("MergeImage")
imageObj.GraphicURL = ConvertToURL(imagePath)
Else
MsgBox "Graphic object MergeImage was not found."
doc.close(True)
Exit Sub
End If
Dim args(1) As New com.sun.star.beans.PropertyValue
args(0).Name = "FilterName"
args(0).Value = "writer_pdf_Export"
args(1).Name = "Overwrite"
args(1).Value = True
doc.storeToURL(outputDir & outputName & ".pdf", args())
doc.close(True)
row = row + 1
Loop
calcDoc.close(True)
End Sub
Sub ReplaceAll(doc As Object, findText As String, replacement As String)
Dim d As Object
d = doc.createReplaceDescriptor()
d.SearchString = findText
d.ReplaceString = replacement
doc.replaceAll(d)
End Sub
このマクロはパターンであり、汎用的なドロップインプログラムではありません。LibreOffice のインストールでは、マクロのセキュリティ ポリシー、オペレーティングシステムのパス ルール、テンプレート レイアウトが異なる場合があります。重要な検証済み API コンセプトは、Writer がグラフィック オブジェクト コレクションを公開し、LibreOffice が外部 URL からグラフィックを設定できることです。大規模な展開の場合は、Graphic互換性動作に依存するのではなく、最新の APIを介してグラフィックを読み込むことを検討してくださいGraphicURL。公式のリファレンスは、XTextGraphicObjectsSupplierとTextGraphicObjectです。
データソース全体を処理する前に、意図的に異なる2~3行(JPG、PNG、そして理想的にはアスペクト比の異なる画像)を実行してください。スケールアップする前に、以下のすべてを確認してください。
最後の確認が重要なのは、リンクされた画像と埋め込まれた画像では動作が異なるためです。最新のWriterガイドでは、リンクされた画像は独立したファイル参照として扱われるのに対し、埋め込まれた画像はドキュメントの一部になると説明されています。ODTファイルを別のマシンに配信する場合は、結果がマージを実行したコンピューターにのみ存在するローカルパスに依存していないことを確認してください。
通常の差し込み印刷フィールドとして挿入しましたImagePath。これはテキストを生成することが想定されています。データソース内のパスはそのままにしておき、マクロでそのパスを名前付きグラフィックオブジェクトに読み込むようにしてください。
テンプレート画像がレコード間で変更されていないか、ループが固定セルを読み取っている可能性があります。2ImagePathレコードのテスト中に、行番号をログに記録してください。パスは変更されているのに画像が変更されていない場合は、開発ツールを使用してグラフィックオブジェクト名を調べてください。
グラフィックの名前が変更されたか、置き換えられたか、または想定していた名前で公開されていない可能性があります。画像を選択し、[ツール] > [開発ツール]で確認してください。UNO API はグラフィック オブジェクトを名前で公開するため、マクロとテンプレートは完全に一致している必要があります。
おそらく、外部ファイルを参照したままのドキュメントを保存してしまったのでしょう。移植性が重要な場合は、生成された成果物に画像を埋め込むか、画像を読み込んだ後にPDFにエクスポートしてください。LibreOfficeの画像ガイドでは、リンクされた画像と埋め込まれた画像の違い、およびファイルを埋め込むためにリンクを解除する方法について説明しています。
これは、メール出力形式を選択する前に確認しておくべき重要な制限事項です。LibreOffice ヘルプには、フォームレターが HTML 形式の場合、埋め込み画像やリンクされた画像はメールに添付されないと記載されています。画像が不可欠な場合は、HTML メールマージで画像が保持されると想定するのではなく、PDF ファイルを添付するか、別の配信ワークフローをテストしてください。「フォームレターの作成」を参照してください。
テキストフィールドですでに Writer のネイティブデータベースメールマージを使用しており、出力をプログラムで制御する必要がある場合は、LibreOffice もサービスを公開しています。ドキュメントMailMergeに記載されているプロパティにはDataSourceName、、、、、、、などがあります。この API はCommand、コードから標準のメールマージを自動化したい場合に便利です。ただし、レコードごとの画像ファイルパスフィールドについては、この API だけではドキュメント化されていないため、メールマージの実行とグラフィックオブジェクトの処理を組み合わせる必要がある場合があります。公式のMailMerge サービスリファレンスを参照してください。DocumentURLOutputURLFileNameFromColumnSaveAsSingleFile
ImagePath画像がレコードごとに異なる場合は、1つのきれいな列を使用してください。ほとんどの中小規模の作業では、CalcシートとWriterテンプレート、そして短いBasicマクロを組み合わせることで、透明性と制御性のバランスが最も良くなります。通常のテキスト差し込み印刷よりも設定に手間はかかりますが、どの行にどの画像が含まれているかを正確に確認し、出力ファイル名を選択し、数百ものパーソナライズされたファイルを送信する前に結果を検証することができます。
JWTシークレット、認証ヘッダー、Docker設定、プロキシの動作、コネクタの状態を確認することで、NextcloudにおけるONLYOFFICEの「トークンが無効です」エラーを修正します。
コールバック、内部URL、JWT、TLS、プロキシルーティング、ログ、ストレージを確認することで、NextcloudにおけるONLYOFFICEの「ドキュメントを保存できませんでした」エラーを修正します。
Collabora Onlineのソケット接続エラーを修正するには、26.04 WebSocketの変更点、プロキシルート、アップグレードヘッダー、タイムアウト、TLS、およびログを確認してください。
Collabora Onlineで多言語スペルチェックを有効にするには、サーバー辞書を追加し、言語コードを許可し、テキストに言語を割り当て、複数の言語を含む文書をテストします。
Calcデータ、名前付き画像プレースホルダー、およびBasicマクロを使用して、レコードごとに画像を挿入する信頼性の高いLibreOffice Writerメールマージを作成する方法を、トラブルシューティングと検証の手順とともに解説します。
WOPI、リバースプロキシ、TLS、DNS、WebSocket、およびサーバー間の接続可能性をチェックすることにより、Collabora Onlineのドキュメント接続障害を診断および修正します。
ONLYOFFICEデスクトップエディター(オフライン版)でPDFファイルを編集可能なDOCXファイルに変換します。「名前を付けて保存」の手順に従い、PDFファイルがスキャンされているか確認し、書式設定をチェックしてください。
SeafileをDockerまたは別のホストを使用してCollabora Onlineに接続します。デプロイメントのトレードオフを比較し、HTTPSとWOPIの設定を構成し、編集内容を確認します。
画像が多いLibreOffice Writerファイルで、入力、スクロール、保存が遅い場合の診断を行います。ディスプレイ設定をテストし、サイズの大きい画像を圧縮して、プロファイルまたはハードウェアの問題を特定します。
公式Helmチャートを使用して、Kubernetes上にCollabora CODEをデプロイします。イングレス、TLS、WOPIホストアクセス、シークレット、スケーリング、エンドツーエンドチェックを設定します。