我使用ASP.NET(Framework 3.5)和Crystal Reports以PDF文件生成我学院学生的身份证但是我想在透明工作表中打印这些卡并将其粘贴到相同大小的塑料卡上我需要将所有内容打印成镜像。 我尝试以镜像形式设计水晶报告,但无法找到以镜像形式编写文本的方法。任何人都可以建议一种方法来完成这项工作我想要的是翻转PDF文件或Crystal Report中的内容。
答案 0 :(得分:0)
一些想法:
1)将PDF渲染为图像(使用Ghostscript / ImageMagick或商业PDF库((例如Tif)并镜像图像进行打印
2)使用iTextSharp
可以实现PDF本身的镜像3)使用报告工具并尝试使用某种反向字体(可以快速选择)
答案 1 :(得分:0)
任何允许您导入页面并直接写入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()
页面大小与当前PdfImportedPage
的大小匹配。一些解决方法:
// 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);
公平警告:我的2D矩阵并不是那么强大。我几乎肯定做错了什么。调试这些东西是一个真正的PITA。东西要么“看起来正确”,要么完全搞砸了它的页面(ergo看不见,所以你不知道它走了哪条路)。我经常将页面矩形更改为[-1000 -1000 1000 1000],这样我才能看到它的全部内容。有趣的东西。
至于复制注释等......哎哟。 PdfCopy通过它的addPage()
方法为您完成所有这些工作,但这不允许您首先转换页面内容。您对PdfImportedPage所做的任何更改都将被忽略。你真的坚持使用The Hard Way ...手动复制所有繁琐的部分并更改它们以补偿翻转的页面......或者将源代码弄到addPage()
以获得你想要的结果。两者都需要一些深入的PDF知识。
鉴于具体情况,你可能不需要担心它,但值得一提的是,如果有不同情况的人出现同样的目标。