我想向任何可以帮助我完全理解此代码的人提供一张星巴克卡。这对我很重要。感谢您的时间!
我开始阅读 Lowagie 先生的精彩著作(iText in Action,第二版)。它写得很好,内容丰富。由于雇主的压力很大,我被迫跳到第 6 章。理解 n-Up 代码示例对我来说非常重要,作为一个新程序员,我将尝试用我的评论下面的代码问题。
如果可以的话,如果可以的话,请抽出一些时间并通过查看下面的问题来帮助我完成它,那就太好了。我感谢所有有用的评论。
public void manipulatePdf(String src, String dest, int pow)
问:这里的“pow”变量表示,例如,在 pow 为 3 时,生成的 n-up 将是 (2x2x2) 8。生成的 pdf 将有 8 个“src”PDF 副本。这个对吗?
A:
throws IOException, DocumentException
{
PdfReader reader = new PdfReader(src);
Rectangle pageSize = reader.getPageSize(1);
Rectangle newSize = (pow % 2) == 0 ?
new Rectangle( pageSize.getWidth(), pageSize.getHeight()) : new Rectangle( pageSize.getHeight(), pageSize.getWidth());
问:上面我不确定发生了什么。在我看来,如果模运算的余数为零,那么新的矩形将以纵向创建,反之亦然。这个对吗?如果是这样,我可以问为什么吗?
A:
Rectangle unitSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight());
for (int i = 0; i < pow; i++)
{
unitSize = new Rectangle(
unitSize.getHeight() / 2, unitSize.getWidth());
}
问:在上面的“for”循环中,我相信我们正在为每个将被压缩到最终 pdf 表面上的 pdf 准备单元大小。我不明白为什么 getWidth() 也没有除以 2?
A:
int n = (int)Math.pow(2, pow);
int r = (int)Math.pow(2, pow / 2);
int c = n / r;
问:'n' 是将 n'uped 到最终 pdf 表面的 pdfPages 的数量。到目前为止一切顺利,对吧?
'r' 可能是行数,'c' 可能是列数?
So, assuming a 'pow' of 3..
n = 8 which means 8 up of the pdf when you'll open up the final pdf?
r = 2 which means there'll be be two rows.
c = 4 which means there'll be four columns.
A:
Document document = new Document(newSize, 0, 0, 0, 0);
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream(String.format(dest, n)));
document.open();
PdfContentByte cb = writer.getDirectContent();
PdfImportedPage page;
Rectangle currentSize;
float offsetX, offsetY, factor;
int total = reader.getNumberOfPages();
for (int i = 0; i < total; )
{
if (i % n == 0)
{
document.newPage();
}
问:每次在当前工作页面中达到预定的 nup 数时,上述 'for' 循环都会在最终的 pdf 中添加一个新页面。因此,如果我们有 n = 8,那么新页面将在 i = 8、16、24 等处调用。对吗?
A:
currentSize = reader.getPageSize(++i);
问:这一行说明了源 pdf 有很多页面并且并非所有页面共享相同 pdf 页面大小的情况。正确的?
A:
factor = Math.min(unitSize.getWidth() / currentSize.getWidth(),
unitSize.getHeight() / currentSize.getHeight());
问:min 函数返回最小的数。为什么unitSize除以currentSize?这就是我的理解崩溃的地方。
A:
offsetX = unitSize.getWidth() * ((i % n) % c)
+(unitSize.getWidth()
- (currentSize.getWidth() * factor))/2f;
问:好的,offsetX 和 offsetY 用于将 pdf 页面定位到更大的最终 pdf 表面。我明白了。有人可以用英语向非程序员解释计算吗?这是一个知道每个数学运算做什么但不了解全局的情况。
A:
offsetY = newSize.getHeight()
- (unitSize.getHeight() * (((i % n) / c) + 1))
+ (unitSize.getHeight()
- (currentSize.getHeight() * factor))/2f;
page = writer.getImportedPage(reader, i);
cb.addTemplate(page,factor, 0, 0, factor, offsetX, offsetY);
}
document.close();
}
我希望这个问题可以帮助许多其他人,他们是 iText 的新手,并且可能需要一些详细的代码演练。
我也希望不要发布负面且通常无益的评论。
谢谢大家的时间和帮助!