gpt4 book ai didi

java - 使用模板模式设计通用流程

转载 作者:行者123 更新时间:2023-11-29 03:51:33 24 4
gpt4 key购买 nike

我有一个我为许多项目重复做的例程,我想概括它。我使用 iText 进行 PDF 操作。

假设我在一个文件夹中有 2000 个 PDF,我需要将它们压缩在一起。假设限制是每个 zip 1000 个 PDF。所以 zip 的名称将遵循以下规则:job name + job sequence。例如,前 1000 个 PDF 的 zip 名称为 XNKXMN + AA,第二个 zip 名称为 XNKXMN + AB 。在压缩这些 PDF 之前,我需要向每个 PDF 添加一些文本。文本看起来像这样 job name + job sequence + pdf sequence。所以 first zip 中的第一个 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 归档为两个 zip,文本也没有正确反射(reflect)。打印和顺序没有相应改变,对于 2000 PDF,它保持 XNKXMN + AA 而不是 XNKXMN + AA 前 1000 个,后面的 1000 个改为 XNKXMN + AB我的设计似乎有缺陷,请帮助

编辑:

查看toto2 代码后,我发现了我的问题。我创建 GenericText 是希望在 pdf 页面的任何位置添加文本而不影响流程的基本逻辑。然而,作业顺序是根据逻辑定义的,因为如果一个 ZIP 无法处理太多 PDF (> maxSize),它需要递增。我需要重新考虑这一点。

最佳答案

当您创建匿名GenerateText 时,您在覆盖的generateText 方法中使用的final seq 是真正最终的,并且将始终保持创建时赋予的值。您在 generatePrintJobelse 中对 seq 进行的更新不执行任何操作。

更笼统地说,您的代码看起来非常复杂,您可能应该退后一步并进行一些重大重构。

编辑:

我会尝试一些不同的东西,没有模板方法模式:

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) 来分解 AA000001 中的 fileNumber,等等。但这会有些危险,因为 maxSize 会在两个不同的地方使用,并且像这样的重复数据可能很容易出错。

关于java - 使用模板模式设计通用流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8567721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com