2017年3月24日金曜日

PDF GetPageRotation /Rotate 0 90 180 270 正規化する

/Rotate 90 は時計回りに 90 度回転します。


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