javaでPDFを生成するいくつかの方法
質問シナリオ
javaでPDFを生成する方法をまとめると。
A、itext-PdfStamper pdfStamper(通称:キーイングテンプレート)
B, itext-Document 文書(通常のコード記述)
C.wkhtmltopdf(ツール使用)
解析比較
<テーブル メソッド プロフェッショナル デメリット A シンプルなコード 最初に提供されるテンプレート、フィールド長は固定で融通が利かない B テンプレートはコードに合わせることができるが、スタイルはCのように柔軟ではない バックエンドコードのメンテナンスが多い C フロントエンドに合わせてテンプレートのスタイルを任意に調整可能 メンテナンスするフロントエンドのコードが増える使用リソース
A/Bです。
itext-pdfa-5.5.6.jar, itext-xtra-5.5.6.jar, itxt-5.5.6.jar, itxt-asian.jar
C: wkhtmltopdf-0.12.4, python2.7.14, pdfkit
例
A.
1、PDFエディタを使用してテンプレートを編集し、プログラムが記入するのを待つために空白を残します。
2、プログラムの生成とダウンロード
/**
* keying template
* @throws Exception
*/
public void createAllPdf() throws Exception {
//Populate the creation of pdf
PdfReader reader = null;
PdfStamper stamp = null;
try {
reader = new PdfReader("E:/module.pdf");
SimpleDateFormat simp = new SimpleDateFormat("yyyy-MM-dd");
String times = simp.format(new Date()).trim();
//create the name of the generated report
String root = ServletActionContext.getRequest().getRealPath("/upload") + File.separator;
if (!new File(root).exists())
new File(root).mkdirs();
File deskFile = new File(root, times + ".pdf");
stamp = new PdfStamper(reader, new FileOutputStream(deskFile));
// take out all the fields in the report template
AcroFields form = stamp.getAcroFields();
// populate the data
form.setField("name", "zhangsan");
form.setField("sex", "male");
form.setField("age", "15");
// Report the date of generation
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
String generationdate = dateformat.format(new Date());
form.setField("generationdate", generationdate);
stamp.setFormFlattening(true);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (stamp ! = null) {
stamp.close();
}
if (reader ! = null) {
reader.close();
}
}
}
B:
おすすめ共通機能リスト
ITEXT PDFファイルの分割・結合
ITEXT テーブルの指定列マージ - アップグレード
ITEXTテーブルの指定列マージ
ITEXTは、背景色が交互に変わる3行のテーブルを実装している
ITEXT ヘッダーとフッターのページ番号トリプレット
ITEXTディレクトリ生成の3つ目の方法(ブックマークもあり)
ITEXT-PDF内の画像の座標とページ番号の位置確認
ITEXT-PDF カラーフォント表示対応 中国語
ITEXT-電子透かしの挿入 (itext-pdfa-5.5.6.jar)
コードに直行
package itext;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* Created on 2017/5/16
* Author: youxingyang.
*/
public class TableAndTitle {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
String fileName = "tableAndTitle.pdf";
TableAndTitle.test(fileName);
}
private static void test(String fileName) {
Document document = new Document();
try {
PdfWriter.getInstance(document, new FileOutputStream(fileName));
document.open();
PdfPTable table = new PdfPTable(1);
table.setKeepTogether(true);
table.setSplitLate(false);
PdfPTable table1 = new PdfPTable(1);
PdfPCell cell0 = new PdfPCell();
Paragraph p = new Paragraph("table title sample");
p.setAlignment(1);
p.setSpacingBefore(15f);
cell0.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell0.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// but not
cell0.setPaddingTop(-2f);//center the word vertically
cell0.setPaddingBottom(8f);//center the word vertically
cell0.addElement(p);
cell0.setBorder(0);
table1.addCell(cell0);
PdfPTable pTable = new PdfPTable(table1);
document.add(pTable);
PdfPTable table2 = new PdfPTable(2);
float border = 1.5f;
for (int a = 0; a < 20; a++) {
PdfPCell cell = new PdfPCell();
Paragraph pp;
if (a == 0 || a == 1) {
pp = str2ParaByTwoFont("tableTitle" + (a + 1), 9f, BaseColor.BLACK, Font.BOLD); // small five bold
cell.setBorderWidthBottom(border);
cell.setBorderWidthTop(border);
} else {
if (a == 18 || a == 19) {
cell.setBorderWidthTop(0);
cell.setBorderWidthBottom(border);
} else {
cell.setBorderWidthBottom(0);
cell.setBorderWidthTop(0);
}
pp = str2ParaByTwoFont("tableContent" + (a - 1), 9f, BaseColor.BLACK); // small five
}
//set the background color of the interval
if ((a + 1) % 2 == 0) {
if (((a + 1) / 2) % 2 == 1) {
cell.setBackgroundColor(new BaseColor(128, 128, 255));
} else {
cell.setBackgroundColor(new BaseColor(128, 255, 255));
}
} else {
if (((a + 1) / 2) % 2 == 1) {
cell.setBackgroundColor(new BaseColor(128, 255, 255));
} else {
cell.setBackgroundColor(new BaseColor(128, 128, 255));
}
}
pp.setAlignment(1);
cell.setBorderWidthLeft(0);
cell.setBorderWidthRight(0);
cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);// but not
cell.setPaddingTop(-2f);//center the word vertically
cell.setPaddingBottom(8f);//center the word vertically
cell.addElement(pp);
C:
概要:JavaがPythonスクリプトを呼び出し、Pythonがマルチスレッドでpdfkitを呼び出す(pdfkitはwkhtmltopdfPythonのラッパーパッケージ)。
CODE: ソースコードで提供されていない簡単なメソッドが含まれているので、自分で書いてください
1. ジャワのコード
/**
* Multi-threaded report generation
* @param map sample and the corresponding set of companies
* @param productMap A collection of samples and products
* @param sampleList A collection of sample lists
* @param storeDir Report storage path
* @param url source conversion page url prefix
* @param pyPre The location where the python script is stored
* @param uuid local task unique identifier
* @param storePrefix url parameter file prefix
* @return
*/
private static int createMul(Map<String, String> map, Map<String, String> productMap,
List<String> sampleList, String storeDir, String url, String pyPre, String uuid, String storePrefix) {
String date = DateUtil.date2Str(new Date());
StringBuilder pathTemp = new StringBuilder("");
String companyId;
String productCode;
String cmd;
int sum = 0;
Map<String, String> sampleMap = new LinkedHashMap<>(sampleList.size());
String paraFileName;
try {
String path;
for (String sampleCode : sampleList) {
companyId = map.get(sampleCode);
productCode = productMap.get(sampleCode);
pathTemp.append(storeDir).append(date).append("-").append(uuid).append(File.separator).append(companyId).append(File. separator).append(productCode);
path = pathTemp.toString();
pathTemp.setLength(0);
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
path += File.separator + sampleCode + "-" + productCode + ".pdf";
path = path.replace("\\\", "/");
sampleMap.put(sampleCode, path);
}
paraFileName = storePrefix + DateUtil.date2Str(new Date()) + "-" + EncryUtil.getUUUID() + ".txt";
boolean success = writeMapFile(sampleMap, paraFileName);
if (success) {
log.info("Multithreaded report generation parameters: url: {}, paraFileName: {}", url, paraFileName);
cmd = "python " + pyPre + "mul_queue.py -u " + url + " -f " + paraFileName;
Process pr = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String result = null;
String line;
while ((line = in.readLine()) ! = null) {
result = line;
System.out.println("creating: " + result);
log.info("creating: {}", result);
}
if (result ! = null && result.contains("completed:")) {
sum = Integer.parseInt(result.split(":")[1]);
}
in.close();
pr.waitFor();
}
} catch (Exception e) {
e.printStackTrace();
log.info("Multithreaded generation report error: {} ", e.getMessage());
}
return sum;
}
/**
* map write to file
* // a = {'a': 'hangge', 'b': 'man', 'school': 'wust'}
* @param sampleMap
* @param paraFileName
* @return
*/
public static boolean writeMapFile(Map<String, String> sampleMap, String paraFileName) {
boolean res = false;
BufferedWriter bw = null;
try {
File file = new File(paraFileName);
if (!file.exists()) {
CommonUtil.createFile(paraFileName);
}
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(paraFileName)));
if (sampleMap.size() > 0) {
bw.write('{');
int index = 0;
for (String key : sampleMap.keySet()) {
bw.write('\');
bw.write(key);
bw.write('\'');
bw.write(':');
bw.write('\'');
bw.write(sampleMap.get(key));
bw.write('\'');
if (index < sampleMap.size() - 1) {
bw.write(',');
}
index++;
}
bw.write('}');
res = true;
}
} catch (Exception e) {
e.printStackTrace();
}try {
if (bw ! = null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return res;
}
2. pythonスクリプト
import threading
import ast
from Queue import Queue
import pdfkit
import sys
import getopt
import codecs
class MyThread(threading:)
def __init__(self, q):
super(MyThread, self). __init__()
self.q = q
def run(self):
while True:
url_path = self.q.get()
url_in = url_path[0]
path = url_path[1]
createpdf(url=url_in, path=path)
self.q.task_done()
def createpdf(url, path):
options = {
'margin-top': '0in',
'margin-right': '0in',
'margin-bottom': '0in',
'margin-left': '0in',
'encoding': "UTF-8",
'javascript-delay': '200000',
}
num = 0
compete = pdfkit.from_url(url, path, options=options)
if compete:
num = 1
return num
if __name__ == '__main__':
parameterList = sys.argv[1:]
url = ''
file_name = ''
opts, args = getopt.getopt(parameterList, "u:f:", ['url=', 'file_name='])
for opt, arg in opts:
if opt in ("-u", "--url"):
url = arg
elif opt in ("-f", "--file_name"):
file_name = arg
# print('url:', url)
# print('file_name:', file_name)
sample_map = {}
f = codecs.open(filename=file_name, mode="r+", encoding='utf-8')
lines = f.readlines()
sample_map_string = ''
for line in lines:
sample_map_string = line
break
sample_map = ast.literal_eval(sample_map_string)
queue = Queue()
size = len(sample_map)
stable_num = 5
if size > stable_num:
size = stable_num
for x in range(size):
worker = MyThread(queue)
worker.daemon = True
worker.start()
for i in sample_map.keys():
url_path_list = [url + '?sample_sn=%s' % i, sample_map.get(i)]
queue.put(url_path_list)
queue.join()
print "completed:" + bytes(len(sample_map))
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例