Web Analytics

Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

特定フォルダ配下のPDFファイルを一括、右綴じ変換 操作編

f:id:espio999:20170917122716p:plain
いわゆる自炊した文書をスキャンニングしてPDF化した際、その文章フォーマットに関わらず、そのファイルは左綴じの文書として処理されます。見開きで表示すると、左側に奇数ページ、右側に偶数ページの順に配置されます。
日本語のような縦書き文書の場合、右綴じの文書として処理され、見開き表示では右に奇数ページ、左に偶数ページを配置してほしいところです。

単一のファイルを操作する場合、このための設定変更はファイルのプロパティを変更します。Adobe Acrobatの場合でいうと、トップ画像の赤丸の部分を操作することになる。

一度に複数のファイルについて同様の操作を施す場合、何とか効率化したいところです。ここでは次のツールを活用して、対応方法を紹介します。

VB.Net (Visual Studio 2017 Community)
iText 7

長くなるため、次のエントリーに分割して紹介します。

  1. 調査:PDFファイルの変更箇所
  2. 操作:変更操作に対応するiText 7のコード
  3. 実装1:Visual Studio 2017へのiText 7導入
  4. 実装2:Visual Studio 2017での実装

この投稿では、「操作:変更操作に対応するiText 7のコード」を扱います。

iText 7はJオープンソースのPDF操作ライブラリです。Java、.Netから利用できます。利用可能なAPIは、こちらから参照することができます。
iText 7 7.0.4 API

今回の操作ではPdfDocumentクラスを利用します。iText 5までのPdfStamperクラスに相当します。次のチュートリアルが参考になるでしょう。
developers.itextpdf.com

Directionの操作は、PdfViewerPreferencesクラスを参照します。次のチュートリアルが参考になるでしょう。
developers.itextpdf.com

PdfViewerPreferencesクラスにあるSetDirectionを通じて、Directionへ定数RIGHT_TO_LEFTを代入することになります。

次の手順の操作を想像します。

  1. 変更元となるPDFファイルを用意する。
  2. 変更元ファイルのコピーを変更先PDFファイルとする。
  3. DirectionにR2Lを定義する。
  4. Directionを変更先PDFファイルへ反映する。

iText 7では、この手順を次のコードで実装することになります。VB.Netでの記述例です。

Dim myReader As New PdfReader(変更元ファイルのパス)
Dim myWriter As New PdfWriter(変更先ファイルのパス)
Dim myPDF As New PdfDocument(myReader, myWriter)
Dim myPreference As New PdfViewerPreferences

myPreference.SetDirection(PdfViewerPreferences.PdfViewerPreferencesConstants.RIGHT_TO_LEFT)
myPDF.GetCatalog().SetViewerPreferences(myPreference)

myPDF.Close()
myWriter.Close()
myReader.Close()

このコードをメインロジックとして、プログラムを実装します。
impsbl.hatenablog.jp