空談録

世界で5人くらいに役立ちたい

OneNoteを痛くしようと思ったけど

3次元の世界でOneNoteさんに会ったらとりあえず腹パンから入ります

単純に言うとOneNoteのわからない部分が多すぎて話になりませんでした。一応記事を読むと痛くはできる…かも
問題はこの方法だと私が書く必要がないというあれ

そもそも背景に画像を出すことはできるのか

これはできます。標準で
試しにプロ生ちゃんで作るとこんな感じ

f:id:fantasticswallow:20150426212338j:plain

…若干透明度が低かったですね……もうちょっと薄くてよかった

やり方は画像をOneNoteに張り付けて、画像を選択した状態でコンテキストメニューから"画像を背景に設定"を選べばいいだけです

f:id:fantasticswallow:20150426211834p:plain

背景に設定すると画像は直接選択できなくなり、その上にテキストを普通におけるようになります
そのため、好きな画像を適当な大きさで適当な位置に置いて背景に設定すれば痛ノートの完成です

いちいち設定が面倒だと思ったら、画像を背景に設定した時点で"ページテンプレート"でペイン呼び出して"現在のページをテンプレートとして保存"を利用して既定のテンプレートにしてしまえばどんなにページを生やしても痛ノートになります

まあこの手のはググればどこにでもありそうですね。なので別の手はないかなと考えたりしたんですよ。無理でしたが
以下どうでもいい情報。というより役に立たない情報

OneNoteのxsdとxml

OneNoteユーザーなら一度は目にしたことのあるOneNotexmlですが、なんだか摩訶不思議です

とりあえず背景設定した状態のone:Imageのxmlを見てみましょう

  <one:Image format="jpg" backgroundImage="true" objectID="{}{}{}" lastModifiedTime="2015-04-26T12:21:01.000Z">
    <one:Position x="36" y="14.4000034332275" z="0" />
    <one:Size width="496.7998046875" height="835.562866210938" isSetByUser="true" />
    <one:CallbackID callbackID="{}{}{}" />
  </one:Image>

このImage自体はone:Pageの要素です
つまるところこんな感じのImageのオブジェクトをPageの要素に追加すればいいと考えるじゃないですか

というわけでまずはxmlの定義を確認します
OneNoteのxsdは OneNote 2013 COM API XML Schema - OneNote 2013 XSD - Engineering OneNote Blog - Site Home - MSDN Blogs からダウンロードできます

まあ99%の人はそんなxsdをいちいち読みたいと思わないでしょうしImageの定義を書いておくと

	<!-- Image -->
	<xsd:complexType name="Image">
		<xsd:annotation>
			<xsd:documentation xml:lang="en">
				Definition of an image.

				The data is either referenced in a file or is included inlined, Base64 encoded.
			</xsd:documentation>
		</xsd:annotation>
		<xsd:complexContent>
			<xsd:extension base="PageObjectTagable">
				<xsd:sequence>
					<xsd:choice>
						<xsd:element name="File" type="FilePath"/>
						<xsd:element name="Data" type="xsd:base64Binary"/>
						<xsd:element name="CallbackID" type="CallbackID"/>
					</xsd:choice>
					<xsd:element name="OCRData" type="OCRData" minOccurs="0"/>
					<xsd:element name="Preview" type="Preview" minOccurs="0"/>
				</xsd:sequence>
				<xsd:attribute name="format" type="ImageFormat" default="auto"/>
				<xsd:attribute name="xpsFileIndex" type="xsd:nonNegativeInteger"/>
				<xsd:attribute name="originalDocumentNumber" type="xsd:nonNegativeInteger" default="0"/>
				<xsd:attribute name="originalPageNumber" type="xsd:nonNegativeInteger" default="0"/>
				<xsd:attribute name="isPrintOut" type="xsd:boolean" default="false"/>
				<xsd:attribute name="backgroundImage" type="xsd:boolean" default="false"/>
				<xsd:attribute name="hyperlink" type="xsd:string" />
				<xsd:attribute name="alt" type="xsd:string" />
				<xsd:attribute name="sourceDocument" type="GUID" />
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

	<!-- PageObject. -->
	<xsd:complexType name="PageObject">
		<xsd:annotation>
			<xsd:documentation xml:lang="en">
				Base type for objects that can live on the page.
			</xsd:documentation>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:element name="Position" type="Position" minOccurs="0"/>
			<xsd:element name="Size" type="Size" minOccurs="0"/>
			<xsd:element name="Meta" type="Meta" minOccurs="0" maxOccurs="unbounded"/>
		</xsd:sequence>
		<xsd:attribute name="objectID" type="ObjectID"/>
		<xsd:attribute name="selected" type="Selection" default="none"/>
		<xsd:attribute name="lastModifiedTime" type="xsd:dateTime"/>
	</xsd:complexType>

	<!-- PageObjectTagable. -->
	<xsd:complexType name="PageObjectTagable">
		<xsd:annotation>
			<xsd:documentation xml:lang="en">
				Base for page objects that support media and noteflags.
			</xsd:documentation>
		</xsd:annotation>
		<xsd:complexContent>
			<xsd:extension base="PageObject">
				<xsd:sequence>
					<xsd:element name="MediaIndex" type="MediaIndex" minOccurs="0" maxOccurs="unbounded"/>
					<xsd:element name="Tag" type="Tag" minOccurs="0" maxOccurs="unbounded"/>
					<xsd:sequence minOccurs="0" maxOccurs="1">
						<!-- Ideally this'd be
							<element name=Tag minoccurs=0 maxoccurs=unbounded>
							<element name=outlooktask minoccurs=0 maxoccurs=1>
							<element name=Tag minoccurs=0 maxoccurs=unbounded>
						   but the schema validator thinks that's ambiguous, so hence the optional sequence -->
						<xsd:element name="OutlookTask" type="OutlookTask" minOccurs="1" maxOccurs="1"/>
						<xsd:element name="Tag" type="Tag" minOccurs="0" maxOccurs="unbounded"/>
					</xsd:sequence>
				</xsd:sequence>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

長い
extensionがあるせいで長くなりすぎた
まあ必要だったら読んでください

とりあえず見ている限り必要かなと思ったのは
・Position
・Size
・File(Data)
くらいで行きたいと思うじゃないですか?思ってください

まずは次のxmlでテスト

  <one:Image format="jpg" backgroundImage="true">
    <one:File path="F:\User\hogehoge.jpg" />
    <one:Position x="0.0" y="0.0" z="0"/>
  </one:Image>

Sizeが抜けてますがあっても一緒です

xmlからの変更はMicrosoft.Office.Interop.OneNote.ApplicationClass.UpdatePageContentからやります
使い方は超簡単、引数にページ全体のxmlを入れるだけ!
…まあ先にGetPageContentするのが一般的でしょうが
(一般にこんなメソッド呼ぶ人間がいるのかとか言ってはいけない)

さて、とりあえずさっきのxmlでやるとこんな風なエラーが返ってきます

System.Runtime.InteropServices.COMException (0x80042001): エラーを特定できません


親要素 '{http://schemas.microsoft.com/office/onenote/2013/onenote}Image' のコンテンツ モデルによると、要素 '{http://schemas.microsoft.com/office/onenote/2013/onenote}Position' は予期していなかった要素です。

{http://schemas.microsoft.com/office/onenote/2013/onenote}OCRData, {http://schemas.microsoft.com/office/onenote/2013/onenote}Preview が必要です。

えっ、お前extensionで定義してるやんけ、何言いだしたの
っていうかさっきの画像のXMLにOCRDataもPreviewもないやん、どうしたってなります

Sizeとか定義しても同じこと言われます
じゃあどうするかというとPositionとかSizeなしで要素をFileだけにすると通ります。意味が分からん

推測なんですけどおそらく外部からのxmlと内部でのxmlの扱いが違う、もしくは要素の組み合わせが存在するという感じだと思われます
つまるところCallbackIDで指定する場合はPositionとかが使えるみたいな
どこを見ればいいんだ…いったい何を信じれば…


というわけで1日くらいこんなことしてましたが完全なる無駄でした
Onetasticが画像の追加を許可していない時点で気づくべきだったのだ

もしコードからもげれるならアドイン作ってもよかったですけどご覧の状況ですのでやりません。潔くテンプレート作って遊びましょう

残るOfficeのクライアントを見返してもいまいち痛くするものが残っていないのでそろそろあきらめたさ
いや確かに種類はありますけど私が使って無いという決定的な問題が

この辺で