Разработка общего процесса с использованием шаблона - PullRequest
1 голос
/ 20 декабря 2011

У меня есть процедура, которую я неоднократно выполняю для многих проектов, и я хочу обобщить ее.Я использовал 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).Мне нужно переосмыслить это.

1 Ответ

4 голосов
/ 20 декабря 2011

Когда вы создаете анонимный GenerateText, final seq, который вы используете в переопределенном методе generateText, действительно является окончательным и всегда будет оставаться значением, заданным во время создания. Обновление, которое вы держите seq внутри else в generatePrintJob, ничего не делает.

На более общем замечании ваш код выглядит очень сложным, и вам, вероятно, следует сделать шаг назад и провести какой-то серьезный рефакторинг.

EDIT

Я бы вместо этого попробовал что-то другое, без шаблона шаблона:

int numberOfZipFiles = 
      (int) Math.ceil((double) pdfList.size() / maxSize);  

for (int iZip = 0; iZip < numberOfZipFiles; iZip++) {
  String batchSubName = generateBatchSubName(iZip); // gives AA, AB,...

  for (int iFile = 0; iFile < maxSize; iFile++) {
     int fileNumber = iZip * maxSize + iFile;
     if (fileNumber >= pdfList.size()) // can happen for last batch
        return;
     String text = jobName + batchSubName + iFile;
     ... add "text" to pdfList.get(fileNumber)
  }
}

Однако вы также можете сохранить шаблон шаблона. В этом случае я бы сохранил циклы for, которые я написал выше, но я бы изменил метод генерации на genericText.generateText(iZip, iFile), где iZip = 0 дает AA, а iZip = 1 дает AB и т. Д .:

for (int iZip = 0; iZip < numberOfZipFiles; iZip++) {
  for (int iFile = 0; iFile < maxSize; iFile++) {
     int fileNumber = iZip * maxSize + iFile;
     if (fileNumber >= pdfList.size()) // can happen for last batch
        return;
     String text = genericText.generateText(iZip, iFile);
     ... add "text" to pdfList.get(fileNumber)
  }
}

Можно было бы также иметь genericText.generateText(fileNumber), который сам мог бы разложить fileNumber в AA000001 и т. Д. Но это было бы несколько опасно, потому что maxSize использовался бы в двух разных местах, и он мог бы быть подвержен ошибкам, чтобы иметь дублирующиеся данные, такие как что.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...