【发布时间】:2016-10-09 08:51:25
【问题描述】:
我正在使用 iText 7 复制 pdf 页面并对这些页面进行编号。所以我不需要手动给它们编号。但是生成的pdf文件中的数字有问题。这是它的样子:
我想了好几个小时,还是想不通。
我的代码:
import com.itextpdf.io.font.FontConstants;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import java.io.File;
import java.io.IOException;
public class NumberingInJava {
public static final String SRC = "D:/temp/num_src.pdf";
public static final String DEST = "D:/temp/edited_numbering.pdf";
public static final String[] NUM4SAMPLE = {"02A", "03A", "03B", "03C", "04A", "08A"};
public static final double XCOOR = 230;
public static final double YCOOR = 795;//755
public static void main(String[] args) throws IOException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new NumberingInJava().manipulatePdf(SRC, DEST, NUM4SAMPLE);
}
private void manipulatePdf(String src, String dest, String[] numbering4what) throws IOException {
//Initialize PDF document
PdfDocument pdfDocToRead = new PdfDocument(new PdfReader(src));
PdfDocument pdfDocToWrite = new PdfDocument(new PdfWriter(dest));
for(String s : numbering4what) {
println(s);
}
String number = null;
PdfPage tempPage = null;
for (int i=0; i<numbering4what.length; i++) {
pdfDocToRead.copyPagesTo(1, 2, pdfDocToWrite);
number = numbering4what[i];
println(number);
tempPage = pdfDocToWrite.getPage(2*(i+1)-1);
numberingPage(tempPage, number);
println("pdfDocToWrite.numberOfPages : "+pdfDocToWrite.getNumberOfPages());
}
pdfDocToRead.close();
pdfDocToWrite.close();
println("\nNumber added!");
}
private void numberingPage(PdfPage pdfPage, String number) throws IOException {
println(pdfPage);
PdfCanvas canvas = new PdfCanvas(pdfPage);
canvas.beginText().setFontAndSize(PdfFontFactory.createFont(FontConstants.HELVETICA), 22)
.moveText(XCOOR, YCOOR)
.showText(number)
.endText();
println("number: "+number);
}
private void println(Object obj) {
System.out.println(obj);
}
}
控制台输出:
02A 03A 03B 03C 04A 08A 02A com.itextpdf.kernel.pdf.PdfPage@cf768c 17:58:07,457 |-ch.qos.logback.classic.LoggerContext [default] 中的信息 - 找不到资源 [logback.groovy] 17:58:07,458 |-ch.qos.logback.classic.LoggerContext [default] 中的信息 - 找不到资源 [logback-test.xml] 17:58:07,458 |-ch.qos.logback.classic.LoggerContext [default] 中的信息 - 在 [jar:file:/D:/Java_Packages/ext_lib/iText/itext7-7.0.1 找到资源 [logback.xml] /itext7-itext-rups-7.0.1.jar!/logback.xml] 17:58:07,459 |- ch.qos.logback.classic.LoggerContext[default] 中的警告 - 资源 [logback.xml] 在类路径上出现多次。 17:58:07,459 |-ch.qos.logback.classic.LoggerContext[default] 中的警告 - 资源 [logback.xml] 发生在 [jar:file:/D:/Java_Packages/ext_lib/iText/itext7-7.0.1 /itext7-itext-rups-7.0.1-jar-with-dependencies.jar!/logback.xml] 17:58:07,459 |-ch.qos.logback.classic.LoggerContext[default] 中的警告 - 资源 [logback.xml] 发生在 [jar:file:/D:/Java_Packages/ext_lib/iText/itext7-7.0.1 /itext7-itext-rups-7.0.1-sources.jar!/logback.xml] 17:58:07,459 |-ch.qos.logback.classic.LoggerContext[default] 中的警告 - 资源 [logback.xml] 发生在 [jar:file:/D:/Java_Packages/ext_lib/iText/itext7-7.0.1 /itext7-itext-rups-7.0.1.jar!/logback.xml] 17:58:07,501 |-ch.qos.logback.core.joran.spi.ConfigurationWatchList@8080bb 中的信息 - URL [jar:file:/D:/Java_Packages/ext_lib/iText/itext7-7.0.1/itext7-itext -rups-7.0.1.jar!/logback.xml] 不是文件类型 17:58:07,662 |-ch.qos.logback.classic.joran.action.ConfigurationAction 中的信息 - 未设置调试属性 17:58:07,829 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 即将实例化类型为 [com.itextpdf.rups.view.DebugAppender] 的附加程序 17:58:07,851 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 将附加程序命名为 [DEFAULT_APP] 17:58:07,940 |-ch.qos.logback.core.joran.action.NestedComplexPropertyIA 中的信息 - 假设 [encoder] 属性的默认类型 [ch.qos.logback.classic.encoder.PatternLayoutEncoder] 17:58:08,045 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 即将实例化类型为 [com.itextpdf.rups.view.StyleAppender] 的附加程序 17:58:08,046 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 将附加程序命名为 [INFO_APP] 17:58:08,062 |-ch.qos.logback.core.joran.action.NestedComplexPropertyIA 中的信息 - 假设 [encoder] 属性的默认类型 [ch.qos.logback.classic.encoder.PatternLayoutEncoder] 17:58:08,063 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 即将实例化类型为 [com.itextpdf.rups.view.DebugAppender] 的附加程序 17:58:08,063 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 将附加程序命名为 [DEBUG_APP] 17:58:08,065 |-ch.qos.logback.core.joran.action.NestedComplexPropertyIA 中的信息 - 假设 [encoder] 属性的默认类型 [ch.qos.logback.classic.encoder.PatternLayoutEncoder] 17:58:08,066 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 即将实例化 [com.itextpdf.rups.view.DebugAppender] 类型的附加程序 17:58:08,066 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 将附加程序命名为 [TRACE_APP] 17:58:08,067 |-ch.qos.logback.core.joran.action.NestedComplexPropertyIA 中的信息 - 假设 [encoder] 属性的默认类型 [ch.qos.logback.classic.encoder.PatternLayoutEncoder] 17:58:08,069 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 即将实例化类型为 [com.itextpdf.rups.view.StyleAppender] 的附加程序 17:58:08,069 |-ch.qos.logback.core.joran.action.AppenderAction 中的信息 - 将 appender 命名为 [IMPORTANT_APP] 17:58:08,075 |-ch.qos.logback.core.joran.action.NestedComplexPropertyIA 中的信息 - 假设 [encoder] 属性的默认类型 [ch.qos.logback.classic.encoder.PatternLayoutEncoder] 17:58:08,076 |-ch.qos.logback.classic.joran.action.LoggerAction 中的信息 - 将记录器 [com.itextpdf] 的可加性设置为 false 17:58:08,077 |-ch.qos.logback.core.joran.action.AppenderRefAction 中的信息 - 将名为 [IMPORTANT_APP] 的附加程序附加到记录器 [com.itextpdf] 17:58:08,078 |-ch.qos.logback.core.joran.action.AppenderRefAction 中的信息 - 将名为 [INFO_APP] 的附加程序附加到记录器 [com.itextpdf] 17:58:08,078 |-ch.qos.logback.core.joran.action.AppenderRefAction 中的信息 - 将名为 [DEBUG_APP] 的附加程序附加到记录器 [com.itextpdf] 17:58:08,078 |-ch.qos.logback.core.joran.action.AppenderRefAction 中的信息 - 将名为 [TRACE_APP] 的附加程序附加到记录器 [com.itextpdf] 17:58:08,078 |-ch.qos.logback.classic.joran.action.RootLoggerAction 中的信息 - 将 ROOT 记录器的级别设置为 TRACE 17:58:08,078 |-ch.qos.logback.core.joran.action.AppenderRefAction 中的信息 - 将名为 [DEFAULT_APP] 的附加程序附加到记录器 [ROOT] 17:58:08,078 |-ch.qos.logback.classic.joran.action.ConfigurationAction 中的信息 - 配置结束。 17:58:08,082 |-CH.qos.logback.classic.joran.JoranConfigurator@1c24521 中的信息 - 将当前配置注册为安全后备点编号:02A pdfDocToWrite.numberOfPages:2 03A com.itextpdf.kernel.pdf.PdfPage@11aa95a 编号:03A pdfDocToWrite.numberOfPages:4 03B com.itextpdf.kernel.pdf.PdfPage@bc05a6 编号:03B pdfDocToWrite.numberOfPages:6 03C com.itextpdf.kernel.pdf.PdfPage@ef309d 编号:03C pdfDocToWrite.numberOfPages:8 04A com.itextpdf.kernel.pdf.PdfPage@1fc609f 编号:04A pdfDocToWrite.numberOfPages : 10 08A com.itextpdf.kernel.pdf.PdfPage@173813a 编号:08A pdfDocToWrite.numberOfPages : 12
已添加号码!
进程以退出代码 0 结束
编辑: 我在 Dropbox 上上传了一个模拟文档和一个编辑过的文档,这里是: Simulated doc
【问题讨论】:
-
为什么要复制 pdf 页面以进行编号?看起来您的图像与新内容重叠。您能说出您到底想要实现什么吗?
-
@SasiKathimanda 是的,我必须先复制一份文件并手动编号,然后才能分发到不同的部门。因此,我将文档扫描为 pdf 文件,然后使用此代码自动为文档编号。这样可以节省很多时间。
-
对了,复制的策略是什么?我的意思是你是否复制页面取决于 src 文件中的页数。你能附上src文件吗?并发布控制台输出。
-
@SasiKathimanda 我已将控制台输出添加到问题中。我不知道怎么附加src文件,而且它在公司里是分类的。我扫描后文件有两页。第一页是我文档的正面,第二页是背面。我将这两页复制 6 次,但只需要在前面的 page(1, 3, 5, 7, 9, 11) 中添加数字。之后我可以进行双面打印,无需手动编号。
-
如果您有一个“已清理”的文件(没有机密信息)可以重现该问题,请将文件放在 Dropbox 等文件共享服务上并在此处共享链接。