使用 ItextSharp 将 pdf 精确等于一半
本文关键字:于一半 一半 ItextSharp pdf 使用 | 更新日期: 2023-09-27 18:34:51
我试图将PDF分成两半相等,将它们保存为"LeftPDF.pdf"和"RightPDF.pdf"。
我尝试了下面的代码,但它不起作用:
PdfReader reader = new PdfReader(filepath);
int n = reader.NumberOfPages;
iTextSharp.text.Rectangle psize = reader.GetPageSize(1);
float width = psize.Width/2;
float height = psize.Height;
Document document = new Document(psize);
// target.pdf is A5 Portrait format
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(splitpath, FileMode.Create));
document.Open();
PdfContentByte cb = writer.DirectContent;
document.NewPage();
PdfImportedPage page1 =writer.GetImportedPage(reader, 1);
cb.AddTemplate(page1, 1, 0, 0, 1, 0, 0);
document.Close();
我该怎么做?
正如我在评论中指出的那样,您的问题之前已经发布并回答过。这是您问题的另一个重复:将一页PDF文件分成两页PDF文件
仔细看看 TileInTwo 示例:
public void manipulatePdf(String src, String dest)
throws IOException, DocumentException {
// Creating a reader
PdfReader reader = new PdfReader(src);
int n = reader.getNumberOfPages();
// step 1
Rectangle mediabox = new Rectangle(getHalfPageSize(reader.getPageSizeWithRotation(1)));
Document document = new Document(mediabox);
// step 2
PdfWriter writer
= PdfWriter.getInstance(document, new FileOutputStream(dest));
// step 3
document.open();
// step 4
PdfContentByte content = writer.getDirectContent();
PdfImportedPage page;
int i = 1;
while (true) {
page = writer.getImportedPage(reader, i);
content.addTemplate(page, 0, -mediabox.getHeight());
document.newPage();
content.addTemplate(page, 0, 0);
if (++i > n)
break;
mediabox = new Rectangle(getHalfPageSize(reader.getPageSizeWithRotation(i)));
document.setPageSize(mediabox);
document.newPage();
}
// step 5
document.close();
reader.close();
}
public Rectangle getHalfPageSize(Rectangle pagesize) {
float width = pagesize.getWidth();
float height = pagesize.getHeight();
return new Rectangle(width, height / 2);
}
在此示例中,我们向PdfReader
实例询问第一页的页面大小,并创建一个宽度相同且高度只有一半的新矩形。
然后,我们导入文档中的每个页面,并在不同的页面上添加两次:
- 一次在奇数页上以负
y
值显示原始页面的上半部分, - 一次在偶数页上,
y = 0
显示原始页面的下半部分。
由于原始文档中的每一页都可以有不同的大小,我们可能需要更改每新几页的页面大小。
本示例将一页一分为二,上半部分和下半部分。 使用简单的数学运算,您可以调整示例,将其切成两半,左部分和右部分。这是在示例 TileInTwo2 中完成的:
例如:
public void manipulatePdf(String src, String dest)
throws IOException, DocumentException {
// Creating a reader
PdfReader reader = new PdfReader(src);
int n = reader.getNumberOfPages();
// step 1
Rectangle mediabox = new Rectangle(getHalfPageSize(reader.getPageSizeWithRotation(1)));
Document document = new Document(mediabox);
// step 2
PdfWriter writer
= PdfWriter.getInstance(document, new FileOutputStream(dest));
// step 3
document.open();
// step 4
PdfContentByte content = writer.getDirectContent();
PdfImportedPage page;
int i = 1;
while (true) {
page = writer.getImportedPage(reader, i);
content.addTemplate(page, 0, 0);
document.newPage();
content.addTemplate(page, -mediabox.getWidth(), 0);
if (++i > n)
break;
mediabox = new Rectangle(getHalfPageSize(reader.getPageSizeWithRotation(i)));
document.setPageSize(mediabox);
document.newPage();
}
// step 5
document.close();
reader.close();
}
public Rectangle getHalfPageSize(Rectangle pagesize) {
float width = pagesize.getWidth();
float height = pagesize.getHeight();
return new Rectangle(width / 2, height);
}
调整此示例应该没有问题,以便创建不同的PDF文档,而不是包含左侧和右侧的文档。如果这对您有问题,请发布另一个问题。