iTextSharpを使用してPDFテンプレートファイルを埋め込む
17945 ワード
需要の概要:
このようなニーズに遭遇しました:ある会社はすべてのユーザーのトレーニングのためにトレーニング記録を生成する必要があります.プロセスは以下の通りです.
(1)ユーザは,研修後に情報を記入するインタフェースに入る.
(2)ユーザが情報を記入する.
(3)PDF形式の研修記録を生成する.
(4)ユーザがアーカイブをダウンロードし印刷する.
考え方:
トレーニングのたびに生成されるPDFファイルの内容はまったく同じではありませんが、フォーマットはまったく同じなので、テンプレートファイルの使用を連想させやすいです.毎回、ユーザーが入力した有効な情報を抽出し、テンプレートをコピーし、テンプレートを塗りつぶし、ダウンロードをポップアップするだけです.
解決プロセス:
(1)テンプレートの作成:Microsoft Office 2010を使用してテンプレートファイルを編集し、保存時にpdfファイルとして保存します.そして、生成したばかりのPDFファイルをAdobe Acrobat Xで編集し、Textbox、Checkboxなどのドメインを指定した位置にドラッグし、プレビュー機能で各ドメインの位置とその中の文字のフォント、サイズを調整し、完了したら保存します.テンプレート完了!(Googleで検索した時もOpenOfficeでテンプレートを完成させるのを見たことがありますが、クリックしてみませんでした)
(2)プログラミングパディングPDFファイル:本人が使用するプログラミング言語はC#であるため,対応する無料オープンソースクラスライブラリiTextSharpを用いてパディングを完了する.プログラムの実行手順は、Webページの有効な情報を読み込み、テンプレートファイルを開いてテンプレートファイルのドメインの真ん中に埋め込み、最後にPDFファイルとして保存することです.コードは以下の通りです.
(3)サーバ側がファイルをプッシュしてブラウザにダウンロードする.
問題:
(1)まず遭遇する問題はCheckboxのパラメータ問題である.最初、私はいくつかの英語のウェブサイトから関連資料を見て、中にCheckboxを設定して使用する文は:pdfFormFields.SetField(“male”, “Yes”); 何度もやってみたが、結局だめで、Checkboxは選ばれなかった.その後、Checkboxプロパティのオプション値の欄を開くことができず、エクスポート値という欄があり、その値は「はい」であることがわかりました.私のテンプレートは中国語版を使用しているため、パラメータの設定も変化していると思いますが、試してみるとやはりそうです.pdfFormFields.SetField(「male」、「はい」);通じます.
(2)中国語の問題を表示します.中国語文字列をPDFテンプレートに直接設定しても、中国語文字は一つも表示されません.Googleをクリックすると、アジアの文字が表示されないはずです.そのためには、iTextAsianCmapsという2つの追加コンポーネントが必要です.dllとiTextAsiandll.この2つのコンポーネントはsourceforgeでダウンロードできます.参考までにhttp://www.cnblogs.com/haogj/archive/2011/09/05/2167659.html.
(3)これでいいと思った?ずいぶん違いますね.最初の文
(4)直してからスムーズに書き上げました.実験してみたら,また間違いがあった.
コード:
Anyway、コードは最も重要で、以下の静的クラスはPDFテンプレートを埋め込むために使用されます.
以下に、パラメータの取得と呼び出しのプロセスとPDFファイルのダウンロードをプッシュする方法を示します.
このようなニーズに遭遇しました:ある会社はすべてのユーザーのトレーニングのためにトレーニング記録を生成する必要があります.プロセスは以下の通りです.
(1)ユーザは,研修後に情報を記入するインタフェースに入る.
(2)ユーザが情報を記入する.
(3)PDF形式の研修記録を生成する.
(4)ユーザがアーカイブをダウンロードし印刷する.
考え方:
トレーニングのたびに生成されるPDFファイルの内容はまったく同じではありませんが、フォーマットはまったく同じなので、テンプレートファイルの使用を連想させやすいです.毎回、ユーザーが入力した有効な情報を抽出し、テンプレートをコピーし、テンプレートを塗りつぶし、ダウンロードをポップアップするだけです.
解決プロセス:
(1)テンプレートの作成:Microsoft Office 2010を使用してテンプレートファイルを編集し、保存時にpdfファイルとして保存します.そして、生成したばかりのPDFファイルをAdobe Acrobat Xで編集し、Textbox、Checkboxなどのドメインを指定した位置にドラッグし、プレビュー機能で各ドメインの位置とその中の文字のフォント、サイズを調整し、完了したら保存します.テンプレート完了!(Googleで検索した時もOpenOfficeでテンプレートを完成させるのを見たことがありますが、クリックしてみませんでした)
(2)プログラミングパディングPDFファイル:本人が使用するプログラミング言語はC#であるため,対応する無料オープンソースクラスライブラリiTextSharpを用いてパディングを完了する.プログラムの実行手順は、Webページの有効な情報を読み込み、テンプレートファイルを開いてテンプレートファイルのドメインの真ん中に埋め込み、最後にPDFファイルとして保存することです.コードは以下の通りです.
(3)サーバ側がファイルをプッシュしてブラウザにダウンロードする.
問題:
(1)まず遭遇する問題はCheckboxのパラメータ問題である.最初、私はいくつかの英語のウェブサイトから関連資料を見て、中にCheckboxを設定して使用する文は:pdfFormFields.SetField(“male”, “Yes”); 何度もやってみたが、結局だめで、Checkboxは選ばれなかった.その後、Checkboxプロパティのオプション値の欄を開くことができず、エクスポート値という欄があり、その値は「はい」であることがわかりました.私のテンプレートは中国語版を使用しているため、パラメータの設定も変化していると思いますが、試してみるとやはりそうです.pdfFormFields.SetField(「male」、「はい」);通じます.
(2)中国語の問題を表示します.中国語文字列をPDFテンプレートに直接設定しても、中国語文字は一つも表示されません.Googleをクリックすると、アジアの文字が表示されないはずです.そのためには、iTextAsianCmapsという2つの追加コンポーネントが必要です.dllとiTextAsiandll.この2つのコンポーネントはsourceforgeでダウンロードできます.参考までにhttp://www.cnblogs.com/haogj/archive/2011/09/05/2167659.html.
(3)これでいいと思った?ずいぶん違いますね.最初の文
BaseFont.AddToResourceSearch(
"iTextAsian.dll"
);
を入力したときにエラーがありましたか?そうだ!現在iTextSharpの最新バージョンは5.4.4、つまり私が当時使っていたバージョンです.推定バージョンの遷移によりメソッドの呼び出しにも問題が発生し,5.1.2のバージョンに思い切って変更した.(4)直してからスムーズに書き上げました.実験してみたら,また間違いがあった.
BaseFont bf = BaseFont.CreateFont(
"STSong-Light"
,
"UniGB-UCS2-H"
, BaseFont.EMBEDDED);
・のSTSong-LightとUniGB-UCS 2-Hは認識できません!この问题は私は最后まですべて解决することができませんでした(何篇の招待状を见てやはり解决することができませんでした.次はTTFフォントを使うしかありません.注意:TTFフォントを使うと、PDFファイルにフォントファイルが埋め込まれているようで、PDFファイルの体積が大きく、私の心の病になりました.コード:
Anyway、コードは最も重要で、以下の静的クラスはPDFテンプレートを埋め込むために使用されます.
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Web;
5: using System.Diagnostics;
6: using System.IO;
7: using iTextSharp.text.pdf;
8:
9: public class FillPdfTemplate
10: {
11: public static void GetEnPdf(string templatePath, string newFilePath, Dictionary<string, string> parameters)
12: {
13: PdfReader pdfReader = new PdfReader(templatePath);
14: PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFilePath,
15: FileMode.Create));
16: // ;
17: AcroFields pdfFormFields = pdfStamper.AcroFields;
18: // ;
19: foreach (KeyValuePair<string, string> parameter in parameters)
20: {
21: pdfFormFields.SetField(parameter.Key, parameter.Value);
22: }
23: // , false PDF , true;
24: pdfStamper.FormFlattening = true;
25: pdfStamper.Close();
26: pdfReader.Close();
27: }
28:
29: public static void GetChPdf(string templatePath, string newFilePath, string iTextAsianCmapsPath, Dictionary<string, string> parameters)
30: {
31: PdfReader pdfReader = new PdfReader(templatePath);
32: PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFilePath, FileMode.Create));
33: // ;
34: AcroFields pdfFormFields = pdfStamper.AcroFields;
35:
36: BaseFont.AddToResourceSearch(iTextAsianCmapsPath);
37: // , , , PDF ;
38: BaseFont baseFT = BaseFont.CreateFont(@"C:\Windows\Fonts\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
39: foreach (KeyValuePair<string, string> parameter in parameters)
40: {
41: // ;
42: pdfFormFields.SetFieldProperty(parameter.Key, "textfont", baseFT, null);
43: // ;
44: pdfFormFields.SetField(parameter.Key, parameter.Value);
45: }
46: // , false PDF , true;
47: pdfStamper.FormFlattening = true;
48: pdfStamper.Close();
49: pdfReader.Close();
50: }
51: }
以下に、パラメータの取得と呼び出しのプロセスとPDFファイルのダウンロードをプッシュする方法を示します.
1: protected void btnDownLoad_Click(object sender, EventArgs e)
2: {
3: string position = Text1.Value;
4: string venue = Text2.Value;
5: string method = Text3.Value;
6: string date = Text4.Value;
7: string teacher = Text5.Value;
8: string content = TextArea1.Value;
9: string examination = Checkbox1.Checked ? " " : " ";
10: string selfassessment = Checkbox2.Checked ? " " : " ";
11: string certificate = Checkbox3.Checked ? " " : " ";
12: string etc = Checkbox4.Checked ? " " : " ";
13: string trainee = Text6.Value;
14:
15: Dictionary<string, string> dict = new Dictionary<string, string>();
16: dict.Add("TextPosition", position);
17: dict.Add("TextVenue", venue);
18: dict.Add("TextMethod", method);
19: dict.Add("TextDate", date);
20: dict.Add("TextTeacher", teacher);
21: dict.Add("TextContent", content);
22: dict.Add("TextTrainee", trainee);
23: dict.Add("CheckBoxExamination", examination);
24: dict.Add("CheckBoxSelf-assessment", selfassessment);
25: dict.Add("CheckBoxCertificate", certificate);
26: dict.Add("CheckBoxEtc", etc);
27:
28: string template = Server.MapPath("~/PDFTemplate/ch.pdf");
29: string newFile = Server.MapPath("~/PDFTemplate") + "\\" + Session["UserID"].ToString() + ".pdf";
30: string iTextAsianCmaps = Server.MapPath("~/Libs/iTextAsianCmaps.dll");
31: TrainingRecordToPDF.GetChPdf(template, newFile, iTextAsianCmaps, dict);
32:
33: OutFile(newFile);
34: }
35:
36: public void OutFile(string filename)
37: {
38: System.IO.FileInfo file = new System.IO.FileInfo(filename);
39: Response.Clear();
40: Response.Charset = "GB2312";
41: Response.ContentEncoding = System.Text.Encoding.UTF8;
42: Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(file.Name));
43: Response.AddHeader("Content-Length", file.Length.ToString());
44: Response.ContentType = "application/x-bittorrent";
45: Response.WriteFile(file.FullName);
46: Response.End();
47:
48: }