我使用ASP.NET (Framework3.5)和水晶报表在一个PDF文件中生成我的学院的学生身份证,但我想打印在一个透明的工作表,并粘贴在一个相同大小的塑料卡上,我需要的一切都打印镜像。我试着用镜像形式设计水晶报表,但找不到一种用镜像形式书写文本的方法。谁能建议一种方法来做这项工作,所有我想要的是翻转PDF文件或在水晶报告的内容。
发布于 2011-03-30 16:33:34
以下是几个想法:
1)将PDF渲染为图像(使用Ghostscript/ImageMagick或商业PDF库(例如Tif)并镜像图像以进行打印
2)镜像PDF本身,也许可以使用iTextSharp
3)使用报告工具,并尝试使用某种反转字体(可以是快速选项)
发布于 2011-03-31 04:42:30
任何允许您导入页面并直接写入PDF内容流的API都将允许您这样做。
在iText (Java)中,它看起来像这样:
PdfReader reader = new PdfReader(pdfPath);
Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance( doc, new FileOutputStream(outPath) );
for (int pageNum = 1; pageNum <= reader.getNumberOfPages(); ++pageNum) {
PdfImportedPage page = writer.getImportedPage(reader, pageNum);
PdfContentByte pageContent = writer.getDirectContent();
// flip around vertical axis
pageContent.addTemplate(page, 1f, 0f, 0f, -1f, page.getWidth(), 0f);
doc.newPage();
}上面的代码做了以下的修改:
Document()页面大小与当前未旋转的源页面的大小匹配。一些解决方法:
// keep the page size consistent
PdfImportedPage page = writer.getImportedPage(reader, pageNum);
doc.newPage(page.getBoundingBox());
PdfContentByte pageContent = writer.getDirectContent();
pageContent.addTemplate(...);
// to compensate for a page's rotation, you need to either rotate the target page
// Easy in PdfStamper, virtually impossible with `Document` / `PdfWriter`.
AffineTransform unRotate = AffineTranform.getRotateInstance(degToRad(360 - pageRotation), pageCenterX, pageCenterY)
AffineTransform flip = new AffineTransform(1f, 0f, 0f, -1f, page.getWidth(), 0f);
AffineTransform finalTrans = flip;
finalTrans.concatenate(unRotate);
pageContent.addTemplate(page, finalTrans);警告:我的2维矩阵-fu并不是那么强大。我几乎肯定做错了什么。调试这些东西真的是一件很麻烦的事情。这些东西要么“看起来很好”,要么完全从页面上消失了(因此看不见,所以你不知道它是怎么回事)。我经常将页面矩形更改为-1000 -1000 1000 1000,这样我就可以看到所有内容的去向。有趣的东西。
至于复制注释等等..。唉哟。PdfCopy通过它的addPage()方法为您完成了所有这些工作,但这并不能让您首先转换页面内容。对PdfImportedPage所做的任何更改都将被忽略。你真的被困在了艰难的道路上...手动复制所有繁琐的部分,并对它们进行更改以补偿翻转的页面...或者修改addPage()的源代码以获得您想要的结果。两者都需要对PDF有一些深入的了解。
考虑到细节,你可能不需要担心它,但值得一提的是,如果有人有不同的情况,有相同的目标。
https://stackoverflow.com/questions/5483020
复制相似问题