0

Java アプリで SQL クエリから pdf を生成しています。印刷する4M pdfがあります。

15092番目のpdf。このエラーが発生しています

Invalid xml character (unicode 0xc) was found in the element content of the document

他のブログが言っているように置き換えてみました。

    html = html.replaceAll("\000"," ");
    html = html.replaceAll("/\u000c+/g", "");

どれが自分のhtmlに配置したのかわかりません。

アイデアのある人はいますか?

ありがとう!

4

1 に答える 1

1

交換を行うにはいくつかの方法があります。コードをコピーするだけでなく、理解することがより重要だと思うので、もう少し詳しく説明します。

  1. 単純な文字単位の置換。特定の文字の出現を置き換えたいだけなので、これはあなたの場合に機能します。あなたの文字は制御文字であるため、(通常)直接挿入することはできませんが、次のいずれかの方法で挿入できます。

    • ユニコード参照:html=html.replace('\u000c', ' '); // hexadecimal value == 0xc
    • 8 進数参照:html=html.replace('\14', ' '); // 0xc == 014
    • その意味で: html=html.replace('\f', ' '); // character 0xc is a form-feed

    Unicode 参照は、Java パーサーの前に処理されるため、Java 言語にとって特別な意味を持つ文字では機能しないため、少し注意が必要です。しかし、フォームフィードでは機能します。

  2. 正規表現の使用。これは、このタスクに対する大規模なソリューションですが、正規表現構文の有効なサブセットである単一文字の完全一致の実行として機能します。したがって、上記のすべてのバリアントを使用して、メソッド名を に置き換え、replaceAllパラメータを文字列に変更することにより、正規表現ベースのソリューションを構築できます。たとえばhtml=html.replaceAll("\14", " "); 、この場合、文字参照はコンパイラによって生成されたままであり、正規表現に対して特別な意味はありません。表現エンジン。正規表現エンジンを積極的に使用する場合、Java 言語の文字参照と同様の選択肢があります。

    • ユニコード参照:html=html.replaceAll("\\u000c", " ");
    • 16 進参照:html=html.replaceAll("\\x0c", " "); // no Java equivalent
    • 8 進数参照:html=html.replaceAll("\\014", " "); // note the subtle difference
    • その意味で: html=html.replaceAll("\\f", " ");

違いは、これらのシーケンスが Java 言語レベルでバックスラッシュを ( 2 つのバックスラッシュを介して) 挿入し、正規表現エンジンによって処理される正規表現を形成することです。したがって、Unicode リファレンスは、ここにあるすべての文字に対して機能します。構文全体は、http: //docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.htmlで説明されています。

しかし、すでにあなたのタスクについて述べたように、単純な文字マッチングで十分です。

では、なぜあなたの例が機能しないのですか?

html = html.replaceAll("\000"," "); このシーケンス\0は、制御文字 0x0 への参照として解釈され、その後に 2 つのゼロが続きます。NULそのため、2 つのゼロが続く制御文字のシーケンスを見つけようとします。

html = html.replaceAll("/\u000c+/g", ""); このシーケンスは文字'/' '\f'(正しい Unicode シーケンスで定義)で構成されます'+' '/' 'g'。Java の正規表現ではプラス記号だけが特別な意味を持ちます。「少なくとも1つ」と「見つかる限り」という意味です。したがって、このコードは文字 0xc のシーケンスを探しますが、それらがスラッシュで囲まれ、その後に'g'.

于 2013-09-10T08:15:38.193 に答える