2011-12-19 4 views
1

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

+1

Я немного смущен; приведенный выше код добавляет один список «GenericText» в список, есть ли в нем больше, чем это? Метод «generatePrintJob» перебирает файлы PDF, а затем внутри этого цикла выполняется все «GenericText's»; даже если было несколько «GenericText's», если они все печатали данные в одно и то же место, похоже, что это создаст беспорядок. Если вы хотите связать один «GenericText» с одним PDF, почему бы просто не сделать это? –

+1

Вы не обрабатываете файлы 0, 1000 и т. Д. Они ветвятся в 'else', и вы обрабатываете файлы только в' if'. – toto2

+0

@DaveNewton: Мой план для GenericText - это гибкий способ добавления текстов в PDF. Как вы можете видеть, он содержит координату (x, y), а также поворот текста. Абстрактный метод 'generateText (int physicalPage, int logicalPage)' - это справка для генерации порядкового номера, например, если я смотрю на страницу 1, то порядковый номер - '000001' или какой-либо другой формат, поэтому почему у меня есть этот абстрактный метод , поэтому пользователь может написать свою собственную реализацию о том, как они хотят, чтобы порядковый номер выглядел. Я знаю, что у дизайна есть недостаток. Я пытаюсь понять это правильно. –

ответ

4

При создании анонимного GenerateTextfinal 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) 
    } 
} 

Однако, вы также можете сохранить шаблон шаблон. В этом случае, я хотел бы сохранить для-петли я уже писал выше, но я хотел бы изменить способ генерирования в genericText.generateText(iZip, iFile) где iZip = 0 дает АА и 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), который сам может разложить номер файла в AA000001 и т. д. Но это будет несколько опасно, поскольку maxSize будет использоваться в двух разных местах, и это может быть ошибка, подверженная дублированию данных.

+0

Спасибо, я понимаю, что вы сказали о 'seq',' seq' на самом деле является «последней» версией «String jobSeq». Я забыл иметь это в коде. Любой указатель на то, как иметь этот лучший дизайн? Я знаю, что у дизайна есть недостаток, я учусь, чтобы понять это правильно. Еще раз спасибо –

+0

@Harry Смотрите мои изменения для некоторых предложений. – toto2

+0

Посмотрев на свой код, я вижу свою проблему. Я создаю «GenericText» с надеждой добавить текст в любом месте на странице pdf, не затрагивая основную логику процесса. Однако «последовательность заданий» определяется по определению в зависимости от логики, так как она должна увеличиваться, поскольку слишком много PDF-файлов для обработки одного ZIP-кода. Мне нужно переосмыслить это. –

Смежные вопросы