У меня есть процедура, которую я неоднократно выполняю для многих проектов, и я хочу обобщить ее.Я использовал iText
для работы с PDF.
Допустим, у меня есть 2000 PDF-файлов внутри папки, и мне нужно сжать их вместе.Допустим, лимит составляет 1000 PDF на один почтовый индекс.Таким образом, имя почтового индекса будет следовать этому правилу: job name
+ job sequence
.Например, почтовый индекс первой 1000 PDF-файла будет XNKXMN
+ AA
, а второй почтовый индекс будет XNKXMN
+ AB
.Прежде чем архивировать эти PDF-файлы, мне нужно добавить текст в каждый PDF-файл.Текст выглядит примерно так: job name
+ job sequence
+ pdf sequence
.Таким образом, первый PDF-файл внутри first zip будет иметь этот текст XNKXMN
+ AA
+ 000001
, а следующий за ним будет 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
: мой общий API для выполнения того, что я описал выше
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);
Проблема, с которой я сталкиваюсь с этим дизайном, заключается в том, что, хотя я правильно обрабатываю архив PDF в два zip,не правильно отражает.Отпечаток и последовательность не меняются соответственно: для 2000 PDF он остается XNKXMN
+ AA
вместо XNKXMN
+ AA
для первых 1000 и изменяется на XNKXMN
+ AB
для последующих 1000. Кажется, в моем дизайне есть недостатки, помогите
РЕДАКТИРОВАТЬ :
После просмотра кода toto2
я вижу свою проблему.Я создаю GenericText
с надеждой добавить текст в любом месте страницы PDF, не затрагивая основную логику процесса.Однако последовательность заданий по определению зависит от логики, так как ее нужно увеличивать, если слишком много PDF-файлов для одного ZIP для обработки (> maxSize
).Мне нужно переосмыслить это.