【发布时间】:2022-11-25 07:36:41
【问题描述】:
我想顺时针旋转一个pdf文件并保留页面旋转的框。官方示例代码:
PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
for (int p = 1; p <= pdfDoc.GetNumberOfPages(); p++)
{
PdfPage page = pdfDoc.GetPage(p);
int rotate = page.GetRotation();
if (rotate == 0) {
page.SetRotation(90);
}
else
{
page.SetRotation((rotate + 90) % 360);
}
}
pdfDoc.Close();
貌似每页只设置一个旋转数据,我要旋转,保持Rotation=0。
string src = @"-x-y_28P_src.pdf";
string targetFPath = @"-x-y_28P_real_rotated.pdf";
using (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(targetFPath)))
using (PdfDocument origPdf = new PdfDocument(new PdfReader(src)))
{
pdfDoc.GetWriter().SetSmartMode(true);
int pageCount = origPdf.GetNumberOfPages();
for (int i = 1; i <= pageCount; i++)
{
PdfPage origPage = origPdf.GetPage(i);
var pageCopy = origPage.CopyAsFormXObject(pdfDoc);
var mediaBox = origPage.GetMediaBox();//x = -8.5,y=-8.5
var cropBox = origPage.GetCropBox();
var trimBox = origPage.GetTrimBox();
var mediaRect90 = new Rectangle(0, 0, mediaBox.GetHeight(), mediaBox.GetWidth());//media:0,0,h,w,data from pdfinfo of xpdf.
var page = pdfDoc.AddNewPage(new PageSize(mediaRect90));//media:0,0,h,w
var canvas = new PdfCanvas(page);
canvas.AddXObject(pageCopy, 0, -1, 1, 0, 0 - mediaBox.GetBottom(), mediaBox.GetRight());//Clockwise
var cropbox = new Rectangle(0, 0, cropBox.GetHeight(), cropBox.GetWidth());
page.SetCropBox(cropbox);
var trimbox = new Rectangle(-mediaBox.GetBottom(), -mediaBox.GetLeft(), trimBox.GetHeight(), trimBox.GetWidth());
page.SetTrimBox(trimbox);//important
}
}
对于the other file,无论我怎么尝试都无法得到the correct result。
另外,我实现的方法好像有点复杂。
有什么办法可以处理吗。
【问题讨论】:
-
@mkl 有什么办法吗?
-
@zhusp“有什么办法吗?”- 当然有。但是完整的通用解决方案显然很重要,尤其是在涉及注释和目的地的情况下。
-
谢谢您的回复!如果我们不考虑注释和目的地,只应用一个矩阵?
-
@zhusp 如果我记得有些方法可以将大多数对象转换为新鲜的,但简单的矩阵转换是观众正在做的简单地旋转可以保存为页面视图旋转的视角,因此对于每个源案例都可以不同于旋转操作来自 qpdf“无法保证实际页面内容本身不会以旋转方式绘制,在这种情况下,将旋转重置为 0 不一定会使页面看起来直立。您可以为每个页面提取旋转信息”