【发布时间】:2018-02-02 19:14:24
【问题描述】:
我有一份 pdf 保险文件,现在每个条款都在单独的页面上。我想获取包含短子句的页面并将它们与其他页面合并到一个页面中。
我在这里传递代表 2 页的文件。我试图了解如何使用一些测试代码来做到这一点的机制。
我想将这两个页面读入一个新的目标页面并返回。
我不想更改原始内容的比例,但如果我不使用 ConcatMatrix 进行转换,那么它根本不会显示任何内容。
在这里我可以在一页中看到两个页面的内容,但是它们太小了。我只是在将参数放入 AddXObject 中。参数取 a,b,c,d 等,那么你怎么知道哪些是 x,y,height,width..?
public byte[] ManipulatePdf(byte[] file)
{
byte[] result;
using (var ms = new MemoryStream())
{
PdfDocument pdf = new PdfDocument(new PdfWriter(ms));
PdfDocument sourcePdf = new PdfDocument(new PdfReader(new MemoryStream(file)));
var pages = sourcePdf.GetNumberOfPages();
PageSize nUpPageSize = PageSize.A4;
PdfPage targetPage = pdf.AddNewPage(nUpPageSize);
PdfCanvas canvas = new PdfCanvas(targetPage);
//if we remove ConcatMatrix we get nothing
//otherwise it appears too small
for (int i = 1; i <= pages; i++)
{
PdfPage currentPage = sourcePdf.GetPage(i);
Rectangle orig = targetPage.GetPageSize();
var width = nUpPageSize.GetWidth() / orig.GetWidth() / 2f;
var height = nUpPageSize.GetHeight() / orig.GetHeight() / 2f;
AffineTransform transformationMatrix = AffineTransform.GetScaleInstance(
width, height);
canvas.ConcatMatrix(transformationMatrix);
var height1 = orig.GetHeight();
var width2 = orig.GetWidth() / 2;
var height2 = orig.GetHeight() / 2;
PdfFormXObject pageCopy = currentPage.CopyAsFormXObject(pdf);
if (i == 1)
canvas.AddXObject(pageCopy, 0, height1);
else
canvas.AddXObject(pageCopy,0, 1200);
}
// close the documents
pdf.Close();
sourcePdf.Close();
canvas.Release();
result = ms.GetBuffer();
}
return result;
}
【问题讨论】:
-
AddXObject调用在此处将它们各自的pageCopy添加到页面上边框之外。