PDFの相互参照表(xref)

xref
x y

でxのオブジェクトを連番でy個示すとのこと。

xxxxxxxxxx yyyyy f [EOL]

xxxxxxxxxx:10桁のファイル先頭からのバイトオフセット
yyyyy:生成番号
f:使用中かを示すワード「n」(使用中)or「f」(フリー)
改行記号を入れて20バイトとのこと
fのあとは、[スペース]+[\n]もしくは[\r]+[\n]とのこと。
本当なのだろうか。。。

PDFのストリームについて

ストリームのオブジェクトの構造は大体こう

x y obj<>stream[改行]
[data][改行]
endstream
endobj

ストリームのデータサイズは、[data]の長さで[改行]は含まないとのこと。
[改行]は「CR+LF」or「LF」とのこと。

※CR:0x0d LF:0x0a

改行コードによりstream~endstream間の大きさが異なるので
読み飛ばすときには注意が必要。
しかも、改行コードはファイル内でも統一されてるとは限らないっぽい。
めんどくさい。

Lengthの値を後ろで参照させる場合有(/Length xx yy R)
この場合は大抵ストリームの後ろにあるので読み飛ばせずに
ストリームを読み続けるしかないのか?
また調べよう。
先に入れて欲しいなー。


フィルターとかについては、またいつか。

WriteableBitmapの一部を抜き出す方法

/// <summary>
/// 元画像の一部を抜き出した画像の作成
/// </summary>
/// <param name="bitmap">元画像</param>
/// <param name="rectangle">抜き出す領域</param>
/// <returns>抜き出した画像</returns>
static public WriteableBitmap _TrimingImage(WriteableBitmap bitmap , System.Windows.Int32Rect rectangle)
{
   WriteableBitmap miniImage = new WriteableBitmap(rectangle.Width , rectangle.Height , 96 , 96 , System.Windows.Media.PixelFormats.Gray8 , BitmapPalettes.Gray256);
   miniImage.Lock();
   //コピーしたい画像データの一時格納先
   byte[] buffer = new byte[miniImage.PixelWidth * miniImage.PixelHeight];
   //一時格納先にデータの保存
   bitmap.CopyPixels(rectangle , buffer , miniImage.BackBufferStride , 0);
   //保存先にデータの書き込み
   miniImage.WritePixels(new System.Windows.Int32Rect(0 , 0 , miniImage.PixelWidth , miniImage.PixelHeight) , buffer , Convert.ToInt32(miniImage.BackBufferStride) , 0);
   miniImage.Unlock();
   return miniImage;
}