- 追加された行はこの色です。
- 削除された行はこの色です。
*QPDF とは? [#y4152cbf]
*QPDF [#headline]
QPDF は PDF ファイルの、内容を維持したままの構造的な変換をおこなうコマンドラインプログラムです。QPDF は pdf-to-pdf とでも呼ぶべきものです。QPDF はまた、PDF 生成ソフト開発者や PDF の中身を覗き見てみたい人たち向けの有用な機能を提供します。それらは PDF がどのようなものかを学ぶために役立ちます。
QPDF は PDF ファイルの内容を維持したまま構造的な変換を行うコマンドラインプログラムで,pdf-to-pdf
とでも呼ぶべきものです.PDF 生成ソフト開発者や PDF の中身を覗き見たい人たち向けにも有用な機能を提供し,これらは [[PDF]] がどのようなものかを学ぶために役立ちます.
''公式サイト''
-https://github.com/qpdf/qpdf
QPDF は PDF をリニアライズド ("WEB に最適化された") にしたり、暗号化したりできます。また、(PDF の比較的新しい機能である) オブジェクトストリームを持つ PDF ファイルからそれを持たない PDF に変換したり、逆にオブジェクトストリームを生成したりできます。QPDF は PDF ファイルをテキストエディタで編集するのを助ける特別なモードをサポートします。詳しくは [[QPDF のドキュメント:http://qpdf.sourceforge.net/files/qpdf-manual.html]] を見てください。
以上、QPDF のホームページより
QPDF は PDF を暗号化したり,Web 表示用に最適化(ここではリニアライズのみ)したり操作したり,解析したりするコマンドラインプログラム (qpdf) や,テキストエディタで PDF をいじるためのプログラム (qpdf --qdf と fix-qdf) や PDF を読み込み操作するためのライブラリ (libqpdf) からなります.
----
#contents
----
QPDF は PDF を暗号化したり、WEB 用に最適化 (ここではリニアライズのみ) したり操作したり、解析したりするコマンドラインプログラム (qpdf) やテキストエディタで PDF をいじるためのプログラム (qpdf --qdf と fix-qdf) や PDF を読み込み操作するためのライブラリ (libqpdf) からなります。
**コマンドラインプログラム qpdf の使い方 [#t6112193]
**コマンドラインプログラム qpdf の使い方 [#usage]
***基本的な機能 [#ce2aa5eb]
とりあえず暗号化するには
qpdf --encrypt upasswd opasswd 40 --modify=n -- input.pdf output.pdf
のようにします.ここで upasswd と opasswd はそれぞれユーザー,オーナーパスワードで,40 は暗号化鍵長です.それ以降から "--" まで許可設定フラグが続きます.
"--modify=n" の "n" ("y") は "modify" = 編集が非許可 (許可) であることを表します.
パスワードが不要な場合は空文字列 "" にしましょう.
許可設定フラグで指定可能な値は鍵長の値によって異なります.
qpdf --encrypt upasswd opasswd 40 --modify=n -- input.pdf output.pdf
暗号化による保護を解除するには
qpdf --password=パスワード --decrypt
のようにします.
のようにします。ここで upasswd と opasswd はそれぞれユーザー、オーナーパスワードで、40 は暗号化キー長です。それ以降から "--" まで許可設定フラグが続きます。"n" ("y") は "modify" = 編集が非許可 (許可) であることを表します。パスワードが不要な場合は空文字列 "" にしましょう。
リニアライズするには
qpdf --linearize input.pdf output.pdf
です.巨大な PDF の場合,リニアライズドにしておくと最初のページが表示されるまでの時間が短くなったり,特定のページを表示するのに部分ダウンロードが可能になります.
qpdf --linearize input.pdf output.pdf
PDF 1.5 のオブジェクト・ストリームを有効にするには
qpdf --object-streams=generate input.pdf output.pdf
です.古いビューアとの互換性の問題が生じますが,ファイルサイズがより小さくなります.
これを解除するには "generate" の代わりに "disable" を指定します.
です。巨大な PDF の場合、リニアライズドにしておくと最初のページが表示されるまでの時間が短くなったり、ページを表示するのに部分ダウンロードが可能になります。
ページの抽出と結合は
qpdf file1.pdf --pages file1.pdf 1-5 file2.pdf 3-8 -- output.pdf
これは file1.pdf からページ 1-5 を,file2.pdf からページ 3-8 を取り出し結合し,
output.pdf に出力します.
qpdf file1.pdf --pages file1.pdf 1-5 file2.pdf 3-8 -- output.pdf
***開発者向けの機能 [#sf176fe6]
これは file1.pdf からページ 1-5 を、file2.pdf からページ 3-8 を取り出し結合し、output.pdf に出力します。
ページオブジェクトのオブジェクト番号等を取得
qpdf --show-pages input.pdf
オブジェクトを抽出 (オブジェクト番号 3)
qpdf --show-object=3 input.pdf
***開発者向けの機能 [#sf176fe6]
ストリームオブジェクトを抽出
qpdf --show-object=6 --filtered-stream-data input.pdf
ページオブジェクトのオブジェクト番号等を取得
**QDF モードと fix-qdf [#a6b92b14]
qpdf --show-pages input.pdf
PDF の中身をテキストエディタでいじりたいときに役に立ちます.
qpdf --qdf input.pdf output.qdf
で output.qdf(中身は PDF だが拡張子を '''q'''df に代えてある)をつくり,テキストエディタで編集します.(この時点でホントは xref テーブルや Stream オブジェクトの Length 等がおかしくなり壊れた PDF になる)その後
fix-qdf < output.qdf > output.pdf
で修正すると output.'''p'''df は正当な PDF になります.
オブジェクトを抽出 (オブジェクト番号 3)
**libqpdf [#l2e5ffe5]
qpdf --show-object=3 input.pdf
libqpdf は PDF を読み込み操作したりする [[C++]] のライブラリです.
詳しくは http://github.com/qpdf/qpdf の
[[examples:http://github.com/qpdf/qpdf/tree/master/examples]] や [[include/qpdf/QPDF.hh:http://github.com/qpdf/qpdf/blob/master/include/qpdf/QPDF.hh]] あたりを参照してください。
ストリームオブジェクトを抽出
libqpdf でプログラミングするには PDF の構造や仕組みに関する詳細な知識を必要とします.これは PDF の構造をあまり意識しないで済む高水準の API を提供する PDFlib とは対照的です.PDF の生成もできますが,libqpdf にはグラフィックス描画関数などはありません.
qpdf --show-object=6 --filtered-stream-data input.pdf
試しに mingw32 環境で最新 (2014/08/20) の gcc-4.8.1 でサンプルコードをコンパイルしてみましたがうまく動かないようです.gcc-4.6.2 にダウングレードしたら動きました.
**QDF モードと fix-qdf [#a6b92b14]
とりあえず [[examples/pdf-create.cc:http://github.com/qpdf/qpdf/tree/master/examples/pdf-create.cc]] を参考に簡単な PDF 生成プログラムを書いてみます:
PDF の中身をテキストエディタでいじりたいときに役に立ちます。
#include <qpdf/QPDF.hh>
#include <qpdf/QPDFObjectHandle.hh>
#include <qpdf/QPDFWriter.hh>
#include <stdlib.h>
static void create_pdf (char const* filename)
{
QPDF pdf;
// 空の PDF を用意する
pdf.emptyPDF();
// ページオブジェクト
QPDFObjectHandle page = pdf.makeIndirectObject(
QPDFObjectHandle::parse(
"<< /Type /Page"
" /MediaBox [0 0 200 200]"
" /Resources << /ProcSet [/PDF] >> >>")
);
// ページ内容: (50, 50) に 100×100 の正方形を描画
QPDFObjectHandle contents =
QPDFObjectHandle::newStream(&pdf, "50 50 100 100 re s");
page.replaceKey("/Contents", contents);
// ページを追加
pdf.addPage(page, true);
// ファイルに書き出し
QPDFWriter w(pdf, filename);
w.write();
}
int main (int argc, char* argv[])
{
try
{
create_pdf("test.pdf");
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
exit(2);
}
return 0;
}
qpdf --qdf input.pdf output.qdf
コンパイルして実行すると test.pdf ができるはずです。
で output.qdf (中身は PDF だが拡張子を '''q'''df に代えてある) をつくり、テキストエディタで編集する。(この時点でホントは xref テーブルや Stream オブジェクトの Length 等がおかしくなり壊れた PDF になる) その後
**PDF の解説 [#k1a769b6]
fix-qdf < output.qdf > output.pdf
-簡単な解説:[[手書き PDF 入門:http://www.kobu.com/docs/pdf/pdfxhand.htm]]
-完全な解説:[[PDF Reference:http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf]]
で修正すると output.'''p'''df は正当な PDF になる。
PDF の簡単な解説については[[手書き PDF 入門:http://www.kobu.com/docs/pdf/pdfxhand.htm]] を、完全な解説については [[PDF Reference:http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf]] を参照。
* インストール [#install]
**libqpdf [#l2e5ffe5]
** Windows [#inst-windows]
PDF を読み込み操作したりする C++ のライブラリ。http://github.com/qpdf/qpdf の
[[examples:http://github.com/qpdf/qpdf/tree/master/examples]] や [[include/qpdf/QPDF.hh:http://github.com/qpdf/qpdf/blob/master/include/qpdf/QPDF.hh]] あたりを参照。
公式サイトから
libqpdf でプログラミングするには PDF の構造や仕組みに関する詳細な知識を必要とします。これは PDF の構造をあまり意識しないで済む高水準の API を提供する PDFlib とは対照的です。PDF の生成もできますが、libqpdf にはグラフィックス描画関数などはありません。
-mingw64 バイナリ
-mingw32 バイナリ
-msvc64 バイナリ
-msvc32 バイナリ
試しに mingw32 環境で最新の gcc-4.8.1 でコンパイルしてみましたがうまく動かないようです。gcc-4.6.2 にダウングレードしたら動きました。
が入手できます.
とりあえず [[examples/pdf-create.cc:http://github.com/qpdf/qpdf/tree/master/examples/pdf-create.cc]] を参考に簡単な PDF 生成プログラムを書いてみます:
** macOS [#inst-mac]
#include <qpdf/QPDF.hh>
#include <qpdf/QPDFObjectHandle.hh>
#include <qpdf/QPDFWriter.hh>
#include <stdlib.h>
*** Homebrew を利用したインストール [#oa2529b2]
static void create_pdf (char const* filename)
{
QPDF pdf;
$ brew install qpdf
// 空の PDF を用意する
pdf.emptyPDF();
// ページオブジェクト
QPDFObjectHandle page = pdf.makeIndirectObject(
QPDFObjectHandle::parse(
"<< /Type /Page"
" /MediaBox [0 0 200 200]"
" /Resources << /ProcSet [/PDF] >> >>")
);
// ページ内容: (50, 50) に 100×100 の正方形を描画
QPDFObjectHandle contents =
QPDFObjectHandle::newStream(&pdf, "50 50 100 100 re s");
page.replaceKey("/Contents", contents);
// ページを追加
pdf.addPage(page, true);
*** MacPorts を利用したイントール [#q9f4b635]
qpdf という名前の Port をインストールします。variants は universal のみです。
$ sudo port install qpdf
// ファイルに書き出し
QPDFWriter w(pdf, filename);
w.write();
}
** Linux [#inst-linux]
*** Debian/Ubuntu [#cb42469f]
Debian や Ubuntu では、QPDF のパッケージは3つに小分けされています。
QPDF を利用したプログラムを自分でコンパイルしない場合は、libqpdf-dev をインストールする必要はありません。
$ sudo apt install qpdf
qpdf をインストールすると、libqpdf17 が依存関係により自動的にインストールされます。
int main (int argc, char* argv[])
{
try
{
create_pdf("test.pdf");
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
exit(2);
}
*関連リンク [#links]
return 0;
}
-[[qpdf でパスワードの設定と解除:http://konoyonohana.blog.fc2.com/blog-entry-28.html]]
-[[PDFの暗号化 ~3つの暗号化コマンドの紹介 ~:http://konoyonohana.blog.fc2.com/blog-entry-49.html]]
-[[qpdfでPDFの暗号化による保護を解除:http://cartman0.hatenablog.com/entry/2017/08/22/012915]]
コンパイルして実行すると test.pdf ができるはずです。