1

親ページからPDFを生成するために使用されるiframeがあります。PDFメーカー(ABCpdf)には、変換するHTMLファイルが必要です。

私が現在行っていることは、以下を使用して親のHTMLをスクレイプすることです。

var temp;
temp=parent.document.body.parentNode.innerHTML;

次に、iframeのフォームを使用してサーバーに送信し、そこでマッサージしてiframeセクションなどを削除してから、PDFメーカーの一時的なHTMLファイルとして保存します。

ただし、結果のHTMLコードは、 etcの<BODY>代わりにマングルされ、IDの前後の引用符は削除されます。<body>

HTMLを取得するためのより良い方法はありますか?

ページをHTMLとして再生成しない理由は、親ページが複雑なレポートであるためです。これには、ユーザーがセクションを表示/非表示にしたり、テーブルの行を並べ替えたりできるようにするためのさまざまなコントロールが含まれています。したがって、取得するHTMLは、ユーザーのカスタマイズを反映している必要があります。

ありがとう

4

2 に答える 2

1

ページのDOMにアクセスしてHTMLにシリアル化すると、ブラウザがデータをシリアル化する方法に関係なくデータを取得できます。仕様に関する限り、大文字のタグ名と属性値の前後のオプションの引用符の省略は問題ありません。

元のソースが必要な場合は、XHRを使用してHTTPリクエストを作成し、それを最新の状態にする必要があります。

于 2011-02-23T17:44:59.587 に答える
1

David が述べたように、 を使用するinnerHTMLと、ほとんどブラウザに翻弄されます。シリアル化を制御したい場合は、ノードの文字列表現をバッファーに追加して、親ドキュメントの DOM を自分でウォークすることができます。これには時間がかかり、より多くのコードが必要になりますが、出力を完全に制御できます。

このようなもの(疑似コード):

function serializeAttributes(node, buffer) {
  for (attribute in node.attributes) {
    buffer.append(' ' + attribute.name + '="' + attribute.value + '"');
  }
}

function serializeChildren(node, buffer) {
  for (child in node.childNodes) {
    if (child is a text node) {
      buffer.append(child.value);
    } else if (child is an element) {
      // You can also add checks to avoid going into IFrames, etc.
      serializeElement(child, buffer);
    }
  }
}

function serizalizeElement(node, buffer) {
  buffer.append('<' + node.tagName); 
  serializeAttributes(node, buffer);
  if (node.hasChildren) {
    buffer.append('>');
    serializeChildren(node, buffer);
    buffer.append('</' + node.tagName + '>');
  } else {
    buffer.append('\>');
  }
}

serializeNode(window.parent.document);
于 2011-02-23T19:46:13.670 に答える