私は多くのプロジェクトで繰り返し実行しているルーチンを一般化したいと思います。私はiText
をPDF操作に使用しました。テンプレートパターンを使用した一般的なプロセスの設計
私はフォルダ内に2000個のPDFを持っており、これらを一緒に圧縮する必要があるとしましょう。制限は1つのファイルにつき1000個のPDFです。したがって、ジップの名前はこの規則に従います:job name
+ job sequence
。たとえば、最初の1000個のPDFのジップ名はXNKXMN
+ AA
、2番目のジップ名はXNKXMN
+ AB
となります。これらのPDFを圧縮する前に、各PDFにテキストを追加する必要があります。テキストは次のようになりますjob name
+ job sequence
+ pdf sequence
だから、最初ジップ内側の最初のPDFには、このテキストXNKXMN
+ AA
+ 000001
を持つことになり、その後1はXNKXMN
+ AA
+ 000002
です。ここに私の試みです
私は抽象クラスGenericText
が私のテキストを表しています。
public abstract class GenericText {
private float x;
private float y;
private float rotation;
/**
* Since the text that the user want to insert onto the Pdf might vary
* from page to page, or from logical document to logical document, we allow
* the user to write their own implementation of the text. To give the user enough
* flexibility, we give them the reference to the physical page index, the logical page index.
* @param physcialPage The actual page number that the user current looking at
* @param logicalPage A Pdf might contain multiples sub-documents, <code>logicalPage</code>
* tell the user which logical sub-document the system currently looking at
*/
public abstract String generateText(int physicalPage, int logicalPage);
GenericText(float x, float y, float rotation){
this.x = x;
...
}
}
JobGenerator.java
:私は私のメインクラスでだから今
public String generatePrintJob(List<File> pdfList, String outputPath,
String printName, String seq, List<GenericText> textList, int maxSize)
for (int currentPdfDocument = 0; currentPdfDocument < pdfList.size(); currentPdfDocument++) {
File pdf = pdfList.get(currentPdfDocument);
if (currentPdfDocument % maxSize != 0) {
if(textList != null && !textList.isEmpty()){
for(GenericText gt : textList){
String text = gt.generateText(currentPdfDocument, currentPdfDocument)
//Add the text content to the PDF using PdfReader and PdfWriter
}
}
...
}else{
//Close the current output stream and zip output stream
seq = Utils.getNextSeq(seq);
jobPath = outputPath + File.separator + printName + File.separator + seq + ".zip"
//Open new zip output stream with the new <code>jobPath</code>
}
}
}
上述私はちょうど私が持っています。この
final String printName = printNameLookup.get(baseOutputName);
String jobSeq = config.getPrintJobSeq();
final String seq = jobSeq;
GenericText keyline = new GenericText(90, 640, 0){
@Override
public String generateText(int physicalPage, int logicalPage) {
//if logicalPage = 1, Utils.right(String.valueOf(logicalPage), 6, '0') -> 000001
return printName + seq + " " + Utils.right(String.valueOf(logicalPage), 6, '0');
}
};
textList.add(keyline);
JobGenerator pjg = new JobGenerator();
pjg.generatePrintJob(...,..., printName, jobSeq, textList, 1000);
問題を行うだろう、私の一般的なAPIを行うにはこの設計では、PDFを2つのジップに正しくアーカイブする処理を行っても、テキストが正しく反映されていないということです。印刷およびシーケンスは、それが最初の1000のためのPDFの代わりに、XNKXMN
+ + AA
滞在し、後で1000のためXNKXMN
+ AB
に変更、それに応じて変更されません私の設計に不備があるようです、助けてください
EDIT:
toto2
コードを見た後、私は私の問題を参照してください。私はGenericText
を作成して、プロセスの基本ロジックに影響を与えずにpdfページのどこにでもテキストを追加できるようにします。しかし、ジョブシーケンスはロジックに依存して定義されています。処理するPDFが多すぎるとインクリメントする必要があります(>maxSize
)。私はこれを再考する必要があります。
私は少し混乱しています。上記のコードはリストに単一の 'GenericText'を追加していますが、これ以上のものはありますか? 'generatePrintJob'メソッドはPDFをループし、その中で全てのGenericTextをループします。たとえ複数のGenericTextがあったとしても、それらがすべて同じ場所に印刷されていれば、混乱を招くようです。 1つの 'GenericText'を1つのPDFに関連づけたいのであれば、それだけじゃないの? –
あなたはファイル0,1000などを処理していません。それらは 'else'で分岐し、' if'でファイルを処理します。 – toto2
@DaveNewton:PDFにテキストを追加する柔軟な方法であるGenericTextの私の計画。ご覧のとおり、テキストの回転だけでなく、(x、y)座標も含まれています。抽象メソッド 'generateText(int physicalPage、int logicalPage)'は、シーケンス番号を生成するのに役立ちます。たとえば、ページ1を見ると、シーケンス番号は '000001'またはその他の形式なので、そこに抽象メソッドがあるのですしたがって、ユーザは、シーケンス番号をどのように見せたいか、独自の実装を記述することができます。私はデザインに欠陥があることを知っている。私はそれを正しくしようとしています。 –