У меня есть обычная программа, которую я неоднократно делал для многих проектов, и хочу ее обобщить. Для обработки PDF я использовал iText
.Разработка родового процесса с использованием шаблона шаблона
Скажите, что у меня есть 2000 PDF-файлов внутри папки, и мне нужно их закрепить. Пусть говорят, что предел составляет 1000 PDF-файлов за zip. Таким образом, название zip будет следовать этому правилу: job name
+ job sequence
. Например, zip-имя первого 1000 PDF будет XNKXMN
+ AA
, а второе имя zip будет XNKXMN
+ AB
. Прежде чем закрепить эти PDF-файлы, мне нужно добавить текст в каждый PDF-файл. Текст выглядит примерно так: job name
+ job sequence
+ pdf sequence
. Таким образом, первый PDF внутри первого молнии будет иметь этот текст 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-архив в два раза, текст неправильно отражен. Печать и последовательность не меняется, соответственно, его пребывание XNKXMN
+ AA
за 2000 PDF вместо XNKXMN
+ AA
для первой 1000 и перейти к XNKXMN
+ AB
для последующего 1000. Там, кажется, недостатки в моей конструкции, пожалуйста, помогите
EDIT:
После просмотра toto2
кода, я вижу мою проблему. Я создаю GenericText
с надеждой добавить текст в любом месте на странице pdf, не затрагивая основную логику процесса. Тем не менее, последовательность заданий определяется по определению в зависимости от логики, так как она должна увеличиваться, если слишком много PDF-файлов для одного ZIP-файла (>maxSize
). Мне нужно переосмыслить это.
Я немного смущен; приведенный выше код добавляет один список «GenericText» в список, есть ли в нем больше, чем это? Метод «generatePrintJob» перебирает файлы PDF, а затем внутри этого цикла выполняется все «GenericText's»; даже если было несколько «GenericText's», если они все печатали данные в одно и то же место, похоже, что это создаст беспорядок. Если вы хотите связать один «GenericText» с одним PDF, почему бы просто не сделать это? –
Вы не обрабатываете файлы 0, 1000 и т. Д. Они ветвятся в 'else', и вы обрабатываете файлы только в' if'. – toto2
@DaveNewton: Мой план для GenericText - это гибкий способ добавления текстов в PDF. Как вы можете видеть, он содержит координату (x, y), а также поворот текста. Абстрактный метод 'generateText (int physicalPage, int logicalPage)' - это справка для генерации порядкового номера, например, если я смотрю на страницу 1, то порядковый номер - '000001' или какой-либо другой формат, поэтому почему у меня есть этот абстрактный метод , поэтому пользователь может написать свою собственную реализацию о том, как они хотят, чтобы порядковый номер выглядел. Я знаю, что у дизайна есть недостаток. Я пытаюсь понять это правильно. –