- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个 .pdf 文件,然后以彩色写入。通过控制台,我已经能够使用 ansi 转义序列来做到这一点。例如,如果我想要红色,我将 "\u001b[31m"
放在字符串前面,然后将 "\u001b[0m"
删除所有格式。您可以更改背景和前景。我围绕此设计了自己的有用类,以帮助显示信息,甚至对于我仍在开发的基于文本的国际象棋项目也是如此。
但是,现在我想用颜色写入文件。我想做与 ansi 转义类似的事情,但可能不会使用转义。
如果我想在 .pdf 中创建颜色,我该怎么做(不使用外部来源)?有人能指出我正确的方向吗?
最佳答案
这里是一个非常非常简单的 PDF 创建类的快速破解,它除了在彩色背景上以彩色编写 Courier 文本之外什么也做不了:
public class SimplePdfCreator
{
/**
* Creates a {@link SimplePdfCreator} instance writing to the
* given {@link OutputStream}.
*/
public SimplePdfCreator(OutputStream os) throws IOException
{
pdfOs = os instanceof BufferedOutputStream ? (BufferedOutputStream) os : new BufferedOutputStream(os);
writeHeader();
fontObjectNr = writeFont();
initPage();
}
/**
* Sets the (fill) color for the upcoming operations on the current page.
*/
public void color(float r, float g, float b)
{
pageBuilder.append(r)
.append(' ')
.append(g)
.append(' ')
.append(b)
.append(" rg\n");
}
/**
* Sets the background (fill) color for the upcoming operations on the current page.
*/
public void backColor(float r, float g, float b)
{
backBuilder.append(r)
.append(' ')
.append(g)
.append(' ')
.append(b)
.append(" rg\n");
}
/**
* Prints the given text on a baseline starting at the given coordinates
* on the current page.
*/
public void print(int x, int y, String string)
{
pageBuilder.append(x - xNow)
.append(' ')
.append(y - yNow)
.append(" Td (")
.append(string)
.append(") Tj\n");
xNow = x;
yNow = y;
fillBack(string);
}
/**
* Prints the given text on the next line on the current page.
*/
public void print(String string)
{
pageBuilder.append("(")
.append(string)
.append(") '\n");
yNow -= leading;
fillBack(string);
}
/**
* Stores the current page with the printed content in the output
* and creates a new one.
*/
public void storePage() throws IOException
{
writePageContent();
initPage();
}
/**
* Returns the width of the given String.
*/
public double getStringWidth(String string)
{
return string.length() * fontSize * .6;
}
/**
* Returns the font size
*/
public int getFontSize()
{
return fontSize;
}
/**
* Returns the leading
*/
public int getLeading()
{
return leading;
}
/**
* Finishes the output writing required data to it and closing the
* target {@link OutputStream}.
*/
public void close() throws IOException
{
int pagesObjectNr = writePages();
int catalogObjectNr = writeCatalog(pagesObjectNr);
long xrefPosition = writeXref();
writeTrailer(catalogObjectNr);
writeFooter(xrefPosition);
pdfOs.close();;
}
//
// helper methods
//
void writeHeader() throws IOException
{
write("%PDF-1.4\n".getBytes(charSet));
write(new byte[]{'%', (byte)128, (byte)129, (byte)130, '\n'});
}
int writeFont() throws IOException
{
return writeObject("<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>>\n".getBytes(charSet));
}
void initPage()
{
pageBuilder.setLength(0);
backBuilder.setLength(0);
pageBuilder.append("BT/F0 ")
.append(fontSize)
.append(" Tf ")
.append(leading)
.append(" TL 0 g\n");
backBuilder.append("1 g\n");
xNow = 0;
yNow = 0;
}
void fillBack(String string)
{
backBuilder.append(xNow)
.append(' ')
.append(yNow - leading*.2)
.append(' ')
.append(getStringWidth(string))
.append(' ')
.append(leading)
.append(" re f\n");
}
void writePageContent() throws IOException
{
pageBuilder.append("ET\n");
StringBuilder contents = new StringBuilder();
contents.append("<</Length ")
.append(pageBuilder.length() + backBuilder.length())
.append(">>\nstream\n")
.append(backBuilder)
.append(pageBuilder)
.append("\nendstream\n");
int contentsObjectNr = writeObject(contents.toString().getBytes(charSet));
pageContentsObjects.add(contentsObjectNr);
}
int writePages() throws IOException
{
int pagesObjectNrToBe = xref.size() + pageContentsObjects.size() + 1;
StringBuilder pages = new StringBuilder();
pages.append("<</Type /Pages /Count ")
.append(pageContentsObjects.size())
.append("/Kids[");
for (int pageContentObject : pageContentsObjects)
{
int pageObjectNr = writeObject(String.format("<</Type/Page/Parent %s 0 R/Contents %s 0 R>>\n", pagesObjectNrToBe, pageContentObject).getBytes(charSet));
pages.append(pageObjectNr).append(" 0 R ");
}
pages.append("]/Resources<</ProcSet[/PDF/Text]/Font<</F0 ")
.append(fontObjectNr)
.append(" 0 R>>>>/MediaBox[0 0 612 792]>>\n");
return writeObject(pages.toString().getBytes(charSet));
}
int writeCatalog(int pagesObjectNr) throws IOException
{
return writeObject(String.format("<</Type/Catalog/Pages %s 0 R>>\n", pagesObjectNr).getBytes(charSet));
}
long writeXref() throws IOException
{
long xrefPos = position;
byte[] eol = new byte[]{'\n'};
write("xref\n".getBytes(charSet));
write(String.format("0 %s\n", xref.size() + 1).getBytes(charSet));
write("0000000000 65535 f ".getBytes(charSet));
write(eol);
for(long position: xref)
{
write(String.format("%010d 00000 n ", position).getBytes(charSet));
write(eol);
}
return xrefPos;
}
void writeTrailer(int catalogObjectNr) throws IOException
{
write(String.format("trailer\n<</Size %s/Root %s 0 R>>\n", xref.size() + 1, catalogObjectNr).getBytes(charSet));
}
void writeFooter(long xrefPosition) throws IOException
{
write(String.format("startxref\n%s\n%%%%EOF\n", xrefPosition).getBytes(charSet));
}
int writeObject(byte[] bytes) throws IOException
{
int objectNr = startObject();
write(bytes);
endObj();
return objectNr;
}
int startObject() throws IOException
{
xref.add(position);
int objectNr = xref.size();
write(String.format("%s 0 obj\n", objectNr).getBytes(charSet));
return objectNr;
}
void endObj() throws IOException
{
write("endobj\n".getBytes(charSet));
}
long write(byte[] bytes) throws IOException
{
if (bytes != null)
{
pdfOs.write(bytes);
position += bytes.length;
}
return position;
}
final BufferedOutputStream pdfOs;
final Charset charSet = Charset.forName("ISO-8859-1");
final List<Long> xref = new ArrayList<Long>();
final List<Integer> pageContentsObjects = new ArrayList<Integer>();
final StringBuilder pageBuilder = new StringBuilder();
final StringBuilder backBuilder = new StringBuilder();
final int fontObjectNr;
long position = 0;
int xNow = 0;
int yNow = 0;
int fontSize = 11;
int leading = 11;
}
你可以像这样使用它:
public void test() throws IOException
{
SimplePdfCreator creator = new SimplePdfCreator(new FileOutputStream("target/test-outputs/SimpleGenerated.pdf"));
creator.print(100, 500, "Test line 1");
creator.print("Test line 2");
creator.color(1, 0, 0);
creator.backColor(0, 1, 1);
creator.print(100, 450, "Test line red");
creator.color(0, 1, 0);
creator.backColor(1, 0, 1);
creator.print("Test line green");
creator.color(0, 0, 1);
creator.backColor(1, 1, 0);
creator.print("Test line blue");
creator.color(1, 1, 1);
creator.backColor(0, 0, 0);
creator.print(100, 400, "step");
creator.print(100 + (int)creator.getStringWidth("step"), 400 - creator.getLeading(), "by");
creator.print(100 + (int)creator.getStringWidth("stepby"), 400 - 2 * creator.getLeading(), "step");
creator.storePage();
creator.print(100, 400, "Page 2");
creator.storePage();
creator.close();
}
这创造了这个:
请记住,如上所述,这是一个快速破解,也许是概念验证,并且还有很多需要改进的地方,例如坐标可能应该是 double 而不是 int,在添加到内容之前应对字符串进行转义(特别是关于括号,...
关于Java 用颜色写入 .pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25166533/
我正在阅读 java swing,但在理解它时遇到问题。 Color 是一个类吗? Color[] col= {Color.RED,Color.BLUE}; 这在java中是什么意思? 最佳答案 Is
我正在研究用 python 编写的 pacman 程序。其中一个模块是处理吃 bean 游戏的图形表示。这当然是一些主机颜色。列表如下: GHOST_COLORS = [] ## establishe
本网站:http://pamplonaenglishteacher.com 源代码在这里:https://github.com/Yorkshireman/pamplona_english_teache
我最近将我的手机更新为 Android Marshmallow 并在其上运行了我现有的应用程序,但注意到颜色行为有所不同:将更改应用到 View (可绘制)的背景时,共享相同背景的所有 View (引
所有 X11/w3c 颜色代码在 Android XML 资源文件格式中是什么样的? I know this looks a tad ridiculous as a question, but giv
试图让 ffmpeg 创建音频波形,同时能够控制图像大小、颜色和幅度。我已经尝试过这个(以及许多变体),但它只是返回无与伦比的 "。 ffmpeg -i input -filter_complex "
我很好奇你是否有一些关于 R 中颜色酿造的技巧,对于许多独特的颜色,以某种方式使图表仍然好看。 我需要大量独特的颜色(至少 24 种,可能需要更多,~50 种)用于堆叠区域图(所以不是热图,渐变色不起
我看到的许多 WPF 示例和示例似乎都有硬编码的颜色。这些指南 - http://msdn.microsoft.com/en-us/library/aa350483.aspx建议不要硬编码颜色。在构建
我想更改文件夹的默认蓝色 如何设置? 最佳答案 :hi Directory guifg=#FF0000 ctermfg=red 关于Vim NERDTree 颜色,我们在Stack Overflow上
是否有关于如何将任意字符串哈希为 RGB 颜色值的最佳实践?或者更一般地说:3 个字节。 你问:我什么时候需要这个?这对我来说并不重要,但想象一下任何 GitHub 上的那些管图 network pa
我正在尝试将默认颜色设置为自定义窗口小部件。 这是有问题的代码。 class ReusableCard extends StatelessWidget { ReusableCard({this.
import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.Ta
我有一个 less 文件来定义一堆颜色/颜色。每个类名都包含相关颜色的名称,例如 .colourOrange{..} 或 .colourBorderOrange{..} 或 navLeftButtOr
我有一个RelativeLayout,我需要一个黑色背景和一个位于其中间的小图像。我使用了这段代码: 其中@drawable/bottom_box_back是: 这样我就可以将图像居中了。但背
我需要设置 浅色 的 JPanel 背景,只是为了不覆盖文本(粗体黑色)。 此刻我有这个: import java.util.Random; .... private Random random =
我正在尝试制作一个自定义文本编辑器,可以更改特定键入单词的字体和颜色。如何更改使用光标突出显示的文本的字体和/或颜色? 我还没有尝试过突出显示部分。我尝试获取整个 hEdit(HWND) 区域并更改字
我想改变我整个应用程序的颜色。 在我的 AndroidManfiest.xml 中,我有正确的代码: 在 values 文件夹中,我有 app_theme.xml: @style/MyAc
是否可以使用 android 数据绑定(bind)从 xml 中引用颜色? 这很好用: android:textColor="@{inputValue == null ? 0xFFFBC02D : 0
有没有办法在 Android 应用程序中设置“空心”颜色? 我的意思是我想要一个带有某种背景的框,而文本实际上会导致背景透明。换句话说,如果整个 View 在蓝色背景上,文本将是蓝色的,如果它是红色的
我用CGContextStrokePath画在白色背景图片中的一条直线上,描边颜色为红色,alpha为1.0画线后,为什么点不是(255, 0, 0),而是(255, 96, 96)为什么不是纯红色?
我是一名优秀的程序员,十分优秀!