如何解决使用iTextSharp克服200英寸Adobe Adobe错误
我正在将多页(分页)的pdf文档转换为单页(非分页)的pdf文档。 我希望克服Adobe Reader中200英寸的限制。
使用iTextSharp.PdfReader读取每一页,以创建目标文档的总高度并找到最大宽度。
创建文档的代码可以直接从分页的pdf读取到非分页的pdf。使用Chrome或Foxit可以正常打开文件。当页面超过200英寸时,Adobe将截断200英寸。在我的测试文件中,页面高度为8.25 x 814英寸。
将UserUnits更改为4.07(814/200),Adobe将页面高度显示为814in,但仍将页面截断并显示宽度为33。
如果目标文件的宽度设置为width / userunits(8.25 / 4.07),则目标文件中仅剩下2英寸。
代码的复制部分:
RandomAccessFileOrArray ra = new RandomAccessFileOrArray(fn);
SizeF pageSize = new SizeF(pageWidth,pageHeight);
float USERUnitNewValue = ComputeUserUnit(pageSize);
if (pageHeight > 14400f)
{
USERUnitNewValue = pageHeight / 14400f;
}
float NewPageWidth = (pageWidth <= 14400f) ? pageWidth : pageWidth* USERUnitNewValue;
float NewPageHeight = pageHeight * USERUnitNewValue;
FileInfo file1 = new FileInfo(newfn);
DirectoryInfo directory1 = file1.Directory;
if (!directory1.Exists)
directory1.Create();
iTextSharp.text.Rectangle newPagesize = new iTextSharp.text.Rectangle(pageWidth,pageHeight);
Document newPdf = new Document(newPagesize);
PdfWriter writer = PdfWriter.GetInstance(newPdf,new FileStream(newfn,FileMode.Create));
writer.PdfVersion = PdfWriter.VERSION_1_6;
if (pageHeight > 14400)
{
writer.Userunit = USERUnitNewValue;
}
newPdf.SetMargins(0f,0f,0f);
newPdf.Open();
PdfContentByte cb = writer.DirectContent;
float verticalPosition = pageHeight;
for (int pagenumber = 1; pagenumber <= n1; pagenumber++)
{
if (pdfReader.NumberOfPages >= pagenumber)
{
verticalPosition = verticalPosition - pdfReader.GetPageSize(pagenumber).Height;
cb.AddTemplate(writer.GetImportedPage(pdfReader,pagenumber),verticalPosition);
}
else
{
break;
}
}
newPdf.Close();
如何将原始文件复制到目标中,如果有人将其发送到打印机,这两个文件将保持相同的大小?
是的,此代码中有些冗余,因为我已经对此进行了一段时间的故障排除。
这里的关键问题是一个设置,该设置将保持8.25 x 814英寸的大小,并且仍允许Adobe打开文件。
谢谢
迈克
解决方法
谢谢大卫。 浏览Lowagie先生的文档和有关addTemplate的简要说明之后。 cb.addTemplate(页面,比例尺,0、0,比例尺,0、0) 该代码已更新,以利用新的用户单元和扩展。
立即在Adobe中打开并按预期报告页面长度
再次,代码仍然有点丑陋
RandomAccessFileOrArray ra = new RandomAccessFileOrArray(fn);
SizeF pageSize = GetPageSize(fn);
PdfReader pdfReader = new PdfReader(fn);
float USERUnitNewValue = ComputeUserUnit(pageSize);
int n1 = pdfReader.NumberOfPages;
if (pageSize.Height > 14400f) //14400 value is 72 pixels per inch over 200 inches. 200 inches seems to be adobe limit to a page
{ //determine the userunit to be used
USERUnitNewValue = pageSize.Height / 14400f;
}
float NewPageWidth = (pageSize.Width <= 14400f) ? pageSize.Width / USERUnitNewValue : pageSize.Width / USERUnitNewValue;
float NewPageHeight = pageSize.Height / USERUnitNewValue;
FileInfo file1 = new FileInfo(newfn);
DirectoryInfo directory1 = file1.Directory;
if (!directory1.Exists)
directory1.Create();
iTextSharp.text.Rectangle newPagesize = new iTextSharp.text.Rectangle(NewPageWidth,NewPageHeight);
Document newPdf = new Document(newPagesize);
PdfWriter writer = PdfWriter.GetInstance(newPdf,new FileStream(newfn,FileMode.Create));
writer.PdfVersion = PdfWriter.VERSION_1_6;
if (pageSize.Height > 14400)
{
writer.Userunit = USERUnitNewValue;
}
newPdf.SetMargins(0f,0f,0f);
newPdf.Open();
PdfContentByte cb = writer.DirectContent;
float verticalPosition = NewPageHeight;
for (int pagenumber = 1; pagenumber <= n1; pagenumber++)
{
if (pdfReader.NumberOfPages >= pagenumber)
{
/*convoluted page position. First position should be 0,0
unlike other counters this starts as page 1 so we need to subtract the
first page height away so that we start at the bottom of the previous image
* hmm seems that ths AddTemplate feature adds the pages in reverse order or
* at least the coordinate system sets 0,0 at the bottom left of the page
*/
float widthfactor = 1 / USERUnitNewValue; //Page scaling (width)
float heightfactor = 1 / USERUnitNewValue; //Page scaling (height)
//vertical position needs to take into account the new page height taking new UserUnit in affect
verticalPosition = verticalPosition - (pdfReader.GetPageSize(pagenumber).Height / USERUnitNewValue);
cb.AddTemplate(writer.GetImportedPage(pdfReader,pagenumber),heightfactor,widthfactor,verticalPosition);
}
else
{
break;
}
}
newPdf.Close();
再次感谢您的帮助, 迈克
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。