Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将pdf平铺到带边框的多个页面_C#_Pdf_Itextsharp_Itext - Fatal编程技术网

C# 如何将pdf平铺到带边框的多个页面

C# 如何将pdf平铺到带边框的多个页面,c#,pdf,itextsharp,itext,C#,Pdf,Itextsharp,Itext,使用itextsharp,我试图将一个(大)页面的pdf文档(称为导入文档)平铺到一个新文档中,该页面被拆分为几个DIN A4页面(称为输出文档)。但是我想在输出的DIN A4页面周围画一个边框,只在导入文档中添加一个小于A4大小的部分 有关说明,请参见图片: 左边是A3大小的进口单据,类似于两张A4纸并排(黑色虚线)。应将其拆分为带边框的A4页(右侧)。因为新A4页有边框,所以导入的部分比A4小。因此,A3导入的输出不是2页A4,而是6页。绿线是我想画的边界 我已经得到了什么? 根据这个答案

使用itextsharp,我试图将一个(大)页面的pdf文档(称为导入文档)平铺到一个新文档中,该页面被拆分为几个DIN A4页面(称为输出文档)。但是我想在输出的DIN A4页面周围画一个边框,只在导入文档中添加一个小于A4大小的部分

有关说明,请参见图片:

左边是A3大小的进口单据,类似于两张A4纸并排(黑色虚线)。应将其拆分为带边框的A4页(右侧)。因为新A4页有边框,所以导入的部分比A4小。因此,A3导入的输出不是2页A4,而是6页。绿线是我想画的边界

我已经得到了什么?
根据这个答案,我编写了以下代码(带按钮的WinForm),它已经将pdf从a3正确地平铺到2x A4。(这是通用的,因此输入大小无关紧要):

公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
//A4 210/297毫米
双倍宽度=(21.0/2.54)*72;
双倍高度=(29.7/2.54)*72;
字符串filename=“test\u input\u a3.pdf”;
filename=Path.Combine(Directory.GetCurrentDirectory(),filename);
PdfReader reader=新的PdfReader(文件名);
矩形origPagesize=reader.GetPageSizeWithRotation(1);
矩形newPagesize=新矩形((浮动)宽度,(浮动)高度);
字符串outputFile=Path.Combine(Directory.GetCurrentDirectory(),“output.pdf”);
FileStream ms=newfilestream(outputFile,FileMode.Create);
使用(文档=新文档(newPagesize))
{
PdfWriter writer=PdfWriter.GetInstance(文档,ms);
document.Open();
PdfContentByte content=writer.DirectContent;
PDFIImportedPage=writer.GetImportedPage(读取器,1);
矩形边框=page.BoundingBox;
int countWidth=(int)(origPagesize.Width/newPagesize.Width)+(newPagesize.Width%origPagesize.Width>0?1:0);
int countHeight=(int)(origPagesize.Height/newPagesize.Height)+(newPagesize.Height%origPagesize.Height>0?1:0);
浮动x,y;
对于(int i=0;i
我还能够在页面上绘制边框(不使用代码)。这是微不足道的。但我无法找到一个解决方案,如何在A4页面上平铺小于A4的部分,并将它们放置在边框内


itext文档在方法描述方面非常简短,我无法找到任何有助于解决此问题的方法。例如,一种方法可以提取一个大页面的一部分或类似的内容。

多亏@ChrisHaas在评论中的帮助,他给我指出了一个解决我问题的示例

它扩展了我从stackoverflow答案中得到的代码,为边距位置的内容添加了一个矩形剪辑(在我的例子中是我想要绘制的边框)

因此,我在AddTemplate之前添加了示例中的3条剪裁线,并在所有内容周围添加了一个SaveState和RestoreState,因为我想在后面的空白处绘制:

content.SaveState();
content.Rectangle(margin, margin, newPagesizeInner.Width, newPagesizeInner.Height);
content.Clip();
content.NewPath();

content.AddTemplate(page, x, y);
content.RestoreState();

我没有时间做一个完整的回答,但这可能会给你一些想法。@ChrisHaas我不相信:)。我已经搜索了这么多的例子,我不敢相信我从来没有偶然发现这些。我会试着看看它是否解决了我的问题。谢谢。@ChrisHaas第一个有空白的样品解决了我的问题。你想发布一个答案,然后我可以给你评分吗?太好了@Uwe!不幸的是,在这里发布一个只有链接的答案是不受欢迎的,我没有时间写一个正式的答案。但如果你想用对你有用的东西来回答,那就是!
content.SaveState();
content.Rectangle(margin, margin, newPagesizeInner.Width, newPagesizeInner.Height);
content.Clip();
content.NewPath();

content.AddTemplate(page, x, y);
content.RestoreState();