/Rotate を付けてもらうには…
- Adobe Acrobat 8.0 を使用
- 複合機でスキャンした PDF を回転
サンプル PDF はこちら。
/Rotate の付与状況は PDFXplorer で確認できます。
こうしてできてしまった PDF を正規化するサンプルコード。iTextSharp 4.1.6 を使用しています。
public void MakePdf2(string fppdfIn, string fppdfOut) {
// https://www.codeproject.com/Articles/277065/Creating-PDF-documents-with-iTextSharp
using (var si = File.OpenRead(fppdfIn)) {
PdfReader reader = new PdfReader(si);
reader.ConsolidateNamedDestinations();
using (var fs = File.Create(fppdfOut)) {
Document document = null;
PdfWriter writer = null;
int numPages = reader.NumberOfPages;
for (int pageNum = 1; pageNum <= numPages; pageNum++) {
var pageSizeAfterRotation = reader.GetPageSizeWithRotation(pageNum);
if (document == null) {
document = new Document(pageSizeAfterRotation);
writer = PdfWriter.GetInstance(document, fs);
document.Open();
}
else {
document.SetPageSize(pageSizeAfterRotation);
document.NewPage();
}
PdfTemplate background = writer.GetImportedPage(reader, pageNum);
float[] transferMatrix = new float[6];
switch (reader.GetPageRotation(pageNum)) {
case 0:
default:
transferMatrix[0] = 1;
transferMatrix[3] = 1;
break;
case 270:
transferMatrix[0] = (float)Math.Cos((float)(270 / 180.0f * Math.PI));
transferMatrix[1] = (float)-Math.Sin((float)(270 / 180.0f * Math.PI));
transferMatrix[2] = -transferMatrix[1];
transferMatrix[3] = transferMatrix[0];
transferMatrix[4] = pageSizeAfterRotation.Width;
//transferMatrix[5] = pageSizeAfterRotation.Height;
break;
case 180:
transferMatrix[0] = (float)Math.Cos((float)(180 / 180.0f * Math.PI));
transferMatrix[1] = (float)-Math.Sin((float)(180 / 180.0f * Math.PI));
transferMatrix[2] = -transferMatrix[1];
transferMatrix[3] = transferMatrix[0];
transferMatrix[4] = pageSizeAfterRotation.Width;
transferMatrix[5] = pageSizeAfterRotation.Height;
break;
case 90:
transferMatrix[0] = (float)Math.Cos((float)(90 / 180.0f * Math.PI));
transferMatrix[1] = (float)-Math.Sin((float)(90 / 180.0f * Math.PI));
transferMatrix[2] = -transferMatrix[1];
transferMatrix[3] = transferMatrix[0];
//transferMatrix[4] = pageSizeAfterRotation.Width;
transferMatrix[5] = pageSizeAfterRotation.Height;
break;
}
var ww = writer.DirectContentUnder;
ww.AddTemplate(background, transferMatrix[0], transferMatrix[1], transferMatrix[2],
transferMatrix[3], transferMatrix[4], transferMatrix[5]);
}
document.Close();
writer.Close();
}
}
}

