/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(); } } }