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 を使用しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public void MakePdf2(string fppdfIn, string fppdfOut) {
 
  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();
    }
  }
}

0 件のコメント:

コメントを投稿